JPA Hint & Lock

Mina Park·2022년 10월 10일
0

1. JPA Hint

  • JPA 쿼리 힌트(DB에 보내는 SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트)
  • 기본적으로 영속성 컨텍스트에 올라온 객체들은 변경감지를 통해 변경사항이 있을 경우 자동 업데이트 쿼리
    • 사실상 객체 두개를 관리하는 것(비효율적, 메모리 소모)
  • 만약 조회용으로만 사용한다면?
    • 변경감지가 필요 없는 경우 별도의 옵션 지정 가능(hibernate에게 힌트 제공)
    @QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
    Member findReadOnlyByUsername(String username);
    @Test
    public void queryHint() {
        //given
        Member member1 = memberRepository.save(new Member("member1", 10));
        em.flush(); //sql 쿼리 실행
        em.clear(); //영속성 컨텍스트 초기화

        //when
        Member findMember = memberRepository.findReadOnlyByUsername("member1"); //쿼리 힌트를 통해 readOnly인 경우(업데이트x)
//        Member findMember = memberRepository.findById(member1.getId()).get(); //일반적인 변경감지가 일어나는 경우(업데이트o)
        findMember.setUsername("member1Change");

        em.flush();
    }
  • 페이징 처리 예제
    • forCounting : 반환 타입으로 Page 인터페이스를 적용하면 추가로 호출하는 페이징을 위한 count
      쿼리도 쿼리 힌트 적용(기본값 true)
@QueryHints(value = { @QueryHint(name = "org.hibernate.readOnly",
value = "true")},
forCounting = true)
Page<Member> findByUsername(String name, Pagable pageable);

사실상 실무에서는 사용빈도가 높지 않음. 트래픽 분석을 통해 필요한 경우에만 사용해도 충분

2. Lock

@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findByUsername(String name);

0개의 댓글