벌크성 수정 쿼리
@EntityGraph
- JPA
Hint
&Lock
특정 하나가 아닌
다수의 데이터
를수정하는 쿼리
를 말한다JPA
에서는데이터 수정
시'변경감지'
를 통해 값을수정
한다변경 데이터가 많을 때
굳이하나씩 '변경감지'
를 일으켜서 하면비효율적
이다순수 JPA
를 사용하며em.createQuery(...).executeUpdate()
를사용
해서벌크성 수정 쿼리
를 사용한다스프링 데이터 JPA
에서는 이러한벌크성 수정 쿼리
를편리하게 사용
하기 위한 방법을 제공한다
(순수 JPA)
update 쿼리
를 작성 후에 반드시executeUpdate()
를 통해실행
-->반영된 레코드의 수
를반환
(스프링 데이터 JPA)
JpaRepository를 상속받는 인터페이스
에@Query
를 통해JPQL
을작성
한 것@Modifying
을 사용해서조회
를 위한getResultList()
나getSingleResult()
가 아닌
exeCuteUpdate()
가실행
되도록 지정!- 반드시
벌크성 수정 쿼리
에는@Modifying
이 있어야 한다
- 없으면 ? -->
QueryExecutionRequestException
오류 발생
벌크성 수정 / 삭제 쿼리
는영속성 컨텍스트
를거치지 않고 수행
된다
-->기존에 영속성 컨텍스트에 남아있는 데이터
와불일치
를발생
시킬 수 있다벌크성 수정 / 삭제 쿼리를 한 후
에는 반드시영속성 컨텍스트
를초기화
시켜야 한다
(혹은영속성 컨텍스트
로엔티티가 관리되기 전에 수행
해도 괜찮다)순수 JPA Repository
라면em.flush() / em.clear()
를 해야하지만스프링 데이터 JPA
는 이러한기능을 옵션으로 제공
-->@Modifying(clearAutomatically = true)
JPA를 사용
하면서Entity 연관관계
와LAZY fetch
때문에N+1문제
가 자주 발생한다N+1문제
는fetch join
을 통해서관련 엔티티를 한번에 조회
해서문제를 해결
한다@EntityGraph
는스프링 데이터 JPA
에서JPQL없이 fetch join을 수행
하게 도와주는어노테이션
이다- 기본적으로
LEFT OUTER JOIN
이 수행
(fetch join
을 하면연관 테이블
을 묶어주기도 하지만,select 절에 모든 컬럼을 추가
하기도 함)
(순수 JPA)
@EntityGraph
는 기본적으로left join
으로동작
해서 맞췄다연관 엔티티
들이 많아지면JPQL 쿼리
가 상당히길어지고 오타
가 날 수도 있다
(@EntityGraph)
3가지 방법
모두@EntityGraph
를 사용해내부적
으로fetch join
을수행
하는 코드어떤 메소드를 쓰냐
에 따라도 다르며(기존정의
/쿼리메소드
) /스타일에 따라서
도 다를 수 있다- 3가지 방법
@EntityGraph + @Query
: 기본 틀이되는 코드를@Query로 작성
하고내부적으로 fetch join
실행하게 설정@EntityGraph + @Override
:findAll()
처럼쿼리메소드가 아닌 기존에 정의된 메서드
를사용
할 때에는 반드시@Override
해야함@EntityGraph + 쿼리메소드
:쿼리메소드
를사용
하며내부적으로 fetch join이 수행
되도록 설정
실무에서 잘 사용되는 방법은 X
/표준
이니까 알아두자NamedQuery
처럼Entity
에 연관된 객체를attributeNodes로 등록
하고 필요시@EntityGraph
로사용
굳이 Entity 내부에 지정
해야 하기 때문에실무에서 잘 쓰이지는 X
- 사용
Member Entity
에@NamedEntityGraph
로 지정인터페이스 repository
에 가져와서쿼리 생성
- 권장
@Query
를 사용해서JPQL로 직접 fetch join을 사용
하는 방법@EntityGraph
를 통해간단한 fetch join 사용
하는 방법
일반적인 조회
시객체 상태의 정보를 유지
하기 위한다양한 과정
이수행
된다
-->변경감지를 위한 스냅샷 저장
등등오로지 조회가 목적
인 경우 이러한 과정은불필요
하며 이런 부분을최적화
하는 것이JPA Hint
실제 성능 이슈
가느껴질 때 최적화
하면 된다
--> 굳이조회목적인 부분
에모두 처리해줄 필요는 X
(생각보다최적화 효과
는미비할 확률이 큼
)
- 사용
- 추가 (
Page
사용시추가쿼리
에도적용
하는 방법)
JPA가 제공
하는Lock
을어노테이션
으로사용
하는 것트랜잭션간에 발생
하는Lock
과 관련된 내용개념적으로 깊은 내용
이라추가적으로 공부가 필요