관리 메뉴

피터의 개발이야기

[Kotlin]JPA의 더티 체킹 (Dirty Checking) 본문

Programming/Kotlin

[Kotlin]JPA의 더티 체킹 (Dirty Checking)

기록하는 백앤드개발자 2024. 7. 28. 10:10
반응형

ㅁ 들어가며

  JPA의 더티 체킹(Dirty Checking)은 엔티티의 상태 변화를 자동으로 감지하여 데이터베이스에 반영하는 기능이다. 이는 엔티티 매니저가 관리하는 엔티티 객체의 상태를 지속적으로 모니터링하고, 트랜잭션이 끝날 때 변경된 부분만 업데이트 쿼리로 반영하는 방식으로 동작한다.

 

ㅁ 동작원리

자바 JPA 프로그래밍-김영한, 104p

엔티티 상태 관리

 - 엔티티 매니저는 영속성 컨텍스트(Persistence Context) 내의 엔티티 객체를 관리한다.
 - 엔티티가 영속성 컨텍스트에 들어오면, JPA는 해당 엔티티의 스냅샷을 저장한다

 

변경 감지

 - 트랜잭션이 진행되는 동안, 애플리케이션 코드에서 엔티티의 속성을 변경하면 JPA는 엔티티의 현재 상태와 스냅샷을 비교한다.
 - 변경된 부분이 있으면 이를 감지하여 더티 상태로 표시한다.

 

트랜잭션 커밋
 - 트랜잭션이 커밋될 때, JPA는 더티 상태로 표시된 엔티티를 찾아 변경된 속성만을 포함하는 UPDATE 쿼리를 생성한다.
 - 이 쿼리를 데이터베이스에 전송하여 변경 사항을 반영한다.

 

ㅁ 사용예시

// 엔티티 데이터 클래스
@Entity
data class User(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    val id: Long? = null,
    var name: String,
    var email: String
)

// 서비스 클래스
@Service
class UserService(
    private val userRepository: UserRepository
) {
    @Transactional
    fun updateUser(id: Long, newName: String, newEmail: String) {
        val user = userRepository.findById(id)
        	?: throw EntityNotFoundException("User not found")
        user.name = newName
        user.email = newEmail
        // 더티 체킹에 의해 트랜잭션 커밋 시점에 변경 사항이 자동으로 반영됨
    }
}

ㅇ 개발자가 직접 Update쿼리를 작성하지 않아 코드가 간결해진다.

ㅇ 엔티티의 변경 사항을 자동으로 감지하여 데이터베이스에 반영하므로 쿼리를 직접 헨들링 할 때보다 실수할 가능성이 줄어든다.

ㅇ 하지만 주의할 점도 있다.

  ㄴ 영속성 컨텍스트가 많아지면 스냅샷이 많아져서 메모리 사용량이 증가할 수 있다.

  ㄴ 트랜잭션이 길어질 경우 변경 감지 작업이 지속적으로 프로세스를 잡고 있어 성능에 영향이 미칠 수 있다.

ㅇ 이런 점을 방지하고 원하는 시점에 데이터를 반영하기 위해 'EntityManager.flush()' 기능이 존재한다.

 

ㅁ 마무리

  JPA의 더티 체킹은 엔티티의 상태 변화를 자동으로 감지하여 데이터베이스에 반영하는 강력한 기능이다. 이를 통해 개발자는 코드의 간결함과 유지보수성을 높일 수 있으며, 성능 최적화에도 도움을 받을 수 있다. 그러나 영속성 컨텍스트 관리와 트랜잭션 길이에 주의하여 사용해야 한다.

 

ㅁ 함께 보면 좋은 사이트

ㅇ 자바 JPA프로그래밍 - 김영한, 104p

 더티 체킹 (Dirty Checking)이란?

 [JPA] 더티 체킹(dirty checking) 정리

 

 

반응형
Comments