인프런 커뮤니티 질문&답변

kkt169님의 프로필 이미지
kkt169

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

페치 조인 1 - 기본

다대다 관계에서 페치 조인

작성

·

388

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.
 
안녕하세요.
다대다 관계에서 페치조인 성능에 대해 질문이 있습니다.
 
실전 JPA1의 프로젝트를 기준으로
orders와 item은 다대다 관계이기 때문에
사이에 order_item이라는 중간 엔티티를 둬서
일대다 , 대다일 로 풀어내주셨습니다.

 

이때 order 를 이용해서 그 주문한 상품의 이름을 알고싶은 경우

 
1) 처음에 order id를 기반으로 order와 연관된 orderItem을 모두 가져오는 페치조인을 하였고
 
2) 이후 그 여러 orderItem 각각에 대하여 다시 페치조인으로 orderItem을 조회하여 orderItem과 , Item을 모두 가져왔습니다.
 
이후에 Item의 이름을 출력해 보았는데,
2번 과정에서 어차피 각각의 orderItem에 대해 페치 조인이 사용되는 것 이기에 - orderItem의 개수만큼 inner join이 나갔습니다.
 
 
그래서 이를 수정하여
 
수정 1) 동일하게 order id를 기반으로 order 와 연관된 orderItem을 모두 가져오는 페치조인 수행 후
 
수정 2) 각각의 orderItem에 대하여 orderItem.getOrder.getName() 으로
연관된 Item의 이름을 조회하였더니
 
위와 동일한 개수의 SQL이 나가지만,
inner join을 쓰지 않고 단순히 where문을 사용한 조회 문이 나갔습니다.
 
=> 이를 보고 , 다대다의 관계에서 한쪽을 이용해 연관된 다른 한쪽을 조회해야하는 상황에서는, 위의 수정된 방법처럼
 
처음에는 페치조인을 쓰고 + 이후에는 지연로딩으로 인한 단순 조회를 사용하는 식으로
사용하고 있는데요
이런식으로 사용하는것이 맞게 사용하는 건지 궁금합니다.

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. kkt169님

강의에서 설명드린 것 처럼 실무에서는 다대다 연관관계를 사용하지 않습니다.

따라서 이 부분은 크게 고민하지 않으셔도 될 것 같아요.

감사합니다.

kkt169님의 프로필 이미지
kkt169
질문자

사실 학교에서 하는 프로젝트 중에, 다대다 관계를 일대 다 관계로 풀어낸 테이블이 있습니다.

그래서 Order  - (1:N) - Order_Item -(N:1) - Item  과 같은 관계가 되었고,

여기서 Order를 통해 연관된 Item에 접근해야 할 상황이 많이 생겼는데요,

 

저의 경우는 위에서 말씀드렸던 것 처럼, 

Order가 OrderItem을 함께 가져오도록 페치조인 한 후, 

OrderItem에서는 Item을 그냥 지연로딩으로 가져오는 방식으로 수행중인데요,

 

그렇다면 실무에서는 다대다 관계를 일대다, 다대일로 풀어내는것이 아니라,

아예 다대다 관계가 안나오도록 ERD를 설계하는 것인지 궁금합니다.

 

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. kkt169님

ERD에서는 다대다 관계가 정규화로 불가능합니다. 따라서 다대다 관계를 일대다, 다대일 관계로 풀어내야 합니다.

감사합니다.

kkt169님의 프로필 이미지
kkt169

작성한 질문수

질문하기