다양한 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 된 범위까지만 보여주기 때문에 메모리 과부하 문제가 발생할 수 있다.