ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA Hint
    JPA/스프링 데이터 JPA 2023. 8. 12. 00:19

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

     

    JPA에서 데이터를 변경할 때 변경 감지라는 기능을 사용해서 트랜잭션 안에서 데이터를 변경한다. 이 때 스냅샷을 생성하기도 하고 변경을 위해서 메모리를 소비한다. 그런데 진짜 조회만 할 때에는 이런 것들이 필요없으니 최적화를 해줘야한다.

     

    public interface MemberRepository extends JpaRepository<Member, Long> {
    
        @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
        Member findReadByUsername(String username);
        // 조회만 할 때 조회만 해서 쿼리를 최적화 해주는 작업
    }

    @QueryHints안에 @QueryHint를 넣고 readOnly를 true로 설정해줘서 읽기만 가능하게 한다.

     

    @Test
    public void queryHint() {
        // given
        Member member1 = memberRepository.save(new Member("member1", 10));
        em.flush();
        em.clear();
            
        // when
        Member findMember = memberRepository.findReadByUsername("member1");
        findMember.setUsername("member2");
        // readOnly가 true로 되어있으므로 변경감지가 안됨 
            
        em.flush();
    }

    테스트를 해보면 변경 감지를 이용해서 변경을 진행해도 readOnly가 true로 되어있기 때문에 변경 감지가 되지 않는다. 스냅샷도 생성하지 않았고 애초에 조건을 걸어두었기 때문에 변경 감지가 되지 않는 것이다.

     

     

     

    하지만 성능이 미미한 정도이기 때문에 다른 쿼리를 최적화하고 진짜 아주 조금이라도 성능을 좋게 하기 위해서 이렇게 설정한다. 실무에서는 그렇게 크게 일일이 해주진 않는다고 한다.

Designed by Tistory.