[JPA] 영속성과 UPDATE

sju3358·2024년 8월 6일
0

삽질 일기

목록 보기
5/6

JPA 환경에서 한 트랜잭션안에서
1. A객체를 save
2. A객체를 update
3. A객체를 commit
4. A객체를 find

하면 A객체는 1번 상태의 A vs 2번상태의 A
어떤 객체가 조회될까?

실제 DB에는 UPDATE 쿼리까지 정상적으로 커밋되어 데이터가 반영된 상태이다.

정답은 2번일것 같지만 1번이다.

이유는
1번에서 영속성 컨텍스트에 영속되고,
2번에서 Dirty Checking 혹은 Merge 방식이 아닌, UPDATE 쿼리를 날렸기때문에
DB에서만 반영될뿐, 영속성 컨텍스트에는 동기화 되지 못한상태기 때문이다.

이때 다시 find를 하면, 아직 영속성 컨텍스트에는 1번의 데이터가 남아있기때문에 JPA의 동일성보장 특성때문에
실제 DB가 아닌 영속성컨텍스트의 데이터를 리턴한다. (1차캐시)

물론 Dirty Checking 방식으로 바꾸는게 깔끔하고 편하겠지만 Bulk연산같이 어쩔수없을때도 있고
가끔은 UPDATE 쿼리를 날리는게 편할때도 있다.
이럴땐 간단한 방법이 있다.

바로 업데이트 쿼리 위에 @Modifying(clearAutomatically = true)을 붙여주는것이다.

public interface TestRepository extends JpaRepository<Test, Integer> {


  @Modifying(clearAutomatically = true)
  @Query("UPDATE 쿼리문..")
  void updateTest(파라미터...);
}

이렇게하면 해당 메소드 선언후, 영속성 컨텍스트가 초기화되어, 다음 find때 1차캐시에서 값을 가져오지 않고 DB에서 가져오기때문에, 변경된 값으로 동기화가 된다.

물론 1차캐시로 인한 성능향상의 이점을 버려야 하기때문에 장단을 따져가며 쓰길 바람.

profile
주니어 백엔드 개발자의 삽질 일기장

0개의 댓글