단일 어플리케이션 분할 시점: 수술적 분리의 예술
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
DevOps
대상자
소프트웨어 개발자 및 DevOps 엔지니어
- *난이도**: 중급(모놀리즘 아키텍처 이해 필요)
핵심 요약
- 모놀리즘 분할 시점 : 테스트 시간이 45분 이상, 배포 시 전역 영향 발생, 팀 간 협업 장애 발생 시 분할 고려
- DDD 기반 분리 패턴 :
User
모델을 Identity Service, Billing Service, User Profiles Service로 분리 - 도구 활용 :
nginx
(라우팅),delegate
(레이지 분리),Rails Event Store
(이벤트 기반 분리) - 핵심 원칙 : "분할의 고통 < 유지의 고통" 시 분할 실행
섹션별 세부 요약
1. 모놀리즘 분할의 필수 조건
- 문제 사례
- 테스트 스위트 실행 시간 45분 이상
- 배포 시 전역 영향 발생 (예: Jenga 게임 유사)
- 팀 간 마이그레이션 충돌 (예: 인벤토리 테이블 변경 시 주문 팀 영향)
- 분리 기준
- 단일 테이블이 CPU 사용량의 80% 차지
- 외부 API (Stripe, Twilio 등) 직접 호출로 인한 전역 업데이트 필요
2. 서비스 분리 전략
- DDD 기반 분리
User
모델을 Identity Service, Billing Service, User Profiles Service로 분리 (예:Authentication
,Subscriptions
,Avatars
)- 팀 경계 기반 분리 (Conway’s Law)
- 팀 A의 "Orders"와 팀 B의 "Inventory" 변경으로 인한 충돌 시 분리
- 외부 파트너 API 통합
- Stripe, Twilio 등 외부 API 호출을 Partner Gateway Service로 통합
3. 분리 실행 단계
- 단계 1: 프록시 라우팅
/api/v2/orders
라우팅을 새 Orders Service로 전달 (예:nginx
사용)- 단계 2: 데이터 동기화
- 이벤트 스트리밍 (Kafka) 또는 DB 트리거로 데이터 동기화
- 단계 3: 오래된 경로 폐기
/api/v1/orders
경로가 v2 정상 작동 시 폐기
4. 분리 시 도구 활용
- 내부 서비스 개발
delegate
gem으로 레이지 분리 구현 (예:PaymentService.new.process(order: self)
)- 이벤트 기반 분리
Rails Event Store
로 이벤트 기반 분리 (예:OrderCreatedHandler
클래스 생성)
5. 분리 시 주의 사항
- 미세 서비스 트렌드에 휘둘리지 않기
- DevOps 인프라 (컨테이너 오케스트레이션) 미비 시 분할 자제
- 단순 도메인 (예: 10개 모델 SaaS)은 분할 필요 없음
- 분리 전 체크리스트
- Observability:
OpenTelemetry
로 서비스 간 호출 추적 - 테스트:
Pact
(계약 테스트),Gremlin
(장애 시뮬레이션)
결론
- 하나의 서비스 분리로도 성과 가능 : 결제 서비스 분리로 팀 배포 속도 향상, 장애 고립, 기술 유연성 확보
- 관찰 → 분리 → 테스트 순서 :
OpenTelemetry
,Pact
,Gremlin
도구 활용하여 안정적 분리 구현 - 핵심 원칙 : "분할의 고통 < 유지의 고통" 시 분할 실행 (예:
Identity Service
분리 후 테스트 시간 단축)