작성
·
816
0
안녕하세요.
MSA 간의 통신을 위해서, Feign Client 를 활용하거나 Kafka 를 사용할 때
주고 받을 정보를 통일시키기 위해서 DTO 객체를 활용할텐데요.
서로 동일한 DTO 객체를 사용해야 하는데 이러한 DTO 는 보통 실무에서 어떻게 관리되는지 알고 싶습니다.
예를 들어 User Service 에서 Order Service 쪽에 주문정보를 조회 요청할 때, ResponseOrderDto 를
서로 이용할텐데 동일한 DTO 를 User 에서도 가지고 있어야 하고, Order 에서도 가지고 있어야 합니다.
MSA 에서 각 마이크로서비스 단위로 개발팀이 구성되어 있다고 가정하면 ResponseOrderDto 는
Order 마이크로서비스 쪽에서 생성한 뒤, User 마이크로서비스 쪽에 공유 해주어야 하는 방식인가요?
만약 해당 DTO 가 변경이 일어나면 이떄마다 이를 사용하는 쪽에 전달해야 된다는건데
이런 부분을 실무에서 어떻게 하고 있는지 궁금합니다.
답변 1
0
안녕하세요, 이도원입니다.
마이크로서비스간, 또는 다른 시스템 간의 데이터 공유를 위해서는 별도의 라이브러리 형태로 만들어 공유할 수 있습니다. 말씀하신 OrderDto에 대한 경우에도 Order 서비스를 개발하는 쪽에서 전달할 수도 있지만, Order에 대한 Client 부분과 Server 부분을 각각 구현해서 제공하는 DTO를 위한 라이브러리를 만들고 해당 DTO를 각각의 서비스에서 Domain Model로 변환해서 사용할 수 있습니다.
Maven 프로젝트에서 라이브러리를 사용하는 것과 같은 방식이라고 생각하시면 될 것 같습니다. 하나의 라이브러리가 버전 업이 되었을 경우, 해당 버전으로 변경하지 않은 애플리케이션이 있다면, 오류가 발생하거나 이전 코드의 로직이 실행되는 것과 같은 방법입니다.
따라서, 서비스와 데이터의 경계에 대한 구분과 데이터의 종속성을 나누는 것이 마이크로서비스에서 가장 중요한 부분이고 어려운 부분이라고 생각됩니다. 단순한 모델일 경우 마이크로서비스화 하는 것은 비효율적이며, 어느정도 복잡도를 가지면서 서비스 분리가 가능한 모델이 마이크로서비스화 하는데 적합하다고 생각되는데, 위와 같이 Order와 User 사이의 모델에서 DTO를 구분해서 개발해야 할 경우라면, 독립적인 라이브러리 형태로 개발하여 공유하는 게 좋을 것 같습니다.
감사합니다.