카테고리 없음

jpa N+1 해결방법

jw-backend 2025. 2. 23. 14:17
반응형

 

JPA에는 N+1 문제라는 것이 존재합니다.


N+1문제란 DB에서 불러올 때 1개의 쿼리가 아니라 연관관계 객체를 불러오기 위한 N개의 쿼리가 발생하여 성능이 저하되는 문제입니다.

JPA를 사용하여 엔티티간 연관관계를 맺으며 프로젝트를 진행하면 필연적으로 N+1 문제에 직면하게 됩니다.

 

해결 방법


N+1 문제를 해결하는 방법에는 여러 가지가 있습니다:

Fetch Join 사용:

JPQL에서 JOIN FETCH를 사용하여 부모와 자식 엔티티를 한 번의 쿼리로 가져올 수 있습니다.

@Query("SELECT p FROM Parent p JOIN FETCH p.children")
List<Parent> findAllWithChildren();

 


EntityGraph 사용:

JPA 2.1부터 지원하는 기능으로, 엔티티 그래프를 사용하여 어떤 연관관계를 즉시 로딩할지 정의할 수 있습니다.

@EntityGraph(attributePaths = {"children"})
List<Parent> findAll();

 

 


Lazy Loading 최적화:

기본적으로 JPA는 연관관계를 Lazy 로딩으로 설정할 수 있습니다. 이 경우, 실제로 필요한 시점에만 쿼리가 실행됩니다. 하지만, 이 방법은 N+1 문제를 완전히 해결하지는 못합니다.

 

 


Batch Fetching:

JPA에서는 배치 fetching을 사용하여 연관된 엔티티를 한 번에 가져올 수 있도록 설정할 수 있습니다.


@BatchSize(size = 10)
private List<Child> children;