배경 및 목표
Greeting 백엔드 코드베이스가 여러 레포에 흩어져 있었습니다. 레포마다 컨벤션·리뷰 기준·자동화가 제각각이라, 팀원들이 동일한 Claude Code 설정(에이전트·규칙·훅)을 일관되게 적용하기 어려웠고, 그 결과 PR 형식·코드 스타일·테스트 방식이 사람마다 달랐습니다.
목표
- 흩어진 코드베이스를 단일 모노레포로 통합해, 팀 공용 Claude 설정을 한 곳에서 적용한다.
- clone만으로 누구나 동일한 컨벤션·리뷰·자동화 환경을 갖도록 하여 산출물을 균일화한다.
해결 방법과 해결 후보군
후보군 비교
| 방식 | 설명 | 한계 |
|---|---|---|
| 멀티 레포 유지 + 개인별 설정 | 각자 .claude를 개별 관리 | 설정 드리프트, 컨벤션 제각각 |
| 문서로만 컨벤션 공유 | 위키 가이드 문서 | 강제성 없음, 문서-실제 괴리 |
모노레포 + 공용 .claude 하네스 (채택) | 저장소에 하네스 내장 | clone 즉시 동일 환경, 훅으로 강제 |
1. 단일 모노레포로 통합
19개 모듈을 하나의 저장소로 합치고, 팀 공용 .claude/ 하네스를 git tracked 자산으로 저장소에 내장했습니다. clone + 환경변수 + .mcp.json 첫 승인 1회면 팀원 전원이 동일하게 동작합니다.
graph LR subgraph before["❌ 기존: 멀티 레포"] R1["레포 A"] --> D["설정 제각각"] R2["레포 B"] --> D R3["레포 C"] --> D end subgraph after["✅ 개선: 모노레포 + 공용 하네스"] M["모노레포<br/>(.claude 내장)"] --> T1["팀원 A"] M --> T2["팀원 B"] M --> T3["팀원 C"] end before -.->|"통합"| after
모노레포는 호출자/피호출자·인터페이스/구현이 같은 트리에 있어 AI 에이전트가 변경 영향 범위를 직접 추적할 수 있고, 컨벤션 문서를 루트 한 곳에 두면 모든 하위 프로젝트에 동일 규칙을 강제할 수 있습니다: Claude 설정 표준화에 유리한 구조입니다.
2. 이관 과정: git history 보존 점진 이관
한 번에 전부 옮기지 않고 레포 단위로 점진 이관하여 롤백 비용을 최소화했습니다.
flowchart TD A["① 사전 인벤토리<br/>(레포·배포 단위·외부 의존)"] --> B["② 타겟 골격 구성<br/>(디렉토리·빌드·CODEOWNERS)"] B --> C["③ 이관 대상 선정 (의존성 순서)"] C --> D["④ 작업 동결 공지"] D --> E["⑤ git history 보존 이관<br/>(subtree / filter-repo)"] E --> F["⑥ 빌드·배포 워크플로우 통합<br/>(paths 필터)"] F --> G["⑦ CI/CD 검증"] G --> H{"산출물 동등?"} H -->|"No"| F H -->|"Yes"| I["⑧ 구 레포 read-only"] I --> C
핵심 기법:
- 히스토리 보존: 단순 복사(blame·log 유실) 대신
git subtree add(원본 커밋 보존 + 양방향 동기화로 점진 이관) 또는git filter-repo --to-subdirectory-filter(디렉토리 하위로 재작성)로 이관 - 작업 동결: 이관 시점 신규 작업 중지 → 누락 커밋 방지
- affected-only CI:
paths필터로 변경 영향 모듈만 빌드해 CI 비용 폭증 방지 - 점진 이관: 의존성 적은 레포부터 순차 이관, 각 레포 read-only 전환 후 다음으로
이관 시 GitHub Secrets·Environments 재구성, 모니터링·이슈 트래커의 레포 URL 갱신, 레포별로 다르던 라이브러리 버전 단일화가 동반됩니다.
3. .claude 하네스 구성: 디렉토리별 역할
| 디렉토리 | 역할 | 목적 |
|---|---|---|
HARNESS.md | 하네스 진입점 + 진단 rubric (SSOT) | 전체 구조·사용법을 단일 문서로 |
onboarding.md | 팀원 5분 셋업 가이드 | 신규 합류 즉시 온보딩 |
settings.json | 권한 화이트리스트 + 훅 정의 | 위험 동작 차단·안전 게이트 |
rules/ | Kotlin/Spring 코드 작성 규칙 (controller-api · service-transaction · dto-validation · testing) | 레이어·DTO·트랜잭션·테스트 스타일 통일 (paths로 자동 로드) |
hooks/ | 12개 표준 훅 (커밋 접두사 · JVM 가드 · 인프라 write · git push 승인 · mainline merge · 시크릿 차단 · detekt/Avro 리마인더) | 컨벤션·안전을 코드로 강제 |
agents/ | 15개 전문 서브에이전트 (PRD→TDD · Jira 분해 · 백엔드 리뷰 · JPA/QueryDSL · DBA · PR 콜그래프 · Avro/OpenAPI drift · incident) | 설계·리뷰 품질 균일화 |
skills/ | 스킬 (module-router · pr-create · db-migration · kafka-tracer · self-code-review · release-tagger) | 반복 작업(PR·마이그레이션·릴리즈) 표준화 |
docs/ | conventions.md(PR/커밋/strangler/JDK 4대 룰) · ssot-map | 프로세스/머지 게이트 SSOT |
dependency-graphs/ | 생태계 의존성 정본 (HTTP/Kafka/DB) | 영향 분석 근거 |
templates/ | 회고 등 산출물 템플릿 | 문서 형식 통일 |
핵심은 “컨벤션을 문서로 안내”가 아니라 “저장소에 내장해 훅·규칙·에이전트로 강제”한 점입니다.
결과: 산출물 균일화
설정을 저장소에 내장하니, 누가 작업하든 아래가 동일하게 나옵니다.
| 산출물 | 무엇이 강제하나 | 결과 |
|---|---|---|
| PR 내용 | pr-create 스킬(사내 템플릿·호환성·배포 의존성 본문) + check-commit-prefix 훅 + conventions Rule 2 | 제목 접두사([GRT-]/[BE-]/[LIVEISSUE-])·본문 구조가 팀 전체 동일, strangler 변경은 영향 분석 첨부 |
| 코드 컨벤션 | rules/(controller-api·service-transaction·dto-validation) 자동 로드 + backend-engineer 에이전트 + detekt 리마인더 훅 | Controller·DTO·트랜잭션·응답 래퍼·네이밍이 일관 |
| 테스트 코드 | rules/testing.md 자동 로드(src/test/**/*.kt) | 모듈별 스택 핀(Kotest/JUnit·MockK/Mockito), given/when/then, 단위 vs 통합, fixture 관례, mock 혼용 금지 준수 |
| 리뷰·안전 | JPA/QueryDSL·PR 콜그래프·DBA 리뷰 에이전트 + git push/mainline merge/인프라 write/시크릿 차단 훅 | 리뷰 관점 통일, 위험 동작 원천 차단 |
결과적으로 팀원들이 균일한 PR·코드·테스트를 산출하게 되었고, 신규 합류자도 clone 즉시 동일한 기준으로 작업할 수 있게 되었습니다.
모니터링
- PR 제목 접두사·템플릿 준수율과 CI
check_pr_title.yml통과율을 관측한다. - detekt·테스트 게이트 통과율, 리뷰 지적 재발 빈도를 관측해 하네스의 표준화 효과를 점검한다.