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

신이만든지기님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

하나의 Repository에서 2개 이상의 서로 다른 유형의 엔터티를 반환해도 되나요?

21.03.22 16:26 작성

·

1.8K

0

안녕하세요.

좋은 강의 덕분에 업무에 많은 도움이 되고 있습니다.  감사합니다. ^^

다름이아니라, 강의 예제에 나온 repository에서는 보통 한 종류의 엔터티를 반환하는데요. 

예를 들면 OrderRepository 에서는 반환값이 Order, List<Order> ItemRepository에서는 Item, List<Item>을 반환합니다.  하지만 OrderRepository에서 Item, List<Item>을 반환하는 경우는 없더군요.

그런데 여러 테이블간에 조인을 거쳐 최종 조회되는 엔터티가 해당 Repository의 엔터티가 아닌 경우, 이럴 때는 어떻게 하는 게 좋을까요?

예를 들면 엔터티 간의 관계가 아래와 같을 때

Order : OrderItem  = 1 : N
Item : OrderItem = 1 : N
Item : ItemCategory =  1 : N
Category : ItemCategory = 1 : N

Order Id = 100인 Item의 List<Category>를 조회하고자 하는 경우

  1. OrderRepository에서 각 엔터티들의 조인을 거쳐 List<Category>를 반환하는 게 좋을까요?
  2. 아니면 각각의 Repository에서 필요한 엔터티를 반환받아 최종적으로 List<Category>를 찾는 것이 좋은가요?
  3. 아니면 제 3의 별도의 Repository를 만드는 것이 좋을까요?

여러개의 테이블을 조인하여 한 번의 쿼리로 데이터를 조회하는 것이 더 성능상 이점이 있을 것 같은데요

반면 Repository에서 서로 다른 유형의 엔터티를 반환해도 유지보수에 문제가 없을지 걱정이 듭니다.

김영한님의 조언 부탁드립니다.

답변 1

1

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

2021. 03. 22. 23:09

안녕하세요. 신이만든지기님^^

좋은 질문입니다.

결론부터 말씀드리면 1,2,3이 상황에 따라서 다 필요합니다.

리포지토리는 해당 엔티티를 저장하고 조회하는 것이 목적입니다.

그래서 OrderRepository는 가급적 Order를 반환하도록 하고,

Category 관련 데이터를 조회해야 하면 CategoryRepository를 별도로 만드는 것이 좋습니다.

물론 그 안에서 해당 엔티티를 찾기 위해 조인이 발생할 수도 있습니다.

그리고 해당 Repository에서 다른 유형을 반환해도 되지만, 아무래도 유지보수가 점점 어려워지겠지요?

통계 데이터 처럼 너무 많이 가공된 데이터를 조회해야 하면 해당 기능을 위한 별도의 리포지토리를 만드는 것이 좋습니다.

감사합니다.

신이만든지기님의 프로필 이미지

2021. 03. 23. 12:31

빠른답변 감사합니다. 

많은 도움 되었습니다. ^^

jayjoy05님의 프로필 이미지

2024. 07. 25. 22:36

영한님 안녕하세요! 위 질문에서 추가 질문이 있는데요! 내가 쓴 댓글의 게시글을 조회하고 싶을 때
  1. 댓글 레파지토리에서 유저 아이디로 조회 후 댓글 엔티티로 리턴을 받아서 연관관계매핑을통해 getPost 하는게 좋을까요?
  1. 댓글 레파지토리에서 페치조인해서 postEntity(게시글 엔티티)를 바로 반환하는게 좋을까요?
  2. 게시글(Post)레파지토리에서 조인을 통해서 바로 게시글 엔티티를 리턴 받는게 좋을까요?
개인적으로는 댓글을 통해 게시글을 조회하므로 1,2번이 좋다고 생각하지만 영한님 의견이 궁금합니다..! 실무에서도 이런 상황에서 어떤방법을 선택하는지 궁금합니다
김영한님의 프로필 이미지
김영한
지식공유자

2024. 07. 26. 14:24

안녕하세요. jayjoy05님

이 부분은 정답이 없습니다. 실무 관점에서는 가급적 SQL이 적게 나가는 방법을 선호합니다 🙂

감사합니다.