• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

repository service

20.10.16 22:25 작성 조회수 316

0

김영한 개발자님 좋은 강의 감사드립니다.

유익한 강의를 따라 스프링 데이터 Jpa를 공부하니 호기심에 이것저것 궁금한게 생기네요. 초보 개발자인 저는 JpaRepository<T, ID>를 활용하면서 설계패턴에 대한 고민을 시작했습니다. 설계패턴을 이론으로 배울때는 별 생각없었는데, 코딩하면서 적용해보니깐 설계하기 애매한게 많더군요. 굉장히 흥미롭고, 그래서 선배 개발자님의 경험이 듣고 싶습니다.

1. JpaRepository는 T에 들어가는 하나의 테이블을 위해서 공통 인터페이스들을 제공해주고 있잖아요. 그렇다면 여러개의 테이블을 위해서는 일일이 JpaRepository를 따로 만들어줘야 할텐데요.

강의에서는 주로 하나의 테이블만을 이용해서 쿼리를 날렸기에, 하나의 JpaRepository로 충분했는데요. 테이블이 한두개면 모르겠는데 테이블 숫자가 많아지면 그에 맞춰 repository 숫자도 계속 늘려줘야 하는건가요?

가령 수백개의 테이블이 있을 경우에도 일일이 repository를 따로 만들어주는 건가요?

2. 테이블당 하나씩 repository를 만든다면, join 쿼리처럼 여러 테이블을 동시에 참조하는 쿼리는 어떤 테이블을 위한 repository에 작성해야할지 모르겠습니다.

예를들어 : '주문자'와 '상품'을 n:n 관계로 잇는 '주문' 테이블을 조회한다고 가정해볼경우. 제가 주문한 상품에 대한 상세정보를 가져오려고 쿼리를 짜면 다음과 같을 것입니다.

select (상품명, 상품가격, 유통기한) from '주문' join '상품' on '주문'.상품id = '상품'.id where '주문'.사용자id = 'qwer1234'

그렇다면 이 쿼리를 '주문자repository'에서 작성해야할지, '상품repository'에서 작성해야할지, '주문repository'에서 작성해야할지 모르겠습니다.

테이블 단위로 repository를 만든다면, 여러 테이블을 넘나들며 query를 날리는 비즈니스 로직이 있을경우, 어떤 테이블을 위한 repository에서 그 쿼리를 작성해줘야 할까요?

join 쿼리만을 위한 repository를 따로 만들어줄까도 생각해봤고, service 측에서 작성해줄까도 생각을 해봤는데요. service 측에서 작성해주는 것은 service랑 repository를 분리하는 것이 퇴색되는 것 같습니다. join을 위한 repository를 따로 만드는 것은 개발하다 구조적인 문제가 생길지 않생길지 몰라서 확신이 안섭니다.

물론 위에 대한 답변들은 프로젝트의 규모나 비즈니스 로직에 따라서 어떻게 분리할지, 통합할지 얘기가 달라지겠지만,

김영한 개발자님은 실무에서 어떻게 균형있게 분리하셨는지 경험을 듣고 싶습니다.

감사합니다.

답변 2

·

답변을 작성해보세요.

1

임병윤님의 프로필

임병윤

질문자

2020.10.16

좋은 답변 정말 감사드립니다 선배님~^^

1

안녕하세요. 병윤님 좋은 질문입니다.

먼저 repository 자체를 줄이는 설계 방법이 있는데, 바로 DDD의 aggregate root라는 개념입니다.

이 개념을 학습해보시면 repository를 줄일 수 있는 방안이 떠오르실꺼에요.

(글로 짧게 설명드리기에는 깊이가 있는 내용이어서 책이나 관련된 내용을 검색해보시면 도움이 되실꺼에요^^)

2. join 쿼리처럼 여러 테이블을 동시에 참조하는 쿼리는 어떤 테이블을 위한 repository에 작성해야할지 모르겠습니다.

-> 현실적으로 조인이 없는게 가장 좋겠지만, 또 그러면 현실을 부정하게 되니^^;;; 네 이런 경우에는 주 테이블이 중요합니다. 예를 들어서 주문을 중심으로 조인한 데이터가 필요하면 주문 리포지토리에 만듭니다. 만약 상품이 주 테이블이라면 상품과 관련된 리포지토리에 만드는 것이 좋습니다. 대부분의 경우에는 이렇게 주 테이블이 명확하기 때문에 크게 고민이 안됩니다.

그런데 매우 복잡한 통계처럼 주 테이블이 명확하지 않은 경우가 있는데요. 이때는 해당 비즈니스용 별도의 리포지토리를 생성합니다.

도움이 되셨길 바래요^^