티스토리 뷰





반응형

@Query

Spring Data JPA에서는 기본적으로 JpaRepository를 통해서 제공되는 findById 같은 메서드도 있고
메서드 네이밍만을 통해서 쿼리를 실행할 수 있도록 기능을 제공, 하지만 이 방법만으로 만들 수 없는 쿼리가 있다면 쿼리를
직접 작성해야하며 그 때 커스텀 Repository의 메서드에 붙이는 어노테이션이 @Query입니다.
기본적으로 JPQL로 작성할 수 있고, nativeQuery=true 옵션으로 네이티브 쿼리도 사용 가능합니다.

@Modifying

@Query로 작성된 변경, 삭제 쿼리 메서드를 사용할 때 필요합니다. 주로 벌크 연산 시 사용됩니다.
JPA Entity LifeCycle을 무시하고 쿼리가 실행되기 때문에 해당 어노테이션을 사용할 때는 영속성 콘텍스트 관리에
주의해야합니다. 앞으로 설명할 clearAutomatically를 통해 간단하게 해결할 수 있습니다.

벌크 연산

벌크 연산이란 다 건의 update, delete 연산을 하나의 쿼리로 하는것을 의미합니다.

clearAutomatically

이 옵션은 Modifying이 붙은 해당 쿼리 메서드 실행 직후, 역속성 컨텍스트를 clear할 것인지를 지정합니다.
디폴트는 false인데 디폴트로 사용할 경우 영속성 컨텍스트의 1차 캐시와 관련한 문제점이 발생할 수 있습니다.

문제점

JPA에서는 영속성 컨텍스트에 있는 1차 캐시를 통해 엔티티를 캐싱하고, DB의 접근횟수를 줄임으로써 성능 개선을 합니다.
1차 캐시는 @Id 값을 key값으로 엔티티를 관리합니다. 그래서 findById을 통해 엔티티를 조회 했을 시 @Id값이 1차
캐시에 존재한다면 DB에 접근하지않고, 캐싱된 엔티티를 반환합니다.
그렇다면, 벌크 연산을 통해 데이터 변경 쿼리를 실행하고(clearAutomatically = false), 해당 엔티티를 조회하면 어떤일이 발생할까?

예시)

"안녕하세요" 라는 값을 "안녕히계세요" 라고 업데이트 할 경우
DB에는 변경되었고 이후 조회 쿼리를 날려볼 경우 이전에 조회된 엔티티가 존재하여 DB에 새로 접근하지않고 1차 캐시에 있는 값을 불러오기 때문에
"안녕하세요" 값이 리턴될 것이다. 하지만 DB에서 직접 조회해본다면 "안녕히계세요"로 변경되어 있다.

이러한 경우를 방지하려면 clearAutomatically = true로 변경해주어야 한다.
그러면 조회 시 1차 캐시에 해당 엔티티가 존재하지 않기 때문에 DB조회 쿼리를 실행하게 됩니다.


출처 : https://devhyogeon.tistory.com/4

반응형
댓글
반응형
최근에 달린 댓글
글 보관함
Total
Today
Yesterday
최근에 올라온 글
«   2024/05   »
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 31