일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- IntelliJ
- kotlin coroutine
- MySQL
- CKA
- 코틀린 코루틴의 정석
- aws
- kotlin querydsl
- kotlin
- AWS EKS
- Java
- 오블완
- Spring
- APM
- 공부
- Elasticsearch
- AI
- Kubernetes
- minikube
- CloudWatch
- CKA 기출문제
- 정보처리기사 실기 기출문제
- Pinpoint
- 티스토리챌린지
- kotlin spring
- 기록으로 실력을 쌓자
- mysql 튜닝
- PETERICA
- 정보처리기사 실기
- Linux
- 정보처리기사실기 기출문제
- Today
- Total
피터의 개발이야기
[Kotlin]JPA의 더티 체킹 (Dirty Checking) 본문
ㅁ 들어가며
JPA의 더티 체킹(Dirty Checking)은 엔티티의 상태 변화를 자동으로 감지하여 데이터베이스에 반영하는 기능이다. 이는 엔티티 매니저가 관리하는 엔티티 객체의 상태를 지속적으로 모니터링하고, 트랜잭션이 끝날 때 변경된 부분만 업데이트 쿼리로 반영하는 방식으로 동작한다.
ㅁ 동작원리
ㅇ 엔티티 상태 관리
- 엔티티 매니저는 영속성 컨텍스트(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
ㅇ [JPA] 더티 체킹(dirty checking) 정리
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] Spring Validation 이용한 입력 데이터 유효성 검증 (0) | 2024.07.30 |
---|---|
[kotlin] Constructor threw exception; nested exception is java.lang.NullPointerException; 에러 해결방법 (0) | 2024.07.29 |
[Kotlin] QueryDSL와 MapStruct를 사용하여 DTO에서 필요한 부분만 업데이트하기 (0) | 2024.07.27 |
[Kotlin] Kotlin의 스프레드 연산자 (Spread Operator) 이해하기 (0) | 2024.07.26 |
[Kotlin] Resilience4j로 서킷브레이커 패턴 구현하기 (2) | 2024.07.24 |