**모놀리스(monolith)**는 모든 기능을 하나의 배포 가능한 단위로 패키징하고, 마이크로서비스는 그 기능을 독립적으로 배포 가능한 여러 서비스로 분할합니다. 핵심 차이는 배포 단위와 모듈 간 경계입니다.
| 측면 | 모놀리스 | 마이크로서비스 |
|---|
| 배포 | 하나의 단위 | 다수의 독립 단위 |
| 데이터베이스 | 보통 하나의 공유 DB | 서비스당 하나의 DB |
| 확장 | 전체 앱 확장 | 서비스별 개별 확장 |
| 통신 | 인프로세스 호출 | 네트워크(HTTP/gRPC/이벤트) |
| 팀 결합도 | 높음 | 낮음(서비스별 소유) |
| 장애 영향 범위 | 전체 앱 | 종종 하나의 서비스로 격리 |
| 운영 복잡성 | 낮음 | 높음 |
모놀리스가 좋은 경우:
✓ 소규모 팀 / 초기 단계 제품
✓ 도메인이 아직 충분히 이해되지 않음
✓ 단순함과 빠른 반복이 가장 중요
마이크로서비스가 좋은 경우:
✓ 많은 팀이 있는 대규모 조직
✓ 각 부분의 확장 요구가 매우 다름
✓ 독립적인 배포 주기가 필요
모듈화가 잘못된 모놀리스는 분할한다고 마법처럼 개선되지 않습니다. 단지 분산된 엉망진창이 될 뿐입니다. 경계부터 바로잡으세요.
잘못된 스타일을 선택하면 비용이 큽니다. 성급한 분할은 소규모 팀에게 지연 시간, 운영 비용, 디버깅 고통을 더합니다.
대부분의 성공적인 시스템은 잘 구조화된 모놀리스로 시작하여, 팀 규모나 확장 압박이 명확히 정당화될 때에만 서비스를 추출합니다.