반응형
쿼리 최적화를 위한 SQL힌트는 JPA에서 제공하고 있지 않다. 따라서 NativeQuery를 사용.
JPA 쿼리 힌트는 SQL 힌트가 아닌 JPA 구현체에게 제공하는 힌트로, 기본적으로 JPA가 변경감지에 의해 update 쿼리를 날릴려면 원본을 캐시에 저장하고 관리하는 entity 객체 또한 따로 갖고 있는다. 하여 이를 위해 영속성 컨텍스트는 항상 원본(스냅샷)과 관리하는 사본 객체 두 객체를 메모리에 저장하게 된다. 이게 성능 이슈가 될 수도 있다. 읽기만 할 때는 필요없기 때문에 같은 엔티티 객체를 두 개를 갖는 것은 메모리 비용을 허비할 수가 있다.
그래서 JPA Hint를 통해 읽기 전용이라고 알려주고 캐시에 원본(스냅샷)을 저장하지 않도록 하여 공간 비용을 최적화할 수 있다.
@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);
org.springframework.data.jpa.repository.QueryHints
어노테이션을 사용
@QueryHints(value = { @QueryHint(name = "org.hibernate.readOnly", value = "true")},
forCounting = true)
Page<Member> findByUsername(String name, Pagable pageable);
forCounting
: 반환 타입으로 Page 인터페이스를 적용하면 추가로 호출하는 페이징을 위한 count 쿼리도 쿼리 힌트 적용(기본값 true )
728x90
반응형
'스프링 > JPA' 카테고리의 다른 글
Spring-Data-Jpa (0) | 2021.08.06 |
---|---|
Envers / spring-data-envers (0) | 2021.08.03 |
JPA 변경/삭제 @Modifying (0) | 2021.06.04 |
FK가 PK가 아닌 다른 컬럼과 연관관계가 있을 때 (0) | 2021.05.31 |
복합키 (0) | 2021.05.26 |
댓글