트랜잭션 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베스에 반영하는 JPA의 특징입니다.
Dirty란 "상태의 변화가 생긴 정도"로 이해할 수 있으며, 즉 Dirty Checking이란 상태 변경 검사를 의미합니다.
더티 체킹의 기준
더티 체킹에서 "변화가 있다"의 기준은 최초 조회 상태입니다.
JPA에서는 엔티티를 조회하면 해당 엔티티의 조회 상태 그대로 스냅샷(Snapshot)을 만들어 놓습니다. 그리고 트랜잭션이 끝나는 시점에는 이 스냅샷과 비교해서 다른점이 있다면 Update Query를 데이터베이스로 전달합니다.
당연히 이러한 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용됩니다.
즉, Detach된 엔티티(준영속), DB에 반영되기 전 처음 생성된 엔티티(비영속) 등 준영속/비영속 상태의 엔티티는 더티 체킹 대상에서 제외됩니다. 따라서 값을 변경해도 데이터베이스에 반영되지 않는 것이죠.
변경 부분만 update하고 싶을땐?
JPA에서는 전체 필드를 업데이트하는 방식을 기본값으로 사용하기 때문에, 더티 체킹으로 생성되는 update 쿼리는 기본적으로 모든 필드를 업데이트합니다.
전체 필드를 업데이트하는 방식의 장점은 다음과 같습니다.
- 생성되는 쿼리가 같아 부트 실행시점에 미리 만들어서 재사용 가능하다.
- 데이터베이스 입장에서 쿼리의 재사용이 가능하다. (동일한 쿼리를 받으면 이전에 파싱된 쿼리를 재사용)
다만, 필드의 수가 많은 경우(20 ~ 30개 이상), 이러한 전체 필드 Update 쿼리가 부담스러울 수 있습니다.
그래서 이런 경우엔 `@DynamicUpdate`로 변경 필드만 반영되도록 할 수 있습니다.
엔티티 최상단에 아래와 같이 `@DynamicUpdate`를 선언해주기만 하면 됩니다.
Reference
'Backend > Spring' 카테고리의 다른 글
헥사고날 아키텍처에 대해 알아보았다. (3) | 2025.06.06 |
---|---|
Maven 설치 및 환경변수 설정 (With Intel Mac) (0) | 2025.03.05 |
카카오페이 결제취소 API 서비스에 적용하기 (Spring Boot, Vue.js) (0) | 2025.01.21 |
[스프링 핵심 원리 - 기본편] 객체 지향 설계와 스프링 (0) | 2024.03.21 |
SSE를 사용하여 실시간 알림 기능 구현해보았다. (0) | 2024.03.01 |