아쿠의 개발 일지

[JPA] N+1 문제 해결 본문

Programming/Java

[JPA] N+1 문제 해결

디아쿠 2024. 7. 10. 22:51

N+1 문제란 ?

연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔터티를 조회할 경우에 조회된 데이터 개수(N)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 이를 N+1 문제라고 한다.

 

EAGER 는 열렬한, 열심인 이런 뜻을 가졌는데 모든 연관관계 데이터를 즉시 빠르게 열렬하게 가져온다고 생각하면 된다.

위 말한 것 처럼 필요하지 않아도 추가로 가지고 오게 된다.

LAZY는 게으른의 뜻을 가지고 있는데 게을러서 필요한 것만 조회하고 연관 관계에 있는 나머지 데이터는 조회를 미룬다.

 

기본적으로 EAGER 가 세팅되어 있지만, N+1 문제를 해결하기 위해 LAZY 사용을 쓰는 것이 좋다.

 

JPQL ?

SQL은 아니고, 변경되기 전 단계이기에 자바와 SQL 문법이 섞여있다.

 

where : 자바 객체의 변수

One d : o -> 자바 객체 변수

별칭 사용은 필수적이고 as 는 생략이 가능하다.

 

FETCH JOIN

FETCH : 얘도 가지고 와라 라는 뜻으로 생각하면 된다. 연관 관계 되어 있는 애를 가지고 온다.

 

JPQL로 N+1 문제를 해결할 수 있지만 너무 많은 데이터를 가지고 온다.

그러면 JPQL을 잘라서 데이터를 좀 적게 가지고 올 수 있나?

동그라미 장인

빌더 패턴에서 기본값을 줄 때 사용한다.

기본값은 ArrayList로 주겠다고 말 하는 것이다.

BatchSize는 이 만큼의 사이즈만 가지고 오겠다. 라는 뜻이다. 사이즈를 지정해주면 원하는 만큼 데이터를 가지고 올 수 있다. 얼마가 적당할지는 고민 해 봐야 한다.

 

예를 들면 인스타그램을 볼 때 게시글을 클릭하면 댓글까지 보이게 된다. 근데 내가 댓글까지 보고 싶지 않으면? 굳이 댓글을 실행하는 쿼리를 미리 실행 시키지 않아도 된다.

게시글 또한 처음엔 9개가 기본적으로 나온다고 가정하면 BatchSize를 9로 해서 조회하면 된다.

 

BatchSize는 패치 조인을 사용하지 않고, N+1 문제를 해결하기 위해 사용한다.

 

728x90

'Programming > Java' 카테고리의 다른 글

[Java] 캡슐화 (Encapsulation)  (1) 2024.07.06
[SpringBoot] Entity간의 관계 설정  (3) 2024.06.23
[SpringBoot] RestController  (0) 2024.06.23
[Method] method overloading 기본(2)  (0) 2024.06.22
[Method] method Overloading 기본  (0) 2024.06.22