Tech/JPA
[JPA] 'N+1 문제'와 @BatchSize
싱브이
2024. 4. 17. 18:03
728x90
반응형
전체 목록을 출력하기 위해서 게시글을 조회하면, 게시글 하나마다 이미지를 조회하는 쿼리가 실행되는 것을 확인하였다.
→ 'N+1' 문제
N+1 문제
연관 관계에서 발생하는 이슈로 엔티티를 조회할 때 조회된 데이터 갯수(N)만큼 연관 관계의 조회 쿼리가 추가로 실행되어 데이터를 읽어오는 것을 말한다.
더 찾아보니깐 이것의 근본적인 원인은 관계형 데이터베이스와 객체지향 언어 사이의 패러다임 차이로 인해서 발생하는 문제라고 한다. (객체지향은 Random Access를 통해 연관 객체에 접근가능하지만, RDB는 select 쿼리를 통해서만 조회 가능)
N+1문제는 근본적으로 성능저하를 일으키므로 해결해야하는 문제이기도 하다!
보완책 @BatchSize
@BatchSize
size 속성을 이용하여 N번에 해당하는 쿼리를 모아서 한번에 실행할 수 있다.
@OneToMany(mappedBy = "board",
cascade = {CascadeType.ALL},
fetch = FetchType.LAZY,
orphanRemoval = true)
@Builder.Default
@BatchSize(size = 20)
private Set<BoardImage> imageSet = new HashSet<>();
결과
*참고
목록 관련 처리는 limit과 같은 페이징 처리가 실행되는지 체크하는 것이 중요! (limit이 없다면 테이블의 모든 데이터에 대한 처리가 진행되는 것이기 때문에 성능 저하가 발생함) + @EntityGraph도 !
728x90
반응형