[10분 테코톡] 수달의 JPA N+1 문제

KIM YONG GU·2023년 10월 14일
0

우아한테크

목록 보기
21/41

다양한 N+1 발생 상황이 있지만 본 웨비나에서는 @OneToMany(1:N)를 중심으로 발표.

지연 로딩(Lazy Loading)이란?

JPA(Java Persistence API, 자바 지속성 API)에서 "지연 로딩"은 엔티티(Entity)의 연관 관계를 처리하는 방식 중 하나입니다. 지연 로딩은 연관된 엔티티를 실제로 사용할 때까지 데이터베이스에서 불러오지 않고, 필요한 순간에 로딩하는 전략입니다. 이를 통해 성능을 최적화하고 불필요한 데이터베이스 쿼리를 방지할 수 있습니다.

JAQL(Java Persistance Query Launguage)

JAQL(Java Architecture for Query Language)은 JSON 데이터를 처리하고 쿼리하기 위한 언어입니다

이러한 상황에서 N+1 문제가 발생한다고 함

해결방법 : Fetch join

여기에서 알려주는 활용방법은 크게 두 가지. 전자의 방법을 선택하였음.

(1) Query문에 직접 데이터를 명시하는 방법

(2) 엔티티 그래프(Entity Graph)라는 @어노테이션을 사용.

N+1 해결됨.


Q. 의문점 : 지연 로딩이 문제라면 즉시(Eagel) 로딩을 하면 되지 않느냐?
A. 아니다. 즉시 로딩 일 때도 N+1 문제가 발생함.

JPQL이 즉시 로딩 쿼리를 만들 때는...

보통 처음 쿼리를 작성할 때 (크루에) 연관관계가 있는 엔티티 말고 조회 대상이 되는 엔티티를 기준으로만 쿼리를 만든다.

데이터 누락 문제가 발생할 수 있음

또한 Limit를 사용하면 모든 데이터를 가져와서 LIMIT 된 범위까지만 보여주기 때문에 메모리 과부하 문제가 발생할 수 있다.

profile
Engineer, Look Beyond the Code.

0개의 댓글