[ 김영한 스프링 데이터 JPA #7 ] JPA Hint

김수호·2024년 6월 4일
0
post-thumbnail

DB에서 데이터를 조회하면 JPA는 해당 엔티티를 영속성 컨텍스트 1차 캐시에 보관한다. 그리고 동시에 해당 엔티티에 대한 스냅샷을 만드는데, 이를 통해 엔티티 데이터를 추적 / 감시해서 변경을 감지한다.

그러나 어떤 경우는 단순히 조회만 하고, 값을 변경하지 않는 경우가 있을 수 있다. 그리고 이런 경우까지 스냅샷이 만들어지고 변경 감지가 된다면, 아무래도 메모리가 낭비되는 비효율이 있을 수 있다.

이때 JPA Hint 를 사용해서 최적화를 적용할 수 있다.

JPA Hint 란 (SQL 힌트가 아니라) JPA 구현체에게 제공하는 힌트를 말한다.

사용 예시는 다음과 같다. ( @QueryHint )

@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);

위와 같이 @QueryHintorg.hibernate.readOnlytrue 로 적용하게 되면, 영속성 컨텍스트 내부에서 엔티티에 대한 스냅샷을 만들지 않는다. 이는, 데이터 변경에 대한 추적 / 감시를 하지 않는다는 것을 의미하고, 즉 더티 체킹을 하지 않는다는 것을 의미한다. 읽기 용도로만 사용되도록 내부에서 최적화하는 것이다. 따라서, 불필요한 메모리의 낭비를 막을 수 있게된다. ( 참고로, 조회 후 엔티티 데이터를 변경하더라도 데이터가 수정되지 않으니 주의하자. )

 

✔️ 참고

  • 스프링 5.1 버전 이후를 사용하면 @Transaction(readOnly=true) 로 설정 시, @QueryHintreadOnly 까지 모두 동작한다.

강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.

profile
현실에서 한 발자국

0개의 댓글