일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 예외처리
- spring 예외처리
- LazyInitializationException
- 쉘스크립트
- 스프링 예외처리
- jpa 성능최적화
- 쿠키 #세션 #쿠키세션정리
- 공인IP
- 스프링 공통데이터
- 타임리프 예외처리
- smtp
- api 성능최적화
- 좋아요 기능
- HTTP API
- password
- thymleaf
- jpa hint
- querydsl
- DATA JPA
- validation
- JPA
- springboot
- 사설IP
- 스프링부트
- 낙관적 락
- 비관적 락
- 지연로딩
- 타임리프
- thymeleaf
- JPA #N+1 #JPA API #API
- Today
- Total
jiny
[DATA JPA] JPA Hint 사용하여 select 쿼리 최적화하기 본문
JPA Hint
sql hint 처럼 기존에 실행되어야 하던 일부 로직을 개선하여 최적화가 가능하다.
jpa에서는 트랜잭션 내부에서 member 를 조회해서 해당 member의 필드 값을 변경하면
트랜잭션 종료 시점에 스냅샷을 이용해 변경된 값을 감지하여 jpa가 update 쿼리를 실행해준다아래처럼 나이 10을 15로 변경하면 트랜잭션이 끝나고 update가 발생한다
영속성 컨텍스트 내부에는 아래처럼 되어있을 것 이고
트랜잭션이 끝날 때, 스냅샷과 엔티티를 비교하여 달라진 점이 있으면 update 쿼리를 전달한다
문제는 엔티티를 변경하지 않아도 스냅샷은 항상 저장한다.
즉 위에서 findMember.setAge(15); 를 호출하지 않으면 update 쿼리는 날라가지 않지만
영속성 컨텍스트는 언제 변경될지 모르는 엔티티의 스냅샷은 만들어두고 있는 것이다.
그런데 나는 findByUsername 메소드는 조회만 할거고 조회한 엔티티는 절대 변경안할거야 라고 한다면
저 스냅샷은 의미가 없어 지지만, jpa 는 그걸 모르고 항상 초기의 엔티티를 스냅샷으로 만들어두는 수고를 한다.
여기서 jpa Hint 를 사용하면 읽기 전용 메소드로 만들고 스냅샷을 사용안하게 만들 수 있다
이제 다시 확인해본다면
Hint를 사용하여 읽기 전용으로 만든 메소드를 사용하였다
조회한 Member 의 나이를 15로 변경하고 flush() 를 하여 저장소에 있는 sql을 db에 전달하였다
다시 해당 Member를 조회하여 나이를 확인하면 15로 변경되지 않고 그대로 10이다.
그외에도 다른 문자열을 전달하여 다양한 기능을 사용할 수 있다.
@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))
실무에서는 사실상 쿼리가 잘못되거나 다른 이유로 성능이 안나오는 경우가 대부분이라고 합니다. 해당 기능으로는 최적화가 크게 눈에 띄지 않아서 무분별하게 사용하는 것보다 정말 중요한 곳에서만 사용하는 것으로 보입니다
[출처]
'서버 > JPA' 카테고리의 다른 글
[JPA] 좋아요 기능 동시성 테스트 및 락기능 활용하기 (0) | 2023.03.09 |
---|---|
[JPA] LazyInitializationException (0) | 2023.03.08 |
[DATA JPA] @EntityGraph 지연로딩 해결 - 연관된 엔티티들을 같이 조회하기 (1) | 2023.02.28 |
[DATA JPA] 주요 기능 정리 (0) | 2023.02.28 |
[JPA] API 요청 및 응답 시 주의 사항 1 (0) | 2023.01.11 |