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