본문 바로가기
Spring

[JPA] 더티체킹

by runlearn 2023. 9. 11.

더티체킹이란 트랜잭션이 끝날 때 엔티티의 변경을 감지하여 DB에 flush하는 것을 의미한다.
최초 조회 상태와 커밋상태를 비교하여 변경된 것이 있다면 수정한다.
따라서 영속성 컨텍스트가 관리하는 엔티티의 경우에만 더티체킹이 적용된다.
준영속(Detach), 비영속(DB반영 전) 상태의 경우 더티체킹 대상이 되지 않는다. 즉, 데이터를 변경해도 DB에 해당 부분이 적용되지 않는다.

변경된 부분만 적용하기

더티체킹은 기본적으로 모든 필드를 update를한다. 테이블의 필드가 적은 경우에는 상관 없지만, 필드가 많아지는 경우 불필요한 update는 부담이 될 수 있다.
@DynamicUpdate를 사용하여 변경 필드만 수정할 수 있다.

데이터가 많은 경우

엔티티의 변경이 일어나는 것을 자동으로 확인하여 DB에 반영해주는 기능은 매우 편리하다.

하지만 많은 데이터를 처리하는 배치성 로직인 경우 성능에 이슈가 생길 수 있다. 수십, 수백만 건의 데이터를 일괄 수정해야 하는 로직에서 일일히 더티체킹까지 하는 것은 비효율 적이다.

이 경우 @Transactionl 설정을 readOnly로 둬서 더티체킹을 하지 않도록 수정하면 된다. 그러면 flush를 수동으로 하기 때문에 더티체킹을 하지 않는다. (성능 향상)

=> 로직에 데이터 수정이 없는 경우 @Transaction(readOnly=true) 설정을 사용하여 성능을 최적화할 수 있다.

'Spring' 카테고리의 다른 글

[JPA] 프록시  (1) 2023.10.09
[JPA]영속성 컨텍스트  (0) 2023.09.24
Spring boot에서 Redis 연동  (0) 2023.07.24
Spring profile  (0) 2023.07.09

댓글