토픽 210 / 214·비교표
마이크로서비스와 API
MSA vs 모놀리식
| 항목 | MSA(마이크로서비스) | 모놀리식 |
|---|---|---|
| 구조 | 분산/독립 서비스 | 단일/통합 |
| 배포 | 서비스별 독립 배포 | 전체 일괄 배포 |
| 확장 | 서비스별 개별 확장 | 전체 수직 확장 |
| 장애 | 격리(서비스 단위) | 전파(전체 영향) |
| 복잡도 | 분산 시스템 복잡 | 단순(단일 프로세스) |
| 적합 | 대규모/독립 팀 | 소규모/단순 서비스 |
REST vs GraphQL vs gRPC
| 항목 | REST | GraphQL | gRPC |
|---|---|---|---|
| 프로토콜 | HTTP/JSON | HTTP/JSON | HTTP/2, Protocol Buffer |
| 설계 | 자원 중심(URI) | 쿼리 언어(클라이언트 주도) | RPC/타입 안전 |
| 데이터 | Over/Under Fetching | 필요한 데이터만 | 바이너리(고성능) |
| 실시간 | 제한적 | Subscription | 양방향 스트리밍 |
| 적합 | 범용 API | 복잡한 데이터 조합 | 내부 서비스 간 |
GraphQL vs REST
| 항목 | GraphQL | REST |
|---|---|---|
| 엔드포인트 | 단일 (/graphql) | 자원별 다수 (/users, /orders) |
| 데이터 선택 | 클라이언트가 필드 선택 | 서버가 응답 구조 결정 |
| Over-fetching | 없음 | 발생 가능 |
| Under-fetching | 없음 (단일 쿼리) | 발생 가능 (다수 호출) |
| 버전 관리 | 불필요 (스키마 진화) | URI/헤더 버전 필요 |
| 캐싱 | 복잡 (POST 기반/별도 전략) | 용이 (HTTP 캐싱/GET) |
| 학습 곡선 | 높음 | 낮음 |
| 실시간 | Subscription (내장) | WebSocket (별도) |
| 적합 환경 | 복잡한 데이터 관계, 모바일 | 단순 CRUD, 공개 API |
API Gateway vs Load Balancer vs Reverse Proxy
| 항목 | API Gateway | Load Balancer | Reverse Proxy |
|---|---|---|---|
| 계층 | L7(Application) | L4/L7 | L7 |
| 기능 | 인증+라우팅+변환+제한 | 트래픽 분산 | 요청 전달+캐싱 |
| 적용 | MSA 진입점 | 서버 부하 분산 | 보안/캐싱 |
서킷브레이커 vs 재시도 vs 벌크헤드
| 항목 | 서킷 브레이커 | 재시도(Retry) | 벌크헤드(Bulkhead) |
|---|---|---|---|
| 목적 | 장애 전파 차단 | 일시적 오류 복구 | 자원 격리 |
| 동작 | 실패 시 차단 | 실패 시 재요청 | 호출별 자원 분리 |
| 적합 | 지속적 장애 | 일시적 장애 | 서비스 간 격리 |
DDD: 전략적 vs 전술적 설계
| 항목 | 전략적 설계 | 전술적 설계 |
|---|---|---|
| 수준 | 거시적/시스템 경계 | 미시적/도메인 모델 |
| 핵심 | Bounded Context, Context Map | Entity, VO, Aggregate |
| 목적 | 도메인 경계 정의 | 도메인 로직 구현 |
| 패턴 | Shared Kernel, ACL, OHS | Repository, Domain Event |
Context Map: Shared Kernel vs ACL vs OHS
| 항목 | Shared Kernel | ACL(Anti-Corruption) | OHS(Open Host Service) |
|---|---|---|---|
| 결합도 | 밀결합(공유) | 느슨결합(변환) | 표준화(공개) |
| 방식 | 공통 모델 공유 | 외부→내부 모델 번역 | 공개 API 제공 |
| 합의 | 양쪽 합의 필요 | 단방향 보호 | 다수 소비자 대응 |
Monorepo vs Polyrepo
| 항목 | Monorepo | Polyrepo |
|---|---|---|
| 코드 공유 | 쉬움 | 어려움(패키지 발행 필요) |
| 원자적 커밋 | 가능 | 불가능 |
| 저장소 크기 | 커짐 | 작음 |
| 팀 독립성 | 낮음 | 높음 |
| 빌드 시간 | Incremental Build 필요 | 짧음 |
| 도구 의존 | 높음(Nx, Turborepo) | 낮음 |
조합형 vs 모놀리식 아키텍처
| 항목 | 조합형(Composable) | 모놀리식 |
|---|---|---|
| 구조 | PBC/API 조합 | 단일 통합 |
| 유연성 | 높음 | 낮음 |
| 변경 대응 | 빠름 | 느림 |
| 통합 복잡성 | 높음 | 낮음 |
Event Storming vs Event Modeling vs User Story Mapping
| 항목 | Event Storming | Event Modeling | User Story Mapping |
|---|---|---|---|
| 중심 | 도메인 이벤트 | 이벤트 흐름 | 사용자 활동 |
| 방법 | 포스트잇 워크숍 | 시간축 흐름도 | 스토리 계층화 |
| 산출물 | BC/Aggregate 식별 | 이벤트 흐름도 | 릴리스 계획 |
OpenAPI(REST) vs AsyncAPI vs GraphQL Schema
| 항목 | OpenAPI | AsyncAPI | GraphQL Schema |
|---|---|---|---|
| 대상 | REST API | 이벤트/메시징 | GraphQL |
| 형식 | YAML/JSON | YAML/JSON | SDL |
| 통신 | 동기/HTTP | 비동기/이벤트 | HTTP/쿼리 |
| 적합 패턴 | 요청-응답 | Pub/Sub, 스트리밍 | 유연한 데이터 조회 |
API 버전관리: URL Path vs Header vs Query
| 항목 | URL Path | Header | Query Parameter |
|---|---|---|---|
| 명시성 | 가장 명시적 | URL 깔끔 | 선택적 |
| 캐싱 | 용이 | 어려움 | 보통 |
| 예시 | /api/v1/users | X-API-Version: 1 | /users?version=1 |
Design-First vs Code-First (API 개발)
| 항목 | Design-First | Code-First |
|---|---|---|
| 순서 | 명세 작성→코드 생성 | 코드 작성→명세 자동 생성 |
| 장점 | 계약 명확, 병렬 개발 | 빠른 시작, 유연 |
| 단점 | 초기 시간 투자 | 명세 불일치 위험 |
| 적합 | 팀 간 협업/공개 API | 소규모/빠른 개발 |