-
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'Backend > JPA(Java Persistence API)' 카테고리의 다른 글
[JPA] 엔티티에 Enum 컬렉션 담기 (0) 2022.05.23 [JPA] 페치조인 ( Fetch Join ) (0) 2022.04.02 [JPA] 지연로딩과 즉시로딩 (0) 2022.03.26