Dirty Checking

sseongeun·2025년 1월 14일

스프링

목록 보기
13/13

Dirty Checking이란 무엇인가?

@Transactional로 감싸진 메서드 내에서 특정 필드값을 변경하는 로직이 포함되어있을때,
save()메서드를 호출하지 않아도 JPA가 update 쿼리를 날려 DB에 변경사항을 반영해주는 것

단, Dirty Checking을 하게되면 변경되지 않은 필드에 대해서도 쿼리가 나간다.

즉, 모든 필드에 대해 update쿼리가 발생하게 된다.

예시를 통해 확인해보자

현재 나의 상황은 하나의 recruit(모집글) 조회시, totalView와 updateAt 필드값만 변경되는 상태이다.

이때 발생하는 쿼리를 보면, 모든 필드에 대해 update 쿼리가 나가는 것을 확인할 수 있다.

그렇다면, 내가 원하는 필드에 대해서만 쿼리가 나가게 하고 싶다면 어떻게 해야할까?

=> enetity에 @DynamicUpdate 어노테이션을 붙이면된다.

이렇게 붙이면 쿼리가 다음과 같이 나가는 것을 확인할 수 있다.


=> 내가 의도한 totalView와 UpdatedAt 필드값에 대해서만 update가 실행된다.

물론 @DynamicUpdate가 마냥 좋은 것만은 아니다!

주기적으로 동일한 sql쿼리가 반복 수행되면, SQL실행 계획(sql execution plan)은 캐싱되어 수행된다.
즉, 반복적으로 발생하는 sql쿼리는 캐싱되어있는 쿼리를사용하는 것이다.

만약 @DynamicUpdate를 붙인다면,
매번 변경이 일어나는 필드에 대해서만 Update쿼리가 나가면서 sql문이 달라지게된다.
즉, 캐싱되어있는 sql문을 사용하지 못할 수도 있다는 것!

따라서 쿼리의 형태가 매번 동일하면서, 엔티티의 필드 값이 많으면서, 전체 필드에 대해 update쿼리가 발생하지 않았으면 할 때에만 @DynamicUpdate를 사용하자!

profile
공부 기록...

0개의 댓글