n+1 문제 : 스프링 JPA와 같은 ORM 기술을 사용하면서 발생하는 성능 이슈 중 하나.
연관 관계가 있는 엔티티를 조회할 때, 쿼리 한 번으로는 해결할 수 없고, 추가로 n 번의 쿼리가 더 발생하는 문제. 예를 들어, 게시판에 글을 조회하는 기능을 구현한다고 가정했을때, 게시글을 조회할 때 해당 글의 작성자 정보도 함께 조회해야 한다면, 게시글 조회 쿼리와 작성자 조회 쿼리가 두 번 발생하게 됨. 이 경우, 게시글 조회 쿼리 한 번에 작성자 정보를 함께 조회하도록 해결해야 한다.
n+1 문제 자체가 발생하는 이유는 한쪽 테이블만 조회하고 연결된 다른 테이블은 따로 조회하기 때문.
n+1 문제를 해결하는 방법 중 하나는 Eager Loading(즉시 로딩) 사용. 연관된 모든 엔티티를 즉시 로딩하므로 쿼리 한 번으로 데이터를 모두 가져올 수 있지만, 데이터가 많은 경우 메모리 부족 문제가 발생할 수 있기 때문에 조심해야 함!
다른 방법으로는 Lazy Loading(지연 로딩)이 있다. 이 방법은 필요할 때마다 데이터를 로딩하는 방식으로, 메모리 사용을 최적화할 수 있음. 하지만, 지연 로딩을 사용하면서 n+1 문제를 해결하려면, Fetch Join이나 Batch Size 설정 등의 기술을 사용해야 함.
Fetch Join은 JPQL에서 사용하는 키워드 중 하나로, 연관된 엔티티를 함께 로딩하는 기능. Batch Size는 연관된 엔티티를 일정 개수씩 나누어 로딩하는 기능으로, 여러 개의 쿼리를 한 번에 실행하여 n+1 문제를 해결할 수 있음.
따라서, 스프링 JPA에서 n+1 문제를 해결하려면 적절한 로딩 전략을 선택하고, Fetch Join이나 Batch Size 등의 기술을 활용해야 한다!