jiny

[DATA JPA] JPA Hint 사용하여 select 쿼리 최적화하기 본문

서버/JPA

[DATA JPA] JPA Hint 사용하여 select 쿼리 최적화하기

ongjiny 2023. 2. 28. 23:45

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"))

 

실무에서는 사실상 쿼리가 잘못되거나 다른 이유로 성능이 안나오는 경우가 대부분이라고 합니다. 해당 기능으로는 최적화가 크게 눈에 띄지 않아서 무분별하게 사용하는 것보다 정말 중요한 곳에서만 사용하는 것으로 보입니다

 

[출처]

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard