728x90
JPA Hint
JPA 쿼리 힌트란, SQL 힌트가 아니라 JPA 구현체에게 제공하는 힌트이다.
예제)
일반적으로는 변경 감지가 일어난다.
@Test
public void queryHint() {
//given
Member member1 = new Member("member1", 10);
memberRepository.save(member1);
em.flush();
em.clear();
//when
Member findMember = memberRepository.findById(member1.getId()).get();
findMember.setUsername("member2");
em.flush(); //변경 감지 -> Update Query 실행
}
변경 감지의 단점
- 원본이 있어야 변경 감지를 한다.
- 즉, 객체를 두개 관리 한다.
- 결국 비용이 더 든다.
조회만 하고 싶다면?
@QueryHint 어노테이션을 사용하자!
쿼리 힌트 예제)
@QueryHints(value = @QueryHint(name="org.hibernate.readOnly", value = "true"))
Member findReadOnlyByUsername(String username);
@Test
public void queryHint() {
//given
Member member1 = new Member("member1", 10);
memberRepository.save(member1);
em.flush();
em.clear();
//when
Member findMember = memberRepository.findReadOnlyByUsername("member1");
findMember.setUsername("member2");
em.flush(); //Update Query 실행 X
}
쿼리 힌트 Page 예제)
@QueryHints(value = { @QueryHint(name = "org.hibernate.readOnly",
value = "true")}, forCounting = true)
Page<Member> findByUsername(String name, Pageable pageable);
- org.springframework.data.jpa.repository.QueryHints 어노테이션을 사용
- forCounting : 반환 타입으로 Page 인터페이스를 적용하면 추가로 호출하는 페이징을 위한 count 쿼리도 쿼리 힌트 적용(기본값 true )
@Lock
- org.springframework.data.jpa.repository.Lock 어노테이션을 사용
- DB에서 select할 때 Lock을 건다.
- 실시간 트래픽이 많은 서비스에서는 Lock을 걸면 안된다.
예제 코드)
@Lock(LockModeType.PESSIMISTIC_WRITE)
List<Member> findByUsername(String name);
테스트 코드)
@Test
public void lock() {
//given
Member member1 = new Member("member1", 10);
memberRepository.save(member1);
em.flush();
em.clear();
//when
List<Member> members = memberRepository.findByUsername("member1");
}
쿼리를 살펴보면 for update 되어있다.
select
member0_.member_id as member_i1_0_,
member0_.age as age2_0_,
member0_.team_id as team_id4_0_,
member0_.username as username3_0_
from
member member0_
where
member0_.username=? for update
Lcok 에 대한 내용은 추후 자세히 공부한 후 추가 예정이다.
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
Spring Data JPA | Auditing (0) | 2023.05.11 |
---|---|
Spring Data JPA | 사용자 정의 리포지토리 구현 (0) | 2023.05.09 |
Spring Data JPA | @EntityGraph란? (0) | 2023.05.09 |
Spring Data JPA | 벌크성 수정 쿼리 (순수 JPA와 스프링 데이터 JPA 비교) (0) | 2023.05.09 |
Spring Data JPA | 순수 JPA와 스프링 데이터 JPA의 페이징과 정렬 비교하기 (0) | 2023.05.09 |