N + 1

김창모·2023년 5월 30일
0

SpringBoot

목록 보기
8/19

N+1 이란?

JPA 에서 조회할때 발생하는 문제중 하나로 연관관계가 설정된 엔티티를 조회할 경우 조회된
데이터 개수만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 문제다.
예를들어 게시물 목록을 조회하려고 할때 각 게시물의 작성자를 표시한다고 가정하자
이때 게시물 목록과 게시자는 아마도
ManyToOne
게시글
OneToMany
작성자
연관관계가 맺어져 있을것이다.
게시물 목록을 조회하는 쿼리로 먼저 게시물 목록을 조회한 후 각 게시물의 작성자 정보를 가져오기 위해 게시물 조회한 만큼의 추가적인 쿼리가 발생하는것을 N+1 문제라고 한다.

N+1 문제의 발생 원인

N+1 문제는 위에서 설명했듯이 연관관계가 있는 엔티티 조회시 발생한다.
성능상의 문제로 엔티티 조회시 연관관계가 맺어진 조회는 지연로딩 처리를 하여 필요할 때만
조회를 할 경우가 많은데 이때 필요한 연관된 엔티티를 조회하기 위해 추가적인 쿼리가 실행되는것이다.

N+1 문제의 해결방법

N+1 문제를 해결하기 위해서는 데이터 로딩 전략을 고려해야 한다.
대표적인 데이터 로딩 전략으론 EAGER 과 LAZY 가 있다.

EAGER

즉시 로딩 이라고 하며 연관된 엔티티를 모두 한번에 조회하는것이다.
이 방식은 N+1 문제를 해결할수는 있지만 사용하지 않는 데이터까지 모두 조회하므로 데이터베이스 성능 저하의 원인이 되기도 한다.

LAZY

지연 로딩 이라고 하며 데이터를 실제로 사용할때 조회하는 방식이다.
쿼리 최소화를 할수는 있지만 N+1 같은 문제가 발생할수 있으므로 fetch Join 방식을 사용하면
데이터 조회를 효율적으로 할수 있다.

Fetch Join

Fetch join 은 연관된 엔티티를 한번의 쿼리로 로딩하는 방식으로 N+1 문제를 해결할수 있다.

LAZY + Fetch Join 을 사용하자.

배치 사이즈 설정

배치 사이즈란 한번의 쿼리로 가져올 연관된 엔티티의 수를 지정하는 것으로 지연 로딩을 사용할때 N+1 문제를 개선하는 방법중 하나이다.

0개의 댓글