Ch9. Agentic 개발 체계
엔터프라이즈 모노레포에서 CLAUDE.md, 멀티세션, 서브에이전트, Hooks를 결합해 agentic 개발 체계를 운영하는 방법입니다.
핵심 요약
- 모노레포는 루트
CLAUDE.md에 공통 명령어·Git 규칙을, 앱별CLAUDE.md에 라우팅·환경 변수를 두는 계층 구조로 컨텍스트를 병합합니다. git worktree로 web·admin·packages 세션을 분리하고 tmux로 동시 운영해 멀티세션 작업을 격리합니다.- 서브에이전트는 Explore/Plan은
Read, Grep, Glob, Bash는Bash만 주는 식으로 도구 권한을 역할별로 최소화합니다. - Hooks는
PreToolUse로rm -rf /·DROP TABLE등 위험 명령을 차단하고PostToolUse로 Prettier를 자동 실행합니다. - 변경 후
turbo run lint typecheck test build --affected를 돌리고 CODEOWNERS·CI를 통과한 PR만 main에 병합합니다.
엔터프라이즈 CLAUDE.md 설계
모노레포에서는 계층적 CLAUDE.md 구조를 씁니다. Claude Code는 현재 작업 디렉토리부터 루트까지 모든 CLAUDE.md를 병합해 컨텍스트로 삼습니다.
<!-- CLAUDE.md (루트) -->
# 프로젝트 개요
Turborepo 모노레포. Yarn 4 + Next.js 16 + Vercel 배포.
## 공통 명령어
- `yarn dev` — 전체 개발 서버
- `turbo run build --filter=앱명` — 특정 앱 빌드
- `turbo run test` — 전체 테스트
## 아키텍처
apps/ → 배포 단위, packages/ → 재사용 단위.
의존성 방향: types → utils/db(Prisma) → ui → apps.
API는 각 Next.js 앱의 API Routes + Server Actions로 처리.
## 주요 패키지
- @acme/db — Prisma 클라이언트 (스키마: packages/db/prisma/)
- @acme/ui — 공유 UI 컴포넌트
- @acme/utils — 유틸리티 함수
## Git 규칙
- 커밋 메시지: conventional commits (feat/fix/chore)
- 커밋/푸시 금지: 명시적 요청 전까지 실행하지 않는다<!-- apps/web/CLAUDE.md -->
# apps/web (메인 서비스)
Next.js App Router. 포트 3000.
## 라우팅
- /(public) — 공개 페이지
- /(auth) — 인증 필요 (proxy.ts에서 경량 redirect 처리)
- /api/* — API Routes (외부 웹훅, 서드파티 연동)
## 데이터 접근
- DB: import { getDb } from '@acme/db' (Prisma lazy singleton)
- 뮤테이션: Server Actions 우선, 외부 연동만 API Routes
- 스키마 변경: packages/db/prisma/schema.prisma 수정 후 prisma migrate dev
## 환경 변수
- DATABASE_URL: Neon PostgreSQL (서버리스)
- NEXT_PUBLIC_APP_URL: 앱 URL모노레포 멀티세션 전략
Git worktree를 쓰면 여러 Claude Code 세션이 동시에 서로 다른 앱을 작업할 수 있습니다:
# worktree 생성
git worktree add ../monorepo-web -b feat/web-redesign
git worktree add ../monorepo-admin -b feat/admin-rbac
# 세션 1: web 작업
cd ../monorepo-web && claude
# 세션 2: admin 작업
cd ../monorepo-admin && claude
# 세션 3: 메인 레포에서 패키지 작업
cd ../monorepo && claude| 세션 | 작업 디렉토리 | 담당 |
|---|---|---|
| 세션 1 | monorepo-web/ | apps/web 피처 개발 |
| 세션 2 | monorepo-admin/ | apps/admin 피처 개발 |
| 세션 3 | monorepo/ | packages/* 공통 코드, 리뷰 |
서브에이전트 역할 분리
Claude Code의 Task 도구로 서브에이전트를 역할별로 나눕니다:
| 에이전트 | 역할 | 도구 권한 |
|---|---|---|
| Explore | 코드베이스 탐색, 구조 파악 | Read, Grep, Glob |
| Plan | 아키텍처 설계, 접근법 결정 | Read, Grep, Glob |
| Bash | 빌드, 테스트, Git 작업 | Bash |
| General | 복합 작업, 멀티스텝 구현 | 전체 |
<!-- CLAUDE.md에 서브에이전트 가이드라인 추가 -->
## 에이전트 활용 가이드
- 코드 탐색: Task(subagent_type=Explore) 사용
- 구현 전 설계: Task(subagent_type=Plan) 사용
- 빌드/테스트: Task(subagent_type=Bash) 사용
- 3개 이상 파일 수정: TodoWrite로 진행 상황 추적Hooks 기반 자동화 레시피
// .claude/settings.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"command": "prettier --write $CLAUDE_FILE_PATH 2>/dev/null || true"
}
],
"PreToolUse": [
{
"matcher": "Bash",
"command": "echo '$CLAUDE_TOOL_INPUT' | jq -r '.command' | grep -qE '(rm -rf /|DROP TABLE|format c:)' && echo 'BLOCK: 위험한 명령 차단' && exit 1 || exit 0"
}
]
}
}| Hook | 타이밍 | 용도 |
|---|---|---|
PreToolUse | 도구 실행 전 | 위험 명령 차단, 파일 접근 제한 |
PostToolUse | 도구 실행 후 | 자동 포맷팅, 린트 실행 |
Notification | 장시간 작업 완료 시 | 슬랙/디스코드 알림 |
Git worktree 실전 워크플로우
# 1. 피처 브랜치별 worktree 생성
git worktree add ../proj-feat-auth -b feat/auth
git worktree add ../proj-feat-payment -b feat/payment
# 2. 각 worktree에서 Claude Code 세션 시작
# (tmux/screen으로 세션 관리)
tmux new-session -s auth -c ../proj-feat-auth "claude"
tmux new-session -s payment -c ../proj-feat-payment "claude"
# 3. 완료 후 worktree 정리
git worktree remove ../proj-feat-auth
git worktree remove ../proj-feat-payment연관 핸드북
Claude Code의 기본 사용법·멀티세션·Hooks 상세 내용은 Claude Code 고급 활용에서 더 깊게 다룹니다.
에이전트 운영 기준
릴리스 번호별 기능을 외워서 운영하기보다 어떤 에이전트가 와도 똑같이 적용되는 기준을 만듭니다.
| 기준 | 적용 방식 |
|---|---|
| 작업 격리 | 긴 작업은 git worktree 또는 별도 브랜치에서 실행 |
| 컨텍스트 공급 | 루트 CLAUDE.md/AGENTS.md와 앱별 문서를 분리 |
| 권한 제한 | 쓰기·shell·네트워크·MCP 권한을 최소 권한으로 시작 |
| 검증 | 변경 후 turbo run lint typecheck test build --affected 실행 |
| 병합 | CODEOWNERS와 CI를 통과한 PR만 main에 반영 |
Context pack 설계
에이전트에게 전체 레포를 읽게 하기보다 작업별 context pack을 건넵니다.
# Context Pack: 결제 webhook 수정
## 읽을 파일
- apps/web/app/api/webhooks/paddle/route.ts
- packages/db/prisma/schema.prisma
- packages/billing/src/paddle.ts
## 지켜야 할 규칙
- webhook raw body 검증을 유지한다
- 같은 event id는 idempotent하게 처리한다
- 결제 상태 변경은 audit log를 남긴다
## 검증 명령
- turbo run test --filter=web...
- turbo run typecheck --filter=web...Context pack은 prompt가 아니라 운영 자산입니다. 자주 반복되는 변경은 .agent/context-packs/나 .claude/prompts/ 같은 디렉토리에 저장해두고 PR 리뷰를 거치게 하세요.
멀티 에이전트 권한 경계
Claude Code, Codex, Cursor, Copilot을 함께 쓰는 조직이라면 도구별 설정보다 공통 정책을 먼저 정합니다.
| 정책 | Claude 계열 | Codex 계열 |
|---|---|---|
| 프로젝트 문맥 | CLAUDE.md, 스킬 | AGENTS.md, 스킬 |
| lifecycle hook | 도구별 hooks | Codex hooks |
| 조직 정책 | MDM/관리자 설정 | requirements.toml, cloud-managed requirements |
| MCP 통제 | 허용 서버만 등록 | mcp_servers allowlist |
| 위험 명령 | permission deny + hook | rules + sandbox + approval |
거버넌스는 도구별로 흩어지면 안 됩니다
에이전트별 파일 형식은 달라도 정책 문장은 하나로 유지하세요. 예를 들어 "production DB 직접 변경 금지"는 Claude, Codex, CI, CODEOWNERS, runbook에 모두 같은 의미로 들어가야 합니다.
참고 문서
- Claude Code: CLAUDE.md (영어)
- Claude Code: Hooks (영어)
- Claude Code: Agent SDK (영어)
- OpenAI Codex: Managed configuration (영어)
- OpenAI Codex: Hooks (영어)
- Git: Worktree (영어)