[Jpa] Dirty Checking
엔티티를 수정하고 repository에서 save를 안했는데 update 쿼리가 발생하는 현상을 본적이 있을 것이다.
이를 더티 체킹이라 하는데 트랜잭션 단위에서 엔티티를 가져와 영속 상태로 만들고 엔티티의 update메서드를 이용해 속성을 변경해준 다음 트랜잭션이 끝나는 시점에 변경을 감지하여 update 쿼리가 동작한다.
다음 코드는 더티 체킹이 동작하는 코드다.
@Transactional
public PostSaveResponseDto updateByIdPost(Long postId, PostUpdateRequestDto postUpdateRequestDto) {
Post post = getEntity(postId);
post.updateEntity(postUpdateRequestDto);
return PostSaveResponseDto.builder().post(post).build();
}
@Transactional 을 붙여 하나의 트랜잭션 묶음으로 만들고 post 객체를 영속 상태로 만들고 update를 합니다. 트랜잭션이 끝나는 시점에서 변화가 있는 엔티티 객체를 db에 반영을 해준다.
변화가 있는 엔티티를 어떤 기준으로 잡을까?
처음에 영속 상태로 만든 객체를 스냅샷으로 만들어 놓고 기준으로 잡는다. 스냅샷과 다른점이 있다면 update 쿼리문이 동작한다.
여기서 update 쿼리를 보면 전체를 업데이트한다. 더티 체킹의 기본 업데이트 방식은 전체 필드를 업데이트를 한다.
지금의 필드는 5개인데 무수히 많은 필드에서 더티 체킹이 발생되면 전체 필드에 대한 업데이트 쿼리가 동작하는데 과연 좋은 방법인가? 원하는 필드만 업데이트 할 순 없을까? → spring data jpa에 이미 만들어져 있다!!!
바로 @DynamicUpdate 애노테이션을 업데이트 할 엔티티에 붙여주면 원하는 속성에 대해 update 쿼리문이 동작한다.
@Getter
@Entity
@DynamicUpdate
@NoArgsConstructor
public class Post {
//....
}
첫 번째 update문과 다르게 원하는 필드에 대해서만 update 쿼리가 동작한 것을 확인할 수 있다.
.
참조 : https://jojoldu.tistory.com/415
더티 체킹 (Dirty Checking)이란?
Spring Data Jpa와 같은 ORM 구현체를 사용하다보면 더티 체킹이란 단어를 종종 듣게 됩니다. 더티 체킹이란 단어를 처음 듣는분들을 몇번 만나게 되어 이번 시간엔 더티 체킹이 무엇인지 알아보겠습
jojoldu.tistory.com