[도서] 도메인 주도 설계로 시작하는 마이크로서비스 개발 – 실무와 연결된 인사이트
- 저자: 한정헌, 유해식, 최은정, 이주영
- 출판사: 위키북스
1. 이 책을 읽게 된 계기
마이크로서비스 아키텍처(MSA)는 최근 몇 년간 빠르게 확산되며 많은 개발팀이 이를 도입하고 있다. 그러나 단순히 서비스를 작게 나눈다고 유지보수가 쉬워지는 것은 아니다. 중요한 것은 각 서비스가 독립성을 유지하면서도 하나의 시스템처럼 원활하게 동작하도록 설계하는 것이다.
개발을 하면서 "이 서비스를 어디까지 독립적으로 분리할 수 있을까?" 라는 고민을 자주 하게 된다. 특정 도메인의 기능을 설계할 때, 향후 기능이 확장되더라도 유연하게 대응할 수 있는 구조를 만드는 것이 중요하다. 하지만 서비스 간 강한 의존성이 발생하면, 오히려 모놀리식보다 더 복잡한 시스템이 되어버리는 문제가 생길 수 있다.
실무에서도 여러 개의 서비스가 하나의 기능을 수행하기 위해 서로 API를 호출하거나 동일한 데이터베이스를 공유하는 상황을 자주 마주쳤다. 특히, 트랜잭션이 여러 서비스에 걸쳐 발생할 때 데이터 정합성을 유지하는 것이 쉽지 않았다.
이 책 "도메인 주도 설계로 시작하는 마이크로 서비스 개발"은 이러한 고민을 해결할 실마리를 제공했다. 특히 도메인 주도 설계(DDD)를 기반으로 마이크로서비스를 설계하는 방법을 실무에 적용할 수 있도록 설명하고 있어, "이 개념을 실제 프로젝트에서 어떻게 활용할 수 있을까?" 라는 관점에서 읽게 되었다.
그중에서도 가장 흥미로웠던 부분은 분산 트랜잭션을 다루는 방식(SAGA 패턴, CQRS 등) 이었다. 실무에서 겪었던 문제들과 직접적으로 맞닿아 있어 더욱 깊이 있게 읽게 된 부분이었다.
2. 실무에서 분산 트랜잭션 처리 패턴을 고민한 경험
🔹 실무에서 겪은 문제: 서비스 간 트랜잭션 관리의 어려움
실무에서 한 번은 두 개 이상의 서비스에서 데이터를 동시에 처리해야 하는 기능을 개발해야 했던 적이 있다.
- 하나의 주요 서비스에서 데이터를 생성하면,
- 다른 서비스에서도 이를 반영해야 하는 구조였는데,
- 단순한 DB 트랜잭션으로 해결할 수 없었고,
- 서비스 간 API 호출이 실패했을 때 롤백을 어떻게 할 것인지가 고민이었다.
그때는 단순히 HTTP API 호출 후 응답을 기다리는 방식으로 해결하려 했지만, 부분적인 실패 발생 시 데이터 정합성이 깨지는 문제가 생겼다. 예를 들면,
- 첫 번째 서비스에서는 데이터가 저장되었지만,
- 두 번째 서비스에서 예외가 발생하면
- 이미 저장된 데이터를 되돌릴 방법이 없었다.
🔹 책에서 배운 해결책: SAGA 패턴을 활용한 트랜잭션 관리
이 책에서는 분산 트랜잭션을 관리하는 방법으로 SAGA 패턴을 설명한다.
- SAGA 패턴은 하나의 긴 트랜잭션을 여러 개의 작은 트랜잭션으로 나누고,
- 각 트랜잭션이 독립적으로 실행되도록 하며,
- 만약 하나의 트랜잭션에서 오류가 발생하면 이전에 수행된 작업을 보상(Compensation)하는 방식이다.
책에서 소개된 방식은 크게 두 가지였다.
- 오케스트레이션 방식
- 중앙에서 SAGA 코디네이터가 모든 트랜잭션의 진행을 관리한다.
- 각 서비스가 트랜잭션을 완료하면 코디네이터가 다음 작업을 수행하도록 지시한다.
- 실무에서 적용한다면, 워크플로우 관리 도구(Camunda, Temporal 등)를 활용할 수도 있을 것 같다.
- 코레오그래피 방식
- 각 서비스가 이벤트 기반으로 트랜잭션을 수행한다.
- 예를 들어, 서비스 A에서 데이터를 생성하면 이벤트를 발행하고, 이를 구독한 서비스 B가 적절한 액션을 수행하는 방식이다.
- 이를 위해 Kafka 같은 메시지 브로커를 활용하는 방법도 고려할 수 있다.
🔹 이 개념을 실무에서 적용할 수 있을까?
SAGA 패턴을 적용한다면, 서비스 간 API 호출을 최소화하면서도 데이터 일관성을 보장할 수 있는 구조를 만들 수 있다.
최근 개발 중인 프로젝트에서도 서비스 간 의존성이 높은 트랜잭션이 많아지고 있는데, 이를 해결하기 위해 이벤트 기반으로 트랜잭션을 분리할 수 있는 구조를 고민하고 있다.
- 단순한 API 호출 방식보다는, Kafka 같은 메시지 큐를 활용하여 이벤트 기반으로 처리하면 트랜잭션 실패 시 유연하게 대처할 수 있을 것 같다.
- 예를 들어, 주문 시스템에서 결제와 배송을 관리할 때, 결제 서비스와 배송 서비스가 직접 API로 연결되는 방식이 아니라 이벤트를 주고받는 방식으로 설계하면 더 안정적인 시스템을 만들 수 있을 것 같다.
3. 핵심 내용과 실무에서의 연결점
이 책은 크게 DDD 개념 정리와 이를 마이크로서비스 환경에서 어떻게 적용할지에 대한 설명으로 구성된다.
🔹 도메인 주도 설계(DDD) 개념 정리
- 엔티티(Entity), 값 객체(Value Object), 애그리게이트(Aggregate), 리포지토리(Repository) 등 DDD의 핵심 개념을 다룬다.
- 특히 경계 컨텍스트(Bounded Context) 개념을 강조하며, 서비스 간 경계를 설정하는 것이 왜 중요한지 설명한다.
- 예전 프로젝트에서 특정 기능이 여러 서비스에서 중복으로 구현되었던 경험이 떠올랐다. 당시에는 이를 해결하기 위해 단순히 API 호출을 통해 데이터를 공유했지만, 결국 서비스 간 결합도가 높아져 유지보수가 어려웠다. 이 책에서 말하는 경계 컨텍스트 개념을 적용했다면 더 나은 구조를 설계할 수 있었을 것이다.
🔹 마이크로서비스 환경에서 DDD 적용
- 단순한 CRUD 기반이 아닌, 도메인 모델을 활용한 서비스 설계 방식이 강조된다.
- 이벤트 스토밍(Event Storming)을 통해 도메인을 분석하고 서비스 간 경계를 정의하는 방법이 소개된다.
- 데이터 일관성을 유지하기 위한 SAGA 패턴, CQRS(Command Query Responsibility Segregation) 패턴 등도 설명된다.
- 특히, 비즈니스 로직이 서비스 여러 곳에 분산되지 않도록 각 서비스 내부에서 도메인 규칙을 유지하는 것이 중요하다는 점을 강조하는데, 실무에서도 이 점이 상당히 중요하다고 느꼈다.
4. 실무에서 적용해보고 싶은 점
이 책을 읽으면서 “이 개념을 실제 프로젝트에 어떻게 적용할 수 있을까?”라는 고민을 계속하게 되었다.
- 서비스 간 의존성을 줄이기 위한 경계 설정
- 이전에 개발했던 시스템에서는 여러 기능이 하나의 큰 서비스 안에서 돌아가고 있었고, 이를 마이크로서비스로 분리하는 과정에서 서비스 간 강한 결합도가 문제였다.
- 이 책에서 소개된 경계 컨텍스트와 컨텍스트 매핑 개념을 적용하면, 서비스 간 명확한 역할을 구분하고 불필요한 의존성을 줄일 수 있을 것 같았다.
- 예를 들어, 특정 도메인의 핵심 데이터를 여러 서비스에서 직접 참조하기보다는, 이벤트 기반 아키텍처나 API 게이트웨이를 활용해 데이터를 공유하는 방안을 고민할 수 있다.
- 이벤트 기반 아키텍처(Event-Driven Architecture) 적용
- 현재 진행 중인 프로젝트에서는 여러 서비스가 하나의 공통 데이터베이스를 참조하는 방식으로 운영되고 있다.
- 이 방식은 초기 구현은 쉽지만, 서비스가 늘어나면서 데이터 일관성을 유지하는 것이 어려워지는 단점이 있다.
- 이 책에서 설명하는 이벤트 기반 설계와 SAGA 패턴을 적용하면, 개별 서비스가 독립성을 유지하면서도 일관성을 보장할 수 있을 것 같다.
- 애그리게이트(Aggregate) 설계를 통한 도메인 안정성 확보
- 현재 개발 중인 기능에서는 여러 개의 엔티티가 서로 강하게 연결된 구조를 가지고 있다.
- 단순한 CRUD 방식으로 접근하면 트랜잭션 범위가 커지고 성능 이슈가 발생할 가능성이 크다.
- 이 책에서 강조하는 애그리게이트 설계 원칙을 적용하면, 한 번의 트랜잭션에서 관리할 도메인을 명확하게 정의하고, 필요한 경우 SAGA 패턴을 활용하여 트랜잭션을 분리할 수 있을 것 같다.
3. 느낀 점 & 마무리
이 책은 단순히 “마이크로서비스를 어떻게 만들 것인가?”를 설명하는 것이 아니라, 도메인 중심으로 서비스를 설계하는 방법을 알려주는 것이 가장 큰 장점이었다.
📌 특히 인상 깊었던 점
✅ 기존의 기능 중심 개발 방식이 아니라, 도메인 중심의 설계를 해야 한다는 점
✅ 단순히 API를 나누는 것이 아니라 경계 컨텍스트를 명확하게 설정하는 것이 중요함을 강조
✅ 이벤트 기반 설계와 데이터 일관성 유지 전략(SAGA, CQRS 등)을 적용하는 방법
📌 실무에서 적용하고 싶은 개선점
✅ API 호출 방식 대신 이벤트 기반 설계를 점진적으로 적용하기
✅ SAGA 패턴을 활용해 분산 트랜잭션을 관리하는 방식 검토하기
✅ 서비스 간 의존성을 줄이고, 비즈니스 도메인 중심의 데이터 흐름을 고민하기
📌 이 책을 읽고 얻은 주요 인사이트
✅ 마이크로서비스를 나누는 것만큼 트랜잭션을 어떻게 관리할 것인지가 중요하다
✅ 단순한 REST API 호출이 아니라, 이벤트 기반 통신을 적극 활용해야 한다
✅ 경계 컨텍스트(Bounded Context)를 명확히 설정하면, 서비스 간 결합도를 낮출 수 있다
📌 아쉬웠던 점
⚠ 초보자에게는 다소 어려울 수 있는 내용이 많다.
⚠ 특정 기술(Spring Boot, Kafka 등)에 대한 이해가 없으면 실습 부분이 다소 어렵게 느껴질 수 있다.
⚠ 예제 코드가 좀 더 실습 중심으로 구성되었다면 더 좋았을 것 같다.
이 책을 통해 마이크로서비스를 도입할 때 가장 중요한 것은 서비스의 크기가 아니라, 비즈니스 도메인을 중심으로 경계를 잘 설정하는 것이라는 점을 다시금 깨달았다. 앞으로 진행할 프로젝트에서도 DDD 원칙을 적용해 서비스를 설계하고, 유지보수가 용이한 구조를 만들기 위해 고민해야겠다.
마이크로서비스 아키텍처를 도입하려는 개발자뿐만 아니라, DDD 개념을 실무에 적용하고 싶은 개발자에게 적극 추천하는 책이다!
5. 마이크로서비스 설계 고민이 있는 개발자라면 꼭 읽어볼 만한 책
이 책을 읽기 전에는 마이크로서비스는 단순히 서비스를 잘게 나누는 것이라고 생각했지만, 책을 읽고 나서는 도메인 중심의 설계와 트랜잭션 관리가 훨씬 중요하다는 걸 깨닫게 되었다.
🔥 특히, 분산 트랜잭션을 관리하는 방법(SAGA 패턴, 이벤트 기반 아키텍처 등)에 대한 고민이 많은 개발자라면 이 책을 꼭 읽어보길 추천한다.
🔥 실무에서 마이크로서비스를 구축하고 유지보수하는 입장이라면, 단순한 이론이 아니라 실용적인 해결책을 찾는 데 도움을 받을 수 있을 것이다.
앞으로 실무에서도 SAGA 패턴과 이벤트 기반 트랜잭션을 적용할 수 있을지 고민하며, 실제로 프로젝트에 반영할 수 있도록 실험해볼 계획이다. 🚀