Spring/Spring Data JPA

JPA Hint, Lock

민철킹 2021. 6. 14. 21:43

JPA Hint

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

 

우리가 JPA에서 수정을 위해 사용되는 변경 감지 기능에 대해 먼저 얘기해보자.

조회 쿼리뿐만 아니라 update쿼리도 실행

위와 같이 변경감지를 사용한다면, 내부적으로 member1을 변경을 감지하기위해 바뀌기 전 데이터와 바뀐 후의 데이터 총 두개를 가지고 있어야한다. 이는 비효율적이다(메모리를 더 잡아먹음). ㅓPA는 엔티티를 영속성 컨텍스트에 보관할 때 최초 상태를 복사해서 저장해두는데 이를 스냅샷 이라 한다.

개발자가 수정을 하길 원하는 것이 아니라 단순히 조회만하여도 JPA는 내부적으로 스냅샷 만들어준다.(변경 감지를 위해)

 

실제 변경감지 기능을 사용한다면 어쩔 수 없겠지만, 만약 조회만 하고 변경 감지 기능을 사용하지 않는다면 이를 최적화할 수 있는 방법이 존재하는데 그것이 바로 힌트이다. 이는 JPA 표준이 제공하는 것이 아니라 Hibernate가 제공하는 기능이다.

위와 같이 readOnly 속성을 true로 하면 내부적으로 최적화를 하여 스냅샷을 만들지 않는다. 따라서 변경하는 쿼리가 들어와도 다 무시해버린다.

조회 쿼리만 실행되었다. 

 

 

 

항상 이러한 성능 튜닝에 관한 부분은 성능 테스트 후, 판단하자. 무조건적으로 해야하는 것은 아니므로!

 


Lock

 

 

이는 sql의 select for update와 같은 기능을 해주는 옵션이다. for update를 간단히 설명하자면 동시성 문제를 해결하기 위해 사용하는 구문이다. 다수의 사용자가 하나의 데이터를 update하려할 때 발생하는 동시성 문제를 해결해준다.(상호배제)

쿼리문에 for update가 사용된 것을 확인할 수 있다.

 

반응형

'Spring > Spring Data JPA' 카테고리의 다른 글

Spring Data JPA 분석  (0) 2021.06.16
확장 기능  (0) 2021.06.15
@EntityGraph  (0) 2021.06.14
벌크성 수정 쿼리  (0) 2021.06.14
페이징과 정렬  (0) 2021.06.13