ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA N+1 문제와 해결 방법
    디버그 2025. 1. 30. 23:54

    ※주의 - 틀린 정보가 있을 수 있습니다.

    문제 상황

    회사에서 책이나 예제 코드에서만 보던 N + 1 문제를 겪었습니다.

    관련 모든 엔티티가 조회 시 필요하였기에 하나의 엔티티에 일대다 연관 관계가 여러 개 존재하고 FetchType.EAGER로 설정되어 있었습니다.


    N + 1 문제란?

    JPA(Java Persistence API)를 사용할 때 연관 관계가 있는 엔티티를 조회하면, 예상보다 더 많은 쿼리(N + 1개)가 실행되는 문제가 발생할 수 있습니다.

    그래서 연관된 모든 엔티티가 조회되었고 새롭게 추가된 연관 관계 필드에 대한 조회와 개선이 필요했습니다.


    시도한 방법

    • 엔티티에 엔티티 그래프를 선언하고 JPA 레포지토리의 특정 쿼리에서 엔티티 그래프를 설정하여 모든 관련된 엔티티 조회해 오도록 수정
    • default_batch_fetch_size를 적절한 값으로 설정하여 최대 n개의 엔티티를 가져오도록 수정

    해결 과정

    원인 파악

    원인은 우선 일대다 연관 관계와 FetchType.EAGER의 복합적인 문제였습니다. 그래서 FetchType.EAGER를 수정하거나 FetchType.EAGER로 로딩하더라도 기존 방식보다는 효율적으로 호출해야 했습니다.

    최종적으로 선택한 해결책

    우선 해당 엔티티가 미치는 모든 영향을 파악하기는 시간적으로 힘들었고 FetchType.LAZY로 변경했을 때 파급력을 측정하기가 어려웠습니다. 또한, 해당 엔티티가 주로 연관된 엔티티와 자주 같이 쓰이기에 엔티티 그래프를 통해서 JPA 레포지토리에서 재사용 하기 좋게했습니다.

     

    1. 엔티티 그래프를 이용하여 JPA 레포지토리에서 특정 쿼리 호출 시 모든 관련 엔티티를 조회하도록 변경했습니다.

    2. 1번에서 더 적은 쿼리로 데이터를 효율적으로 가져올 수 있게 spring.jpa.properties.hibernate.default_batch_fetch_size를 설정했습니다.


    결론

    책이나 예제에서만 보던 문제를 실제로 접하고 해결하니 뿌듯했습니다.

    열심히 쌓아오던 지식들이 도움이 된다는게 정말 좋았습니다. 또, 이러한 문제를 겪었을 때 해결했던 경험을 잊지 못할 것 같습니다.앞으로도 계속 꾸준히 지식을 배우고 실제로 문제를 해결해보고 사용해야겠습니다.


    참고문헌

    자바 ORM 표준 JPA 프로그래밍

    https://www.baeldung.com/spring-data-jpa-named-entity-graphs

Designed by Tistory.