도메인 주도 설계 첫걸음 - 14장 마이크로서비스
범위
[Part 4] 다른 방법론 및 패턴과의 관계 - 14장: 마이크로서비스
개념 정리
- 서비스: 미리 정의된 인터페이스를 사용해 하나 이상의 역량에 접근하기 위한 메커니즘.
- 미리 정의된 인터페이스: 서비스로부터 데이터를 넣고 빼는 모든 메커니즘.
- 마이크로서비스: 자신의 마이크로 퍼블릭 인터페이스, 즉, 마이크로 프런트 도어(micro-front door)에 의해 정의되는 서비스.
- 함수(function): 모듈이 해야 하는 일. 즉, 비즈니스 기능.
- 로직(logic): 모율의 비즈니스 로직. 즉, 모듈이 자신의 비즈니스 기능을 구현하는 방법.
- 애그리게이트(Aggregate): 내부 비즈니스 규칙과 불변성, 로직의 복잡성을 감싸는 개별적인 비즈니스 기능 단위.
책에서 기억하고 싶은 내용
서비스란 무엇인가?
- 서비스의 퍼블릭 인터페이스는 서비스 자체, 즉, 서비스가 노출하는 기능을 정의한다.
- 잘 표현된 인터페이스는 서비스가 구현한 기능을 설명하기에 충분하다.
마이크로서비스란 무엇인가?
서비스형 메서드: 완벽한 마이크로서비스?
설계 목표
- 마이크로서비스 아키텐처의 목표는 유연한 시스템을 만드는 것이다.
시스템의 복잡성
- 적절한 마이크로서비스 기반 시스템을 설계하려면 글로벌 복잡성과 로컬 복잡성 모두를 최적화 해야 한다.
- 로컬 복잡성: 각각의 개별 마이크로서비스의 복잡성
- 글로벌 복잡성: 전체 시스템의 복잡성
깊은 서비스로서의 마이크로서비스
- 이 같은 모듈은 ‘유동적인 부분’을 만들어내고, 결국, 복잡성을 내포하는 대신 전체 시스템에 우발적 복잡성을 발생시킨다.
깊은 모듈로서의 마이크로서비스
- 깊은 모듈의 개념은 마이크로서비스 패턴과 다르다.
- 마이크로서비스는 엄밀히 물리적은 경예를 나타내지만 모듈은 논리적 경계와 물리적 경계를 모두 나타낼 수 있기 때문이다.
- 단일 비즈니스 메서드를 구현하는 서비스는 얕은 모듈이다.
- 시스템의 복잡성
- 깊은 모듈은 시스템의 글로벌 복잡성을 줄여준다.
- 얕은 모듈은 로컬 복잡성을 감싸지 않는 구성요소를 도입해야 해서 글로벌 복잡성이 증가한다.
- 얕은 서비스는 수많은 마이크로서비스 지향 프로젝트가 실패하는 원인이다.
도메인 주도 설계와 마이크로서비스의 경계
바운디드 컨텍스트
- 마이크로서비스와 바운디드 컨텍스트 모두 물리적 경계다.
- 바운디드 컨텍스트와 마찬가지로 마이크로서비스도 단일 팀이 소유한다.
- 바운디드 컨텍스트와 동일하게, 충돌하는 모델은 인터페이스가 복잡해지므로 마이크로서비스로 구현할 수 없다.
- 마이크로서비스가 사실상 바운디드 컨텍스트다.
- 마이크로서비스와 바운디드 컨텍스트의 관계는 비대칭이다.
- 마이크로서비스는 바운디드 컨텍스트로 볼 수 있지만, 모든 바운디드 컨텍스트가 마이크로서비스인 것은 아니다.
애그리게이트
- 바운디드 컨텍스트는 가장 넓은 유효한 경계를 설정.
- 애그리게이트의 경계는 가능한 한 좁게 설정.
- 애그리게이트를 여러 물리적 서비스 또는 바운디드 컨텍스트로 분해하는 것은 최적이 아닌 원치 않는 결과를 초래한다.
- 애그리게이트와 자신의 하위 도메인에 있는 다른 비즈니스 엔티티와의 관계가 강할수록 얕은 개별 서비스가 된다.
- 애그리게이트를 서비스화해 모듈형 설계를 만들어내는 경우도 있다.
- 대부분 이 같은 작은 크기의 서비스는 전체 시스템의 글로벌 복잡성을 증가시킨다.
하위 도메인
- 마이크로서비스를 설계하는 데 좀 더 균형 잡힌 휴리스틱은 비즈니스 하위 도메인의 경계와 서비스를 일치시키는 것이다.
- 비지니스 도메인 관점에서 보면 하위 도메인은 역량이 어떻게 구현되는지 설명하지 않고 비즈니스 역량(무엇을 하는 비즈니스인지)을 설명한다.
- 기술적 관점에서 보면 하위 도메인은 응집된 유스케이스의 집합을 대표한다.
- 같은 비즈니스 도메인 모델을 사용하고, 같거나 밀접하게 관련된 데이터를 다루며, 강한 기능 연관성을 갖는다.
- 유스케이스 중 하나에서 비즈니스 요구사항을 변경하면 다른 유스케이스도 영향을 받을 가능성이 높다.
- 하위 도메인을 마이크로서비스 설계를 위한 안전한 경계를 만드는 방법.
- 하위 도메인의 크기와 ‘어떻게’보다는 ‘무엇을’에 중점을 둔 기능이 하위 도메인을 자연스럽게 깊은 모듈로 만든다.
- 하위 도메인을 설명하는 ‘기능’은 더 복잡한 구현 상세인 ‘로직’을 캡슐화한다.
- 하위 도메인에 포함된 유스케이스의 응집력이 결과 모델의 깊이를 보장한다.
- 유스케이스를 작은 케이스로 쪼개면 더 복잡한 퍼블릭 인터페이스를 만들고 모듈은 더욱 얕아진다.
- 하위 도메인을 마이크로서비스로 만드는 것은 대부분의 마이크로 서비스를 위한 최적을 솔루션을 만드는 안전한 휴리스틱이다.
- 솔루션은 비즈니스 도메인에 의존할 뿐 아니라 조직의 구조와 비즈니스 전략, 비기능 요구사항에도 의존한다.
- 환경의 변화에 따르 소프트웨어 아키텍처와 설계를 끊임없이 적응시키는 것이 중요하다.
마이크로서비스의 퍼블릭 인터페이스 압축하기
- 도메인 주도 설계는 서비스의 경계를 찾는 데 쓰일 뿐만 아니라, 서비스를 깊게 만드는 데도 도움을 준다.
오픈 호스트 서비스(OHS)
- 오픈 호스트 서비스는 비즈니스 도메인의 바운디드 컨텍스트 모델을 시스템의 다른 구성요소와 연동하는 데 사용되는 모델과 분리해준다.
- 연동 지향 모델인 공표된 언어를 도입하면 시스템의 글로벌 복잡성이 줄어든다.
- 서비스 사용자에게 영향을 미지지 않고 서비스의 구형을 발전시킬 수 있다.
- 공표된 언어는 좀 더 제한된 모델을 노출한다.
충돌 방지 계층(ACL)
- 서비스를 다른 바운디드 컨텍스트와 연동할 때 복잡성을 줄여준다.
- ACL 서비스는 바운디드 컨텍스트를 사용하는 로컬 복잡성과 시스템의 글로벌 복잡성을 모두 줄여준다.
- ACL 서비스 덕분에 바운디드 컨텍스트를 사용할 때의 비즈니스 복잡성과 연동할 때의 복잡성이 분리된다.
결론
- 모든 마이크로 서비스는 바운디드 컨텍스트다.
- 모든 바운디드 컨텍스트가 반드시 마이크로서비스인 것은 아니다.
- 기본적으로 마이크로서비스는 서비스의 가장 작은 유효한 경계를 정의하는 반면, 바운디드 컨텍스트는 모델 전반의 일관성을 보호하고 가장 넓은 유효한 경계를 나타낸다.
This post is licensed under CC BY 4.0 by the author.