Files
llm-wiki/vault/20-evidence/company-tech-blogs/modulith-arawn-github-modular-monoliths-spring.md
T

104 lines
8.5 KiB
Markdown

---
title: arawn/building-modular-monoliths-using-spring (박용권, 우아한형제들 발표 동반 코드)
source_type: company-tech-blog
url: https://github.com/arawn/building-modular-monoliths-using-spring
archive_url:
status: raw
confidence: medium
tags: [ca-architecture-layout, modulith, modular-monolith, arawn, woowahan, ddd]
related_branches: [feature-architecture-enforcement-rules, feature-skeleton-package-blueprint-contract, feature-domain-feature-onboarding-contract]
related_projects: [ca-skeleton-operational-contract]
created: 2026-05-22
last_reviewed: 2026-05-27
---
# arawn/building-modular-monoliths-using-spring
> Layer: `raw/company-tech-blogs/` — 박용권 (당시 우아한형제들) GitHub repository 의 README 와 동반 코드. 2020 "잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다" 발표의 reference 구현체 — Spring Modulith 등장 이전 한국 커뮤니티의 모듈형 모노리스 사실상 표준 사례.
> 검증된 요약은 `/ingest` 후 `wiki/concepts/`에 별도 작성. 원본은 raw에 영구 보관.
## Parent / 활용 branch (필수)
| Branch | 이 자료가 정당화하는 결정 |
|---|---|
| [[raw/branch-notes/feature-architecture-enforcement-rules]] | 응집/결합을 아키텍처 스타일보다 우선시한다는 원칙 — ca-tmpl 의 enforcement rule 우선순위 근거 |
| [[raw/branch-notes/feature-skeleton-package-blueprint-contract]] | 도메인 중심 패키지 구조 (catalogs/orders/shipments) 사례 — ca-tmpl 의 `features/{name}` 구조 reference |
| [[raw/branch-notes/feature-domain-feature-onboarding-contract]] | 모듈을 도메인 단위로 추출하는 onboarding 패턴의 reference 사례 |
| [[raw/project-notes/ca-skeleton-operational-contract]] | §20. Skeleton Blueprint Contract + §19. Domain Application Readiness Contract — feature-first 결정의 한국 커뮤니티 reference |
## 컨텍스트 / 왜 저장했는지
ca-tmpl 의 feature-first 결정에 대한 대안 4: Spring Modulith 등장 이전 한국 커뮤니티에서 가장 많이 인용된 modular monolith reference. Spring 공식 도구 없이 "어떻게 경계를 만들 것인가" 를 단계별로 보여주는 자료로, ca-tmpl 의 feature-first 가 다음 단계로 가려면 무엇이 필요한지 보여줌.
## 출처 / Source
- 원본 URL: https://github.com/arawn/building-modular-monoliths-using-spring
- 아카이브: (미확보)
- 저자 / 조직: arawn (박용권, 당시 우아한형제들)
- 동반 발표: 2020 "잘 키운 모노리스 하나 열 마이크로서비스 안 부럽다" (SlideShare)
- 마지막 확인일: 2026-05-27
## 핵심 인용 / Key quotes (verbatim)
> [§README — 목적] "스프링을 기반으로 모듈형 모노리스를 만들기 위한 방안을 공유합니다."
> [§README — 원칙] "나는 응집과 결합을 다스리는 것이 아키텍처 스타일보다 먼저라고 말하고 싶다."
> [§README — 설계 원칙] "높은 응집도(Cohesion)와 느슨한 결합도(Coupling)라 생각한다."
> [§README — 진행 단계] "step_1: modularization - 도메인 중심 모듈화와 모듈간 의존성 관리"
> [§README — 진행 단계] "step_2: encapsulation and separately - 모듈을 보호하고, 모듈간 의존성 분리"
> [§README — 진행 단계] "step_3: context boundaries - 모듈 자율성을 지키는 컨텍스트 경계"
> [§README — 도메인 구조] "핵심 도메인으로 상품(catalogs), 주문(orders), 배송(shipments)을 추출"
## Claims Extracted / 추출된 주장
| Claim ID | Claim (이 자료가 직접 말하는 것) | Evidence quote | Strength | Applies to | Does not prove |
|---|---|---|---|---|---|
| ARAWN-MOD-C1 | repository 의 목적은 **Spring 기반 모듈형 모노리스 구성 방안 공유** | [§README — 목적] "스프링을 기반으로 모듈형 모노리스를 만들기 위한 방안을 공유합니다." | `engineering-blog` | Spring + 모듈형 모노리스 학습/설계 사례 | "방안" 이 prod 환경에서 검증된 표준이라는 뜻은 아님 — 학습/발표용 reference |
| ARAWN-MOD-C2 | 저자의 핵심 주장: **응집과 결합을 다스리는 것이 아키텍처 스타일보다 먼저** | [§README — 원칙] "나는 응집과 결합을 다스리는 것이 아키텍처 스타일보다 먼저라고 말하고 싶다." + [§README — 설계 원칙] "높은 응집도(Cohesion)와 느슨한 결합도(Coupling)라 생각한다." | `engineering-blog` | 모듈 분할 원칙 우선순위 결정 | "아키텍처 스타일이 무의미하다" 는 뜻은 아님 — 우선순위만 명시 |
| ARAWN-MOD-C3 | 모듈화 진행은 **3단계: (1) 도메인 중심 모듈화 + 의존성 관리, (2) 캡슐화 + 모듈간 의존성 분리, (3) context boundaries 로 모듈 자율성 확보** | [§README — 진행 단계] "step_1: modularization - 도메인 중심 모듈화와 모듈간 의존성 관리" + "step_2: encapsulation and separately - 모듈을 보호하고, 모듈간 의존성 분리" + "step_3: context boundaries - 모듈 자율성을 지키는 컨텍스트 경계" | `engineering-blog` | 모듈형 모노리스 점진적 채택 로드맵 | 각 step 의 구체적 도구 (package-private / ApplicationEvent / DDD bounded context 등) 의 선택은 본 인용 범위 밖 |
| ARAWN-MOD-C4 | 패키지 구조는 **도메인 중심** (catalogs, orders, shipments) — 기술 layer 분할이 아닌 도메인 분할 | [§README — 도메인 구조] "핵심 도메인으로 상품(catalogs), 주문(orders), 배송(shipments)을 추출" | `engineering-blog` | 도메인 단위 최상위 패키지 결정 | feature 안의 내부 구조 (4-layer 등) 는 본 인용 범위 밖 — ca-tmpl 의 `features/{name}` 내부 layer 결정은 별도 |
## Usage Boundaries / 적용 경계
- **이 자료가 직접 증명하는 것**:
- `ARAWN-MOD-C1`: repository 의 목적 (Spring 모듈형 모노리스 방안 공유)
- `ARAWN-MOD-C2`: 응집/결합 우선 원칙 (저자 주장)
- `ARAWN-MOD-C3`: 3단계 점진적 모듈화 로드맵
- `ARAWN-MOD-C4`: 도메인 중심 패키지 구조 사례
- **이 자료가 증명하지 않는 것**:
- 이 패턴이 한국 백엔드의 "공식 best practice" — `engineering-blog` 수준 (개인 GitHub repo + 발표). 우아한형제들 사내 표준이라는 보장 없음
- Spring Modulith 도입 후에도 이 패턴이 권장된다는 주장 (Spring Modulith 와의 비교는 본 자료에 없음)
- 경계 위반의 컴파일/테스트 단계 검출 메커니즘의 충분성 (저자가 "팀 컨벤션 유지" 강조)
- **내 프로젝트에 적용하려면 추가 확인이 필요한 것**:
- ca-tmpl 의 `features/{name}` 안 4-layer 구조와 arawn 의 도메인 단위 모듈의 분할 차이 (layer 강제 vs 자유)
- Spring Modulith 도입 시 본 패턴이 어떻게 마이그레이션되는지
## 메모 / Notes (내 프로젝트 해석)
> 본 섹션은 자료 직접 인용 아님. ca-tmpl 결정 컨텍스트 해석.
- 적용 시나리오: Spring Modulith 도입 전 (또는 Boot 2.x 환경) 에서 모듈 경계를 만들고 싶은 팀.
- 장점: 도구가 아니라 "원칙" 중심. package-private 가시성, ApplicationEvent 기반 통신 등을 손으로 구현하며 모듈 분리 원리 학습.
- 단점: Spring 공식 도구 부재 → 경계 위반 시 컴파일/테스트 차원 검증 약함. 팀 컨벤션 유지가 핵심.
- ca-tmpl(feature-first) 와의 차이: arawn 자료는 **도메인 = 모듈 = 최상위 패키지** 라는 점에서 ca-tmpl 과 정확히 같은 발상. ca-tmpl 의 `features/{name}` 은 arawn 의 `catalogs/`, `orders/` 와 1:1 매핑. 차이는 ca-tmpl 이 feature 안에 4-layer 를 두는 반면 arawn 자료는 layer 분할은 케이스마다 다름.
- 신뢰도: `engineering-blog` (저자가 우아한형제들 시기, 개인 GitHub repo + 발표). 사례/관점으로 사용.
## Related / 관련
- 같은 주제 다른 raw:
- [[raw/company-tech-blogs/woowahan-hexagonal-multimodule]] (우아한형제들 multi-module 헥사고날)
- 인용하는 branch:
- [[raw/branch-notes/feature-architecture-enforcement-rules]]
- [[raw/branch-notes/feature-skeleton-package-blueprint-contract]]
- [[raw/branch-notes/feature-domain-feature-onboarding-contract]]
- 인용하는 project:
- [[raw/project-notes/ca-skeleton-operational-contract]] (§20, §19)
- 인용한 wiki 요약: (미작성)
- 대안 그룹: **Topic 1 — Architecture Layout** (대안 5종: feature-first / layer-first / hexagonal / modulith / onion)
- 본 source 의 위치: 대안 3: modulith (Spring Modulith 이전 reference)