본문 바로가기

Spring Data JPA

3월 22일 SpringDataJPA hint & lock

hint & lock

JPA 쿼리 힌트 (이 힌트는 SQL힌트가 아니라 JPA 구현체(하이버네이트)에 제공하는 힌트)

 

만약 Member 라는 엔티티를 find하게 될 경우

JPA는 변경감지를 위해 원본 member 와 변경감지용 member를 스탭샷에 생성해서 총 2개의 엔티티를 가진다

그런데 개발자가 해당 엔티티를 변경할 계획없이 find한 경우 스탭샷을 만들지 않을 수 있다.

 

Repository

@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly" , value = "true"))

Member findReadOnlyByUsername(String username);

위 메소드로 member를 조회하면 "readOnly" 힌트로 인해 스탭샷을 저장하지 않는다.

 

그렇다고 readOnly가 성능 최적화에 무조건 사용되는건 아니고

꼭 필요한 곳에 실험후 사용을 권장

 

lock() 

JPA가 lock를 제공한다 , 실시간 트래픽이 많은 곳에선 걸면 안된다.

해당 엔티티의 변경을 하지 않도록 지정할수 있게된다.

 

Repository

@Lock(LockModeType.RESSISMISTIC_WRITE)

List<Member> findLockByUsername(String username);

 

위 메소드를 실행하면 where 절에 for update로 lock이 걸리는걸 볼수있다.