엔티티를 수정하고 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
'JPA' 카테고리의 다른 글
[Jpa] Cascade (0) | 2022.08.07 |
---|---|
[Jpa] Transaction Propagation (0) | 2022.08.06 |
[Jpa] Transaction Scope and Isolation (0) | 2022.08.05 |
[Jpa] Deprecated 된 getById() 대안 getReferenceById() (0) | 2022.08.02 |
[Jpa] Projections (0) | 2022.07.18 |
[Spring JPA] 트랜잭션은 언체크, 체크 예외에 대해 어떻게 커밋과 롤백을 처리할까? (1) | 2022.05.18 |
[Spring JPA] CASCADE 는 무엇일까? (0) | 2022.05.15 |
[Spring JPA] N + 1의 문제점이 무엇이고 어떻게 해결 해야할까? (0) | 2022.05.15 |