티스토리 뷰

N+1 문제

: 조회된 부모의 수만큼 자식 테이블의 쿼리가 추가 발생하는 현상

연관 관계가 설정된 엔티티를 조회할 경우에 발생하는 문제

쿼리를 날렸을 때 의도하지 않은 쿼리가 N번 추가로 실행되는 것을 N+1이라고 한다.

 

 

 

해결방법 : FetchJoin

* Join, Fetch Join 차이점

Join

- 연관 Entity에 Join을 걸어도,

실제 쿼리에서 SELECT 하는 Entity는 오직 JPQL에서 조회하는 주체가 되는 Entity만 조회하여 영속화

 

- 조회의 주체가 되는 Entity만 SELECT 해서 영속화하기 때문에 데이터는 필요하지 않지만, 연관 Entity가 검색조건에는 필요한 경우에 주로 사용됨

 

 

Fetch Join

- 데이터를 가져올 때 조회의 주체가 되는 Entity 이외에,

Fetch Join이 걸린 연관 Entity도 처음부터 함께 SELECT 하여 모두 영속화

 

- Fetch Join이 걸린 Entity를 모두 영속화해서 FetchType=Lazy인 Entity를 참조하더라도

  이미 *영속성 컨텍스트에 들어있기 때문에 따로 쿼리가 실행되지 않은 채로 한방쿼리로 N+1문제가 해결됨

 

 

* 영속성 컨텍스트

- Entity 를 영구 저장하는 환경

- 어플리케이션과 DB사이에서 객체를 보관하는 가상의 DB 역할을 한다.

 

 

* Fetch Join 사용 조건

여기서 Fetch Join은 중요한 조건이 있다.

  • ToOne : 개수 상관없이 모든 ToOne 관계에 사용 가능
  • ToMany : 1개의 ToMany에만 사용 가능

 

 

1 : N 관계에서 fetch join 사용하면서 발생할 수 있는 문제 해결하기

 

N + 1 문제 해결하기 : Fecth Join 사용하면서 발생하는 MultipleBagFetchException 해결

1 : N 관계에서 Fecth Join 사용시 발생하는 MultipleBagFetchException 해결법 1. ToOne(OneToOne, ManyToOne) 관계를 모두 Fetch Join 한다. 2. 1:N 관계의 Collection Entity는 Lazy Loading(지연 로딩)으로 조회한다. 3. Lazy Loading

coding-duck1.tistory.com

 

 

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함