IT/기초 지식

[DDD] 바운디드 컨텍스트(bounded context) - 실전편

개발자 두더지 2023. 5. 22. 21:00
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다.

 

 

바운디드 컨텍스트 구현의 기본 이미지


 결론부터 말하자면, 기본적으로는 "1컨텍스트 = 1어플리케이션 " 이라고 생각하면 된다. 이것을 바탕으로 용도나 구현 코스트등을 고려하면서 조금씩 설계를 바꾸는 것도 검토할 수 있다.

 이전 포스트에서 소개했던 아래의 두 개 컨텍스트를 이용해서 설명하자면 이렇게 두개의 어플리케이션을 만들게 된다는 것이다.

도메인층을 외부 경계와 격리하고 외부에 공개하는 작업을 주변 층에서 정의하며, 최종적으로 마이크로 서비스 2개를 만들어진다고 생각하면 된다. 

 이렇게 된다면 DB를 다루는 방법이나 통신을 어떻게 할지에 대해서도 자연스럽게 생각하게 될 것이다. 이 부분에 대해서는 아래에서 설명하도록 하겠다.

 

 

DB는 어떻게 다룰까?


 기본적으로는 1 어플리케이션 1DB라고 생각하길 바란다. 이것이 설계에서 매우 중요하다. 앞서 설명했듯 마이크로 서비스라고 생각하면, 컨텍스트의 모듈간의 의존성을 최대한 없애고 릴리즈 사이클 등을 독립적으로 다루고 싶어진다.

 이때에 DB를 공규하고 있으면 모듈 간의 결합도가 당연히 높아진다. 설계상으로도 무심코 다른 컨텍스트를 외부 키 제약 등으로 연관지어 버리는 등 물리적으로 제약이 가해지지 않으면 결합도를 높여 버릴 위험이 올라간다.

 또한, 개념적으로도 컨텍스트에 따라 "상품"이라는 것은 다른 문제로 존재하는 것에 반해, DB를 공유하게 되면 "상품"이라는 테이블은 어느쪽의 모델인지에 대한 모순이 발생하는 등과 같은 모순이 발생하게 된다.

 따라서 컨텍스트를 나눴을 때에 DB를 나눌 것을 반드시 검토해보길 바란다. 또한, 물리적인 인스턴스를 나누지 않아도, 스키마를 나누는 것도 하나의 방법이 될 수 있다. 인프라 구성, 예산등 여러 요소를 고려하여 방법을 선택하길 바란다.

 

 

컨텍스트간 어떻게 통신할까?


 동기 통신, 비동기 통신 두 가지 선택이 있다.

  • 동기 통신 : 네트워크 경유의 다이렉트 콜 (REST API등)
  • 비동기 통신 : 메세지 큐를 이용한 이벤트 통신

 비동기 통신 기반은 지금까지는 매니지드 서비스인 SQS를 많이 이용해왔지 않은가?

 이 두 개의 선택지중 어느쪽을 고를지에 대해서는 "리퀘스트 결과를 동기적으로 획득하고 싶다", "비동기로 하여 다른쪽에 문제가 발생해도 괜찮도록 하고 싶다"라는 요건을 검토해야한다. 이것은 DDD적인 검토보다는, 마이크로 서비스로써의 검토 범위이다. 따라서 이 부분에 대한 설명은 굉장히 장황해지므로 일단 생략하도록 하겠다. 

 

 

어플리케이션은 반드시 나눠야하는가?


 기본적으로는 나누는 것이 좋다. 그러나 비용 대비 효과를 고려했을 때 간략화하는 것도 가능하다. 간략화한다면 다음과 같은 구성이 될 수 있다.

 명확히 컨텍스트적으로 별개의 설계라도 컨텍스트 내 객체 수가 적고 향후에 확대할 예정이 거의 없다면 패키지 구성을 의식하면서 한 어플리케이션 내에 배치해도 괜찮다.

 

다른 컨텍스트, 동일 어플리케이션으로 한 경우의 DB

 이 경우 DB로 동일한 인스턴스를 사용해도 좋지만, 앞과 같은 이유로 반드시 다른 스키마로 하자. 동일 스키마라면 설계가 나빠질뿐만 아니라 시스템이 시스템이 커지게 될 수록 다른 어플리케이션으로 분리하는 것이 어려워 진다.

 

다른 컨텍스트, 동일 어플리케이션으로 한 경우 메소드의 호출

 메소드의 호출에 관해서는 이것도 동기처리와 비동기처리를 나눠서 고려할 수 있다.

 동기처리는 마이크로 서비스와 같은 네트워크 경우의 통신이 불필요해져, 몇 가지 선택권을 고려할 수 있게 된다.

  • 다른 컨텍스트와 같이 어댑터와 인터페이스를 내부쪽으로 작성하여 호출한다.
  • 엔티티간의 직접 호출하는 것을 허가한다.

  이 문제에 대해서도 어디까지 확실히 하고 싶은지를 생각하면서 판단하도록 하자. 단, 이 경우 물리적으로 호출 방법을 강제하기 어렵기 때문에, 리뷰등으로 담보하는 것이 필요하다.

  또한, 비동기일 경우 이벤트를 이용하여 의사소통하는 것은 다른 어플리케이션의 경우와 크게 다르지 않다. 


참고자료

https://little-hands.hatenablog.com/entry/2017/12/07/bouded-context-implementation

 

728x90