개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Monolithic Architecture — 하나의 배포 단위로 구성하는 방법

2024년 12월 22일
MonolithicMonolithicLayeredModular MonolithDeployment

서비스를 처음 만들 때 가장 자연스러운 선택은 모든 코드를 하나의 프로세스로 실행하는 것이다. Monolithic Architecture는 이 직관을 그대로 반영한 설계로, 수십 년간 실제 프로덕션 환경을 지탱해 왔다. 작은 팀이 빠르게 제품을 검증해야 하는 초기 단계에서 이 구조가 여전히 가장 실용적인 이유가 있다.

구조: Layered Architecture

Monolith의 내부는 보통 Layered Architecture로 구성된다. 각 Layer는 바로 아래 Layer에만 의존하며, 관심사를 수직으로 분리한다.

┌─────────────────────────────┐
│      Presentation Layer     │  ← HTTP Controller, GraphQL Resolver
├─────────────────────────────┤
│      Application Layer      │  ← Use Case, Service
├─────────────────────────────┤
│        Domain Layer         │  ← Entity, Domain Service, Repository Interface
├─────────────────────────────┤
│    Infrastructure Layer     │  ← DB, Cache, External API
└─────────────────────────────┘

Layered Architecture: 코드를 역할 단위로 수평 분리하는 패턴. 각 Layer는 인접한 Layer와만 통신하여 의존 방향을 단방향으로 유지한다.

모든 Layer가 동일한 프로세스 안에서 실행되므로 함수 호출로 통신한다. 네트워크 오버헤드가 없고 트랜잭션 관리가 단순하다.

언제 사용하나

상황적합도
초기 스타트업, MVP높음
도메인 경계가 불분명한 시점높음
팀 규모 1–5명높음
트래픽 예측이 어려운 단계보통
팀별 독립 배포가 필요한 시점낮음
특정 컴포넌트만 Scale Out 필요낮음

장단점

장점

  • 단일 배포 단위(Single Deployment Unit)이므로 배포 파이프라인이 단순하다.
  • 함수 호출 기반 통신이므로 디버깅과 트레이싱이 쉽다.
  • 데이터베이스 트랜잭션이 하나의 커넥션 안에서 처리된다.
  • 로컬 개발 환경 구성이 간단하다.

단점

  • Tight Coupling: 도메인 간 경계가 흐려지면 변경이 전체에 영향을 준다.
  • Scale Up 의존: 특정 기능만 확장할 수 없고 전체 인스턴스를 키워야 한다.
  • 빌드·테스트 시간이 코드베이스 크기에 비례해 증가한다.
  • 기술 스택 교체가 전체 재작성을 의미한다.

Scale Up: CPU·메모리 등 단일 서버의 사양을 높여 처리 용량을 늘리는 방식. 반대는 인스턴스 수를 늘리는 Scale Out.

Modular Monolith

Modular Monolith는 Monolith의 단점인 Tight Coupling을 해결하면서 단일 배포의 장점을 유지하는 중간 형태다. 각 도메인 모듈은 Public API(Interface)만 외부에 노출하고, 내부 구현을 캡슐화한다.

┌──────────────────────────────────────────┐
│              Single Process              │
│  ┌──────────┐  ┌──────────┐  ┌────────┐ │
│  │  Order   │  │ Inventory│  │  User  │ │
│  │  Module  │→ │  Module  │  │ Module │ │
│  └──────────┘  └──────────┘  └────────┘ │
└──────────────────────────────────────────┘

모듈 간 의존은 Interface를 통해서만 허용하고, 직접 DB 테이블 참조를 금지하는 규칙을 코드 레벨에서 강제한다. MSA로 전환할 때 모듈 경계가 서비스 경계가 되므로 마이그레이션 비용이 줄어든다.

Monolith vs MSA 비교

항목MonolithMSA
배포 단위단일서비스별 독립
통신 방식함수 호출HTTP / Message Queue
트랜잭션단일 DB 트랜잭션Saga / 2PC 필요
운영 복잡도낮음높음
팀 자율성낮음높음
초기 개발 속도빠름느림

MSA(Microservices Architecture): 시스템을 독립적으로 배포 가능한 소규모 서비스로 분해하는 설계 방식. 서비스마다 별도 프로세스와 데이터 저장소를 가진다.

도메인 경계를 명확히 이해하기 전에 MSA를 선택하면 분산 시스템의 복잡성만 얻고 팀 자율성은 확보하지 못하는 결과로 이어진다. Monolith로 시작해 병목이 되는 도메인을 식별한 뒤 점진적으로 분리하는 전략이 현실적이다.

다음 글 →Microservices Architecture — 독립 배포 가능한 서비스 분리