학습 목표
마이크로서비스(MSA) 가 독립 배포·소유권·장애 격리를 목표로 하는 아키텍처 스타일임을 설명할 수 있다.
서비스 분해 기준(비즈니스 capability, bounded context)을 설명할 수 있다.
API Gateway와 BFF의 역할 차이를 설명할 수 있다.
Database per service·장애 격리 원칙과 분산 monolith 함정을 설명할 수 있다.
문제 상황
- 모놀리스 하나에 팀 8개가 같은 repo에 PR을 낸다
- 릴리스 한 번에 전체가 묶인다
- 결제 모듈만 스케일하고 싶은데 WAS 전체를 20대로 늘린다
- CPU는 주문 API가, 결제는 idle
- 재고 API 장애가 주문·결제·알림까지 연쇄 503
- 동기 호출 체인에 타임아웃·격리 없음
- "MSA 전환" 후에도 하나의 PostgreSQL에 40개 테이블
- 서비스는 나뉘었지만 DB는 monolith
- 모바일·웹이 같은 범용 REST를 10번 호출해 느리다
- 클라이언트마다 필요한 집계 API가 없음
헥사고날·클린은 한 앱 안의 의존 방향을 다뤘다. MSA는 앱을 여러 개로 나누는 분해(decomposition) 스타일이다.
1. MSA란
마이크로서비스 — 작은 자율 서비스들의 모음. 각각 독립 배포·자체 데이터 소유·팀 ownership을 목표로 한다.
| 특징 | 의미 |
|---|---|
| Service boundary | 비즈니스 capability 또는 bounded context 단위 |
| Independent deploy | 한 서비스 배포가 다른 서비스 바이너리에 영향 없음 |
| Decentralized data | 서비스마다 자기 DB(또는 스토어) |
| Smart endpoints, dumb pipes | HTTP/메시지로 연결, 오케스트레이션 최소 |
- 마이크로는 사람 수·코드 줄 수가 아니라 변경·배포 단위가 작다는 뜻
- Richards/Ford — MSA는 아키텍처 스타일이지 Spring Boot + K8s가 아니다
2. 모놀리스 vs MSA

| 모놀리스 | MSA | |
|---|---|---|
| 배포 | 하나의 artifact | 서비스별 artifact |
| 스케일 | 전체 수평 확장 | 핫 스팟만 확장 |
| 장애 | 프로세스 하나 | 격리 가능 (설계 필요) |
| 데이터 | 공유 스키마 | 서비스별 스토어 |
| 복잡도 | 코드·트랜잭션 단순 | 분산·관측·배포 비용 |
| 적합 | 초기·소규모·규칙 단순 | 팀·도메인·트래픽 이질적 |
- 모놀리스 먼저가 합리적인 경우가 많다 — 경계를 알기 전에 쪼개면 분산 monolith
- 모놀리스 안에서 모듈·헥사고날로 경계를 연습한 뒤 물리 분리
3. 서비스 분해
분해는 가장 비싼 결정 중 하나 — 되돌리기 어렵다.
기준
| 기준 | 설명 |
|---|---|
| Business capability | 주문·결제·재고·회원 — 조직이 말하는 단위 |
| Bounded context | 용어·규칙이 다른 경계 (DDD) |
| 변경 빈도 | 함께 자주 바뀌면 같은 서비스 후보 |
| 확장 요구 | 읽기·쓰기·지연 요구가 다르면 분리 검토 |
| 팀 ownership | Conway's Law — 팀 경계와 서비스 경계 정렬 |
나쁜 분해
| 안티패턴 | 증상 |
|---|---|
| 기술 계층 분리 | order-api + order-db-service — 기능 단위 아님 |
| 과도한 granularity | 200개 나노서비스 — 네트워크·운영 폭발 |
| Shared DB | 서비스 5개가 같은 테이블 직접 JOIN |
| Distributed monolith | 분리됐지만 동시 배포·공유 라이브러리 필수 |
# capability 예 (논리 경계)
order-service — 주문 생성·취소·상태
payment-service — 결제 승인·환불
inventory-service — 재고 예약·확정
catalog-service — 상품 조회 (read-heavy)
notification-service — 이메일·푸시 (async)
- 서비스 간 동기 REST 체인 5홉 — latency·장애 전파 — 이벤트·Saga로 단축 검토
예시 경계 표는 code/service-boundaries.md 참고.
4. API Gateway와 BFF

API Gateway
클라이언트와 내부 서비스 사이 단일 진입점.
| 역할 | 예 |
|---|---|
| 라우팅 | /orders → order-service |
| TLS 종료 | Network TLS·인증서 |
| 인증·인가 | JWT 검증, API key |
| Rate limit | 남용·DDoS 완화 |
| Cross-cutting | 로깅, correlation ID |
- Kong, NGINX, AWS API Gateway, Spring Cloud Gateway
- Gateway에 비즈니스 로직 넣지 않음 — 얇게 유지
BFF (Backend for Frontend)
클라이언트 유형별 백엔드 — web BFF, mobile BFF.
| BFF | 하는 일 |
|---|---|
| 집계 | 3개 내부 API → 한 응답 |
| 포맷 | mobile은 필드 적게, web은 상세 |
| 캐시 | 화면 단위 캐시 |
| 프로토콜 | GraphQL·REST를 프론트에 맞게 |
Mobile App → Mobile BFF ─┐
Web App → Web BFF ─┼→ API Gateway → internal services
Admin → Admin BFF ─┘
- BFF는 프론트 팀 소유에 가깝다 — 범용 public API와 다른 진화 속도
- Gateway = 인프라 경계, BFF = UX·클라이언트 경계
5. Database per service
각 서비스가 자기 데이터만 소유·스키마 변경.
| 원칙 | 이유 |
|---|---|
| No shared tables | coupling·스키마 lock-in |
| API로만 접근 | 다른 서비스 DB 직접 쿼리 금지 |
| Eventual consistency | 주문 생성 후 재고는 이벤트로 동기화 |
| Polyglot persistence | 주문 PG, 검색 Elasticsearch, 세션 Redis |
- 분산 트랜잭션(2PC) 은 피하고 Saga·Outbox 패턴 검토
- 로컬 트랜잭션 + 보상(compensating) 트랜잭션
6. 장애 격리
MSA는 장애를 숨기지 않고 전파하기 쉽다 — 격리를 설계한다.

| 패턴 | 역할 |
|---|---|
| Timeout | 무한 대기 방지 — OS·Network 지연 가정 |
| Circuit breaker | 연속 실패 시 빠른 실패·half-open 재시도 |
| Bulkhead | 스레드·커넥션 풀 분리 — 한 서비스가 풀 고갈해도 다른 API 생존 |
| Fallback / degrade | 재고 조회 실패 → "재고 확인 중" UI |
| Async | 알림·분석은 큐 — 동기 체인 단축 |
Order API ──sync──> Payment (timeout 2s, circuit breaker)
──async──> Notification (queue, retry)
──sync──> Inventory (reserve · separate pool)
- Platform Pod·Deployment — 서비스별 replica·resource limit (bulkhead와 맞물림)
- Observability RED — 서비스별 rate·error·duration
7. 실무 체크리스트
| 항목 | 권장 |
|---|---|
| 분해 | capability·팀 경계 · Shared DB 금지 |
| 통신 | public API 버전 · correlation ID |
| Gateway | TLS·auth·rate limit · 로직 최소 |
| BFF | 클라이언트별 · 범용 API와 분리 |
| 데이터 | DB per service · cross-service는 API·event |
| 배포 | K8s Deployment 단위 · 독립 CI/CD |
| 관측 | 서비스별 메트릭·로그·트레이스 |
| 내부 구조 | 서비스 안은 헥사고날·클린 유지 가능 |
8. 정리
- MSA = 독립 배포 가능한 서비스 + decentralized data + 팀 ownership
- 분해가 핵심 — capability·context·변경·팀 기준, 기술 계층·나노는 함정
- API Gateway — 공통 진입·보안·라우팅, BFF — 클라이언트 맞춤 집계
- 장애 격리 — timeout·breaker·bulkhead·async, 없으면 분산 monolith보다 더 불안
- 모놀리스와 배타적 아님 — strangler fig로 단계적 분해 가능
다음에 다룰 것
- 이벤트 기반 아키텍처
- pub/sub, 이벤트 스트리밍, CQRS 개요
해당 내용은 Fundamentals of Software Architecture (Mark Richards, Neal Ford) 의 내용을 기반으로 합니다.
'소프트웨어 아키텍처' 카테고리의 다른 글
| 아키텍처 스타일 비교와 선택 (0) | 2026.06.26 |
|---|---|
| 이벤트 기반 아키텍처 (0) | 2026.06.25 |
| 헥사고날과 클린 아키텍처 (3) | 2026.06.23 |
| 레이어드 아키텍처 (0) | 2026.06.22 |
| 아키텍처 품질 속성 (0) | 2026.06.21 |