N : N 문제를 중간 테이블 매핑 전략중 쿼리 질문

24.03.01 18:20 작성 24.03.01 20:33 수정 조회수 61

0

안녕하세요 현재 개발 중인 학생입니다. 현재 시스템에서는 레스토랑과 아이템 간의 관계를 모델링하는 데 있어 다대다 관계를 매핑하고고 있습니다. 이러한 관계는 중간 엔티티인 RestaurantStock을 통해 매핑되어 있으며, 하나의 가게가 여러 아이템을 가질 수 있고, 하나의 아이템이 여러 가게가 가질수 있는 구조입니다.

 

스크린샷 2024-03-01 오후 5.58.38.png

 

스크린샷 2024-03-01 오후 5.58.19.png

 

스크린샷 2024-03-01 오후 5.59.12.png

스크린샷 2024-03-01 오후 6.06.21.png

쿼리 로직은 Restaurant 엔티티를 기준으로, 해당 레스토랑에서 판매하는 아이템들을 조회합니다. 이 과정에서 Restaurant과 RestaurantStock, 그리고 Item 엔티티를 조인하여 필요한 정보를 한 번의 쿼리로 가져옵니다. 하지만, 이 접근 방식에 대해 팀원 중 일부는 N + 1 문제가 발생한다고 지적하였습니다.

현재 레스토랑은 하나가 저장된 상태이고, 아이템은 2개가 저장된 상태입니다. 그런데 궁금한 점은 현재 이렇게 조회하게 되면 결과값이 2개 조회가 되는데 이것을 본 저희 팀원이 N + 1이라고 하는데 맞는지 궁금합니다.

스크린샷 2024-03-01 오후 8.29.45.png

쿼리를 보지 않고 결과값으로만 보고 N + 1 이라고 이야기하는데 맞는지 궁금합니다.


스크린샷 2024-03-01 오후 6.10.56.png


 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.02

안녕하세요, 인프런 AI 인턴입니다.

황중석님, JPA와 관련하여 여러분이 진행하는 프로젝트에서 N : N 문제에 대해 문의하셨군요. 확인해주신 바와 같이, N + 1 문제는 ORM을 사용할 때 발생할 수 있는 성능 이슈로, 하나의 쿼리로 시작해서 관련된 각 엔티티를 가져오기 위해 추가 쿼리가 발생하는 문제입니다.

RestaurantItem 엔티티 간의 다대다 관계를 RestaurantStock과 중간 엔티티로 매핑한다는 점에서 적절한 구조를 가지고 있는 것처럼 보입니다. 하지만 각 Restaurant를 조회할 때마다 관련 RestaurantStock 내의 각 Item을 가져오기 위해 추가적인 쿼리가 발생하면 그것이 바로 N + 1 문제가 됩니다.

쿼리 결과값이 2개가 조회된다는 것만으로는 N + 1 문제가 발생했다고 확정 짓기 어렵습니다. 이 문제를 정확히 판단하려면 실행되는 실제 쿼리와 데이터베이스에서 발생하는 쿼리 수를 확인해야 합니다. JPA를 사용한 경우 @OneToMany@ManyToOne과 같은 연관 관계 매핑에서 FetchType을 LAZY로 설정한다면 해당 엔티티가 실제로 사용될 때까지 쿼리를 지연시킬 수 있지만, 이로 인해 예상치 못한 추가 쿼리가 발생할 가능성이 있습니다.

JPA에서는 이러한 문제를 해결하기 위해 fetch조인이나, 엔티티 그래프 기능을 사용하여 관련 엔티티를 함께 로딩하는 방법을 제공합니다. 또한 @Query를 사용하여 JPQL이나 네이티브 쿼리로 명시적인 쿼리를 정의하는 방법도 있습니다.

조회하는 쿼리와 컨텍스트를 고려하여 성능 최적화를 위한 전략을 선택해야 합니다. 예를 들어, @NamedQuery를 사용하여 쿼리를 미리 정의하거나, @Query와 함께 JPQL 또는 네이티브 쿼리를 잘 작성하여 사용하는 것이 좋습니다. 또한 Spring Data JPA의 리퍼런스 문서에서 “Query Methods” 섹션을 참고하여 다양한 쿼리 작성 방법 및 최적화 전략에 대해 알아보시길 권장드립니다.

참고할 수 있는 @Query의 사용법과 관련된 Spring Data JPA 문서의 링크입니다.
- Using @Query: Spring Data JPA Reference Documentation - Using @Query

이외에도 필요할 경우 Spring Data JPA에서 제공하는 기능들을 활용해 N + 1 문제를 최적화 할 수 있습니다.