반응형
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;