[JPA] Hint & Lock

EB·2024년 1월 19일

Hint

JPA에서도 Hint를 사용할 수 있다.

JPA를 사용해서 데이터를 조회하면 영속성 컨텍스트에 관리되고, 수정을 하게 되면 업데이트 쿼리도 발생하는데
Hint를 사용해서 영속성 컨텍스트에 저장되는 것을 막고, 변경 사항에 대한 수정이 발생되지 않도록 한다.

스냅샷

JPA는 영속성 컨텍스트에 보관할 때 최초의 상태를 복사해서 저장하는데, 이것을 스냅샷이라고 한다. 엔티티와 이 스냅샷을 비교해서 변경된 엔티티를 찾게 된다.

하이버네이트에서 조회만 가능하도록 Hint를 제공한다.

 @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value="true")) // 스냅샷을 만들지 않는다.
    Member findReadOnlyByUsername(String username);
Member findMember = memberRepository.findReadOnlyByUsername("member1");
findMember.setUsername("member2");
  • 기존에는 setUser를 하게 되면 dirty checking을 통해 username이 변경되게 될텐데, Hint를 사용해서 readOnly로 설정했기때문에 스냅샷을 만들지 않게되고 username은 변경되지 않는다.

Lock

JPA에서 Lock을 사용하려면 @Lock와 LockModeType을 지정해야한다.
아래는 PESSIMISTIC_WRITE 비관적 락으로 지정했다.

@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findLockByUsername(String username);

profile
👩‍💻✨junior developer

0개의 댓글