이 글은 링크 및 다른 자료들을 참조 및 요약한 글입니다. 지식적인 한계로 인해 사실과는 다른 내용이 있을 수 있습니다. 해당 내용이 있다면, 언제든 알려주시면 감사하겠습니다.
마이크로 서비스를 검색하면 이렇게 정의합니다.
간단한 설명으로는 https://www.youtube.com/watch?v=ZRpsB3ODr6M 코딩애플에서 깔끔하게 정리해 두었습니다.
본 글에서는 마이크로서비스의 필요성을 '3S' 로 요약합니다.
이 세 가지를 제공하기 위해서 큰 서비스를 잘게 쪼갤 필요가 있습니다.
또한 서비스를 잘게 쪼개는 것 뿐만 아니라 각 서비스 간 독립성도 유지시켜 주어야 합니다.
'3S'의 Speedy를 위해서는 서비스를 이터래이티브(Iterative)하게 만들 필요가 있습니다.
그래서 필요한 것이 마이크로서비스 라는 수단입니다.
마이크로 서비스를 구현하기 위해 필요한 것은 다음과 같습니다.
첫째, 마이크로 서비스를 나누어서 설계하고 개발하는 방법론, DDD(Domain Driven Design) 입니다. 뒤에 자세히 설명하도록 하겠습니다.
둘째, 마이크로서비스를 개발, 배포, 운영할 수 있는 아키텍쳐인 MSA(Micro Service Architecture) 도 필요합니다.
셋째, 좋은 MSA와 마이크로 서비스를 만들기 위해선 MSA Features와 12Factors라는 특성과 요소들을 갖추어야 합니다.
12Factors 는 https://12factor.net/ko/ 를 참조하면 좋을 것 같습니다.
넷째, 큰 서비스가 마이크로화 되면서 생기는 문제들을 해결하기 위해서 '마이크로서비스 패턴'과 'MSA'의 다양한 기술들이 적용되어야 합니다.
위의 내용을 요약한 사진은 다음과 같습니다.
Business Domain의 상황(Context, 대상 사용자, 상황)에 맞게 설계하자는 컨셉입니다.
전략적 설계를 위해 Business Domain의 상황(Context)을 Event storming으로 공유하고, 비즈니스 목적별로 서비스들을 그룹핑합니다.
( 카카오에서 DDD를 진행할 때 했던 이벤트 스토밍의 흔적입니다. https://tech.kakao.com/2022/12/12/ddd-of-recommender-team/)
Bounded Context & Domain Model
도메인 모델들을 나누어 컨텍스트 경계를 분명히 하는 것을 바운디드 컨텍스트라고 합니다.
Bounded Context는 Biz Domain의 사용자, 프로세스, 정책/규정 등을 고유한 비즈니스 목적별로 그룹핑한 것입니다. 사용자, 프로세스, 정책/규정들을 그 Biz Domain의 Context라고 말할 수 있으므로 Bounded Context는 Domain안의 서비스를 경계 지은 Context의 집합이라고 할 수 있습니다.
Domain Model은 비즈니스 도메인의 서비스를 추상화한 설계도입니다. Domain을 Sub Domain으로 분해한것과 Bounded Context가 Domain Model입니다.
Bounded Context & Micro Service
Context Map
Bounded Context 간의 관계를 도식화한 Diagram 입니다.
( 원래는 각각의 데이터의 흐름도 적어줘야 하지만, 카카오에서 진행했던 DDD는 이런 느낌입니다. )
( 이런 예제가 더 이해하기 좋을 수도 있을 것 같습니다. )
Ubiquitous Language
Strategic Design의 결과물 : Domain Model
한 단위로 취급 가능한 경계 내부의 도메인 객체로 한 개의 루트 엔티티와 기타 엔티티 + VO로 구성됩니다.
어그리게이트는 고유의 비즈니스 목적 수행을 위한 데이터 객체들의 집합입니다.
Aggregate의 규칙은 RPO가 있습니다.
개발을 위한 구체적인 설계도입니다.
Model Driven Design
Layered Architecture
Tactical Design시 목적별 계층으로 나누어 설계하는 것을 의미합니다.
Presentation, Service, Domain, Data Layer로 나누는 것을 추천합니다.
Aggregate & Factory
Aggregate는 Entity들을 대표하는 추상화된 객체입니다. 유연한 어플리케이션 개발을 위해 Entity간에 직접 커뮤니케이션을 하지 않고 Aggregate간에만 커뮤니케이션하도록 설계합니다.
Factory는 Aggregate의 생성 처리를 담당하는 객체입니다. 개발에 따라선 Entity의 생성을 담당할 수도 있습니다.
Repository
https://happycloud-lee.tistory.com/261?category=8322466 - 마이크로서비스
https://happycloud-lee.tistory.com/94 - DDD 관련
https://steemit.com/kr/@frontalnh/domain-driven-design - DDD 관련 원문 번역글
https://velog.io/@dnflekf2748/DDDDomain-Driven-Design - DDD 예시
https://tech.kakao.com/2022/12/12/ddd-of-recommender-team/ - 실제 도입 사례