• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

마이크로 서비스 별 엔티티

21.08.14 21:01 작성 조회수 489

1

안녕하세요. 좋은 강의 감사합니다.

강의를 참고하며 Monolithic 프로젝트를 MSA 구조로 전환하고 있습니다.

각 서비스 별로 DB를 분리하면서 아래와 같은 고민이 한가지 생겼는데요.

Service 목록 :

User-service Item-serivce, Order-service, Cart-service

시나리오 :

Order-service의 API를 호출하여 주문조회를 한다.

이 때, '주문 상세 조회'를 요청하면 해당 주문의 '아이템 리스트'도 함께 가져온다.

질문 :

제시한 상황처럼 주문 조회, 장바구니 조회 등에서 아이템 조회가 빈번하게 일어납니다. 이 경우 아래 두가지 중 어떤 방식으로 설계하는 것이 좋을지 고민이 됩니다.

1. Item에 관한 Entity, Repository, Table 을 Order-service, Cart-service 도메인에 같이 포함시킨다. Item에 관한 데이터 변경이 일어날 시 Item-service, Order-service, Cart-service 의 Item 테이블도 같이 동기화해준다. (서비스 간의 통신을 줄이기 위해 고려했던 내용입니다. 근데 이 경우 Item table을 세가지 서비스에서 관리하기 떄문에 Identity 전략은 사용하지 못하고 UUID로 Item table의 PK를 관리해줘야 할 듯 합니다. 생각해보니 번거롭기도 하고 이상해지네요.)

2.  Item에 관한 Entity, Repository, Table 은 Item-serivce에서만 관리한다. Order-service, Cart-service 에서 조회, 주문으로 인한 수량 변경 등으로 Item 데이터 처리가 필요할 시 서비스 간 통신으로 Item-service에서 데이터를 조회, 변경한다.

개발에 있어서 Right way는 없겠지만 실무에서는 어떤 방식이 더 선호되는지 위 두가지 방식의 장단점은 어떤게 있을지 답변 부탁드립니다.

또, 고민에 도움이 될만한 키워드도 같이 알려주시면 학습하는데 큰 도움이 될 것 같습니다.

질문이 조금 길었네요. 감사합니다.

답변 1

답변을 작성해보세요.

3

안녕하세요, 이도원입니다. 

먼저, 답변이 늦어 죄송합니다. 

MSA를 설계할 때 가정 먼저 고려해야 할 부분이 "데이터 관리 주체가 어디에 있으며, 데이터의 종속성 부분과 동기화를 어떻게 처리할 것인가?"에 대한 부분입니다. 실제로 기존에 개발 된 애플리케이션을 MSA로 전환하기 어려운 이유 중에 하나가 바로, 데이터를 분리 (또는 통합)하는 작업이 만만치 않기 때문입니다. 말씀하신 시나리오 처럼, item-service가 다른 서비스와 함께 빈번하게 사용되고, 독립적으로 사용되는 경우가 드물거나, 연쇄작업으로 매번 조회되거나 업데이트 되어야 하는 상황이라면, 서비스의 분리가 맞는지를 먼저 검토해 보셔야 할 것 같습니다. 다음으로, 분리시키는 것이 맞다가 판단되셨다면, item-service에서 발생하는 데이터의 조작은       item-service에서 처리되고, 다른 서비스들은 이를 호출해서 사용하거나, 데이터 동기화를 위한 방법을 고려하셔야 합니다. 데이터 동기화의 방법은 반드시 데이터 스토리지를 item-service에서 사용하고, 다른 서비스와 분리시켜 사용하는 것만 고려하지 않고, 하나의 데이터베이스에 구축되어서 서비스간의 액세스만 분리하여 관리할 수 도 있습니다. 

추가로 위와 같은 상황을 위해, SAGA Pattern, Event Soucring을 같이 공부해 보시는 것을 추천 드립니다. 

감사합니다. 

채널톡 아이콘