소프트웨어 아키텍처

마이크로서비스 아키텍처

meellon 2026. 6. 24. 06:00

학습 목표

마이크로서비스(MSA)독립 배포·소유권·장애 격리를 목표로 하는 아키텍처 스타일임을 설명할 수 있다.

서비스 분해 기준(비즈니스 capability, bounded context)을 설명할 수 있다.

API GatewayBFF의 역할 차이를 설명할 수 있다.

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