ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [최적화] readOnly조회 @QueryHint vs @Transactional
    Backend/JPA(Java Persistence API) 2022. 3. 8. 01:07
    728x90

    성능 향상의 목적으로 읽기 전용으로 데이터를 불러올 때

    1. @QueryHint의 readOnly

    2. @Transactional( readOnly = true )

    이 두 가지 방법을 생각할 수 있다. (스칼라 타입으로 조회는 생략하도록 하자)

     

    이 방법들이 어떤 차이가 있는지 궁금해서 구글링을 해보았는데

    대부분의 개발자분들이 정리한 것을 보면

     

    1번의 @QueryHint는 엔티티를 읽기 전용으로 조회하여 영속성 컨텍스트가 스냅샷을 보관하지 않으므로

    메모리를 아낀다고 하고 ( Drity Checking이 일어나지 않음 )

     

    2번의 @Transactional( readOnly = true ) 이 방식은

    Hibernate Session의 Flush 모드가 Manual로 설정되어 커밋 시점에 플러쉬가 일어나지 않으므로

    cpu가 절약 (속도 향상) 이 된다고 정리되어 있다.

     

     

    그러면 한 가지의 궁금증이 생긴다 !!

     

    2번 @Transactional( readOnly = true ) 의 방식에서 강제로 flush()를 호출하게 되면 수정이 될까?

    즉, 영속성 컨텍스트가 스냅샷을 보관하고 있을까?

    나의 예상은 보관을 한다는 것이었다..!

     

    나는 영속성 컨텍스트가 스냅샷을 보관할 것이라고 생각하고 돌렸다.

     

    테스트 코드로 살펴보자

    이 테스트의 실행결과를 보면

    memberService.findByName("양글렛") 여기서의 조회 쿼리만이 나왔다.

     

    내 생각과는 다르게 2번 @Transactional( readOnly = true ) 도 스냅샷을 보관하지 않는 건가?라고 생각하고

    또 구글링 구글링을 하던 중에

    스프링 5.1 버전 이후부터는 @Transactional( readonly = true ) 를 사용하면 

    스냅샷을 보관하지 않는 것으로 변경이 되었다고 한다 ,,,,! 

     

    스프링 5.1 버전 이후부터는 @Transactional( readOnly = true ) 을 사용하면 @QueryHint의 readOnly 까지

    적용이 되는 것으로 보면 될 것 같다.

     

    내 생각이 맞았다는 사실에 뿌듯해하며 포스팅을 마쳐야겠다

     

    728x90
Designed by Tistory.