• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

MSA 환경에서 쿼리는 어떻게 하는게 좋을까요?

22.02.04 13:56 작성 조회수 987

0

안녕하세요 강사님!

커리큘럼에서 스프링 데이터 JPA까지 들었습니다.
강의내용에서나 커뮤니티 답글에 종종 MSA 관련 설명도 들었는데요.
강의 들으면서 최적화와 관련된 내용을 많이 봤는데 이런 MSA 환경에선 어떻게 해결하셨는지 궁금해 질문 남깁니다.

서비스 구성은 예를들면 이렇습니다.

Member: 멤버만 관리하는 서비스
Order: 주문 정보 관리하는 서비스
admin: 관리자용 서비스

서비스별 DB는 분리되어있습니다.

Member DB : Member(id,name)

Order DB : Order(id, memberId, title) // memberId는 다른 db의 pk이므로 fk는 없습니다.

 

관리자용 서비스에서 멤버별 주문횟수와 최근 주문 제목을 리스트로 보여주려 합니다.
페이징이 있는 리스트이며 멤버이름 또는 주문 제목 또는 둘다(통합검색)으로 검색,정렬 할 수 있습니다.

만약 모놀리틱 서비스인 경우에는 pageable을 request로 받아서 spring data jpa를 활용하여 repository에서 Page 객체를 반환하는 기능과 JPQL이나 QueryDSL로 페이징과 검색을 해결 할 수 있을것 같은데요

MSA에서는 DB가 분리되어있다보니 어떻게 해결할지 고민입니다.

제가 생각한 방법은 3가지정도가 있는데요.

1. member 정보들을 member db에 쌓지만 각 db(주문, 배송 등)에 따로 또 쌓고(주문에서 사용되는 멤버만) 이벤트 드리븐 아키텍쳐 등으로 동기화한 뒤 jpql, querydsl 사용한다.

2. 엘라스틱 서치 등을 사용한 검색용 서비스를 만든다. (하지만 큰 기능이 아니라면??)

3. Order서비스에서 Member 서비스에 이름으로 검색 요청을 한 뒤 결과로 id값들을 받아서 Order 서비스에서 쿼리를 만들어 사용한다. (이름 검색이 아닐경우에는 Order 서비스에서 검색한 뒤 나온 id값들을 Member서비스에 요청해 매핑한다.)

어떤 방법이 정석적인 방법일까요??

요청이 많지 않은 admin 서비스는 3번으로

데이터가 많아 통합 검색이 필효한 서비스는 2번으로

요청이 많지만 데이터는 많지 않은 서비스는 ??

으로 생각하고 있는데 괜찮은 방법일까요?

답변 1

답변을 작성해보세요.

4

안녕하세요. midasin5님

뭔가 정답이라고 딱 답을 드리면 좋겠지만, 사실 1,2,3 모두 정답이 될 수 있습니다.

현재 비즈니스 상황에 따라서 1,2,3을 적절하게 섞어서 구현해야 합니다.

제가 선호하는 방법은 현재 상황에 맞는 가장 단순하고 간단한 방법을 선택하는 것입니다.

감사합니다.