[SPRING] N+1과 해결방법

이정환·2023년 7월 25일

[CS] SPRING

목록 보기
13/22

1. N+1 이 무엇이고 발생하는 이유 및 해결방법

  • == 맵핑관계있는 요청시 1개의 쿼리로 처리되길 기대햇는데 N개의 추가 쿼리가 발생하는 현상입니다. 즉시로딩은 그 자체로 N+1 문제를 발생시킵니다. 지연로딩도 결국 지연로딩 대상 호출시 같은 문제 발생합니다. 이 문제는 fetch join사용해서 한방 쿼리로 해결할 수 있습니다. 하지만 페이징 문제가 생깁니다. 페이징 문제는 @batchsize 사용하면 해결됍니다.
    • 지연로딩 - 사용할때까지 로딩을 미룬다. for문 돌면서 지연시킨 데이터 호출시 N번 추가호출되는문제 발생
      • @onetomany(mappedBy=’’. fetch=fetchType.lazy)
        • 이객체 호출시 다 로 맵핑된 녀석은 프록시 객체로 임시로 일단 셋팅되어 호출됌.
      • 해결방법 = fetch join == Fetch join은 즉시로딩과 비슷한 효과를 제공하면서도 조인을 사용하여 한 번의 쿼리로 필요한 연관된 엔티티를 함께 조회하는 방법
        • 연관된 엔티티나 컬렉션을 한번에 같이 조회(연관 엔티티까지 영속성 컨텍스트에 전부 올림)
        • ~toOne은 전부 lazy로 셋팅, ~toMany는 디폴트가 lazy
    • 즉시로딩은 그 자체로 N+1 문제가 생김.
    • 하지만 위 해결법이 페이징 처리할때 문제생김
      • ⇒ manytoone 사용 해결
      • @batchsize 사용 해결

0개의 댓글