Claude Code 완벽 정복
Claude Code 완벽 정복 가이드

Claude Code,
제대로 쓰는 법

설치부터 멀티 에이전트 자동화까지. 입문자부터 전문가까지 단계별로 Claude Code를 완전히 정복하는 백과사전식 가이드.

18개 챕터 · 5개 섹션 · 기능 완전 마스터 + 실전 워크플로우 + 전문가 패턴

SECTION 0빠른 시작
SECTION 1핵심 기능
SECTION 2실행 모드
SECTION 3실전 워크플로우
SECTION 4전문가 패턴
SECTION 0

빠른 시작

설치부터 첫 대화까지. 10분 안에 Claude Code를 실행한다.

🚀
Chapter 0 🟢 입문

Quick Start

설치, 인증, 첫 실행까지 최단 경로 — 그리고 그 다음에 반드시 해야 할 것들

Claude Code는 Anthropic이 만든 CLI 기반 AI 코딩 어시스턴트입니다. 터미널에서 claude를 입력하는 순간, 현재 디렉토리의 코드를 이해하고 읽고 수정하고 실행하는 에이전트가 활성화됩니다. 단순한 코드 자동완성이 아니라, 파일을 직접 읽고 쓰며 명령을 실행하는 실행 에이전트입니다.

① 설치 — 3단계로 끝내기
Step 1. 설치
bash
npm install -g @anthropic-ai/claude-code

Node.js 18+ 필요 · node -v

Step 2. API 키
bash
export ANTHROPIC_API_KEY="sk-ant-..."

~/.zshrc 에 추가하면 영구 설정

Step 3. 첫 실행
bash
cd 프로젝트폴더 && claude

프로젝트 폴더에서 실행해야 컨텍스트가 잡힘

API 키 영구 설정 (매번 export 안 하려면)
bash
# ~/.zshrc 또는 ~/.bashrc 파일 끝에 추가
echo 'export ANTHROPIC_API_KEY="sk-ant-YOUR_KEY_HERE"' >> ~/.zshrc
source ~/.zshrc

# 확인
echo $ANTHROPIC_API_KEY
② 알아두면 유용한 CLI 옵션
명령어 설명 언제 쓰나
claude대화형 모드 시작일반적인 개발 작업
claude -p "프롬프트"단발성 실행 (Non-interactive)스크립트, CI/CD 자동화
claude --model claude-opus-4-6모델 직접 지정특정 모델 강제 사용
claude --version설치된 버전 확인업데이트 여부 확인
claude --help전체 옵션 목록처음 시작 시 참고
claude --dangerously-skip-permissions퍼미션 요청 없이 자동 실행신뢰할 수 있는 자동화 환경
③ 반드시 외울 단축키와 슬래시 커맨드
단축키
Esc현재 작업 즉시 중단
Shift+TabAuto Mode 토글 (자동 승인)
Shift+Tab+TabPlan Mode 진입 (계획만 세움)
Ctrl+C세션 종료
필수 슬래시 커맨드
/help사용 가능한 모든 명령어 목록
/clear대화 컨텍스트 초기화
/compact긴 대화 요약 압축
/cost현재 세션 토큰 사용량 확인
④ 첫 실행 직후 반드시 해야 할 것들

설치만 하고 바로 "코드 짜줘"부터 하는 건 비효율적입니다. 아래 순서대로 기반을 먼저 잡아야 Claude가 제대로 일합니다.

1.
CLAUDE.md 생성 요청

프로젝트 폴더에 CLAUDE.md가 없으면 Claude가 프로젝트를 모릅니다. 첫 대화에서 생성을 요청하세요.

"이 프로젝트 구조를 분석하고 CLAUDE.md 파일을 만들어줘. 기술 스택, 폴더 구조, 아키텍처 원칙을 포함해줘."
2.
프로젝트 소개

Claude에게 프로젝트 맥락을 주입합니다. 한 번만 하면 Memory가 기억합니다.

"이 프로젝트는 B2B SaaS 제품이야. TypeScript + Next.js + Prisma 스택이고, 현재 인증 모듈 리팩토링 중이야. 앞으로 이 맥락을 기억해줘."
3.
Settings 기본값 설정

Read/Glob/Grep은 자동 승인해두면 훨씬 빠릅니다.

json
// ~/.claude/settings.json
{
  "autoApprove": {
    "tools": ["Read", "Glob", "Grep"]
  }
}
⑤ 흔한 설치 오류 & 해결법
오류: EACCES permission denied

npm 글로벌 설치 권한 문제입니다. sudo보다 nvm 사용을 권장합니다.

bash
# nvm으로 Node 재설치 후 다시 시도
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
nvm install --lts
npm install -g @anthropic-ai/claude-code
오류: Error: Cannot find module

Node.js 버전이 낮습니다. Node 18 이상이 필요합니다.

bash
node -v          # v18.x.x 이상인지 확인
nvm use 20       # 20 버전으로 전환
오류: Invalid API key

API 키가 환경변수에 제대로 들어갔는지 확인합니다.

bash
echo $ANTHROPIC_API_KEY   # 값이 출력되는지 확인
source ~/.zshrc            # 재로드 후 재시도
Quick Start
  • 설치 직후 CLAUDE.md부터 — "코드 짜줘" 전에 CLAUDE.md를 생성해야 Claude가 프로젝트를 이해하고 일한다. 10분 투자가 이후 수십 시간을 절약해준다.
  • API 키는 반드시 ~/.zshrc에 영구 저장 — 매 세션마다 export 하는 건 시간 낭비. 한 번만 설정하면 끝.
  • Read/Glob/Grep은 autoApprove에 추가 — 파일 읽기 작업마다 승인 요청이 오면 흐름이 끊긴다. 읽기는 무조건 자동 승인.
  • 프로젝트 폴더에서 claude 실행 — 루트 디렉토리에서 실행해야 파일 컨텍스트가 올바르게 잡힌다.
  • Shift+Tab으로 Auto Mode, Shift+Tab+Tab으로 Plan Mode — 이 두 단축키만 외워도 Claude를 10배 더 효율적으로 사용할 수 있다.
  • 첫 대화에서 자신의 기술 레벨 알려주기 — "나는 TypeScript 5년 차지만 Rust는 처음이야"처럼 알려주면 Claude가 설명 깊이를 맞춰준다.
SECTION 1

핵심 기능 마스터

Claude Code가 제공하는 6가지 핵심 기능을 각각 완전히 이해한다.

📋
Chapter 1 🟢 중급

CLAUDE.md & Rules — AI의 행동 헌법

한 번 쓰면 매번 설명 반복이 없어진다. Claude의 프로젝트별 영구 지침서.

CLAUDE.md는 Claude에게 "이 프로젝트에서는 이렇게 행동하라"고 알려주는 영구 지침 파일입니다. 세션이 시작될 때 Claude가 자동으로 읽으므로, 한 번 잘 작성해두면 매번 "우리는 TypeScript 써요", "테스트는 Vitest예요" 같은 설명을 반복할 필요가 없습니다.

단순한 메모가 아닙니다. CLAUDE.md에 명시된 규칙은 Claude가 모든 작업에서 참조하는 컨텍스트의 핵심입니다. 잘 쓴 CLAUDE.md 하나가 프롬프트 품질을 10배 높여줍니다.

CLAUDE.md가 없을 때 생기는 문제들
  • Claude가 프로젝트 기술 스택을 모르고 엉뚱한 라이브러리를 추천함
  • 팀 컨벤션을 무시한 코드를 생성함 (예: camelCase 써야 하는데 snake_case 사용)
  • 매번 "우리는 TypeScript 씁니다", "any 타입 쓰지 마세요" 같은 설명을 반복
  • 팀원마다 Claude에게 다른 규칙을 알려주어 일관성이 없어짐
  • 금지된 패턴(console.log, any 타입 등)을 자꾸 사용함
① 어떻게 동작하나 — 로딩 순서와 우선순위

Claude는 세션 시작 시 아래 순서대로 CLAUDE.md 파일을 모두 읽어 컨텍스트에 포함시킵니다. 여러 파일이 있으면 모두 합쳐서 적용되며, 범위가 좁은 것(폴더별)이 넓은 것(전역)을 오버라이드합니다.

text
로딩 순서 (아래로 갈수록 좁은 범위 = 더 높은 우선순위)

~/.claude/CLAUDE.md           ← ① 전역: 모든 프로젝트에 항상 적용
프로젝트루트/CLAUDE.md        ← ② 프로젝트: 이 프로젝트 전용 규칙
프로젝트루트/src/CLAUDE.md    ← ③ 폴더: 특정 폴더 진입 시 추가 적용
프로젝트루트/src/api/CLAUDE.md ← ④ 서브폴더: 더 세밀한 영역 규칙
전역 (~/.claude/)

모든 프로젝트에 공통으로 적용. 개인 선호도, 공통 컨벤션 저장.

예: "응답은 항상 한국어로", "커밋 메시지는 영어로"
프로젝트 루트

팀 전체에 공유. git에 커밋해서 모든 팀원이 동일한 규칙 적용.

예: 기술 스택, 아키텍처 원칙, 금지 행동
서브 폴더

특정 영역에만 적용. frontend/, backend/, test/ 각각 다른 규칙.

예: test/ 폴더엔 "구현 코드 수정 금지"
왜 좁은 범위가 넓은 범위를 오버라이드하나?

전역 CLAUDE.md는 "어디서나 통하는 기본값"입니다. 특정 폴더는 그 기본값이 맞지 않는 예외 영역이므로, 좁은 규칙이 이깁니다. 예를 들어 전역에서 "TypeScript any 금지"라고 해도, test/ 폴더 CLAUDE.md에서 "테스트 더블 생성 시 any 허용"이라고 하면 test/ 안에서만 예외가 적용됩니다.

실전 예시
# ~/.claude/CLAUDE.md (전역)
- 응답은 항상 한국어로
- any 타입 절대 금지

# 프로젝트루트/src/test/CLAUDE.md (서브 폴더)
- 테스트 더블 작성 시 any 타입 허용
→ test/ 폴더에서만 any 허용, 나머지는 전역 규칙 적용

충돌이 생기면: 같은 레벨에서 규칙이 충돌하면 Claude가 혼란스러워합니다. "함수는 짧게" + "모든 케이스를 처리하라"처럼 모순된 규칙이 같은 파일에 있으면, Claude가 두 규칙을 번갈아 따르거나 임의로 하나를 선택합니다. 반드시 "이 규칙이 충돌하면 A를 우선"처럼 우선순위를 명시하세요.

② 잘 쓴 CLAUDE.md vs 못 쓴 CLAUDE.md
❌ 못 쓴 예✅ 잘 쓴 예
"좋은 코드 작성해""함수는 단일 책임 원칙, 20줄 이내로 유지. 추상화 레벨은 일관되게."
"테스트 잘 작성해""Vitest로 단위 테스트 작성. 커버리지 80% 이상. describe/it 블록 중첩 최대 2단계."
"타입스크립트 써""any 타입 절대 금지. unknown으로 대체 후 타입 가드 작성. as 캐스팅도 금지."
"클린 코드로""console.log 프로덕션 코드 금지. 대신 logger.info/error 사용. (src/utils/logger.ts 참고)"
③ 실전 CLAUDE.md 예제 (풀스택 프로젝트용)
markdown — 풀스택 프로젝트
# 프로젝트 개요
B2B SaaS 회계 관리 플랫폼. 중소기업 대상. 현재 팀 3명.

# 기술 스택
- 언어: TypeScript 5.x (strict mode)
- 프레임워크: Next.js 14 (App Router)
- DB: PostgreSQL + Prisma ORM
- 테스트: Vitest + Testing Library
- 스타일: Tailwind CSS

# 아키텍처 원칙
- 레이어: app/api → services/ → repositories/
- 상태 관리: Zustand (전역), useState (컴포넌트 로컬)
- 에러 처리: Result 타입 패턴 사용 (src/types/result.ts 참고)

# 코딩 컨벤션
- 함수명: camelCase
- 컴포넌트: PascalCase
- 파일명: kebab-case
- 상수: UPPER_SNAKE_CASE

# 절대 금지 행동
- `any` 타입 사용 (unknown + 타입 가드로 대체)
- `console.log` 프로덕션 코드 사용 (logger 사용)
- `as` 타입 캐스팅 남용
- 직접 DOM 조작 (React만 사용)
- main 브랜치 직접 push
- 환경변수 하드코딩

# 테스트 원칙
- 구현 전 반드시 실패하는 테스트 먼저 작성 (TDD)
- 단위 테스트: 비즈니스 로직 집중
- 통합 테스트: API 엔드포인트 커버
- 커버리지 최소 80% 유지

# Git 워크플로우
- 브랜치명: feature/[이슈번호]-[짧은-설명]
- 커밋: Conventional Commits (feat, fix, refactor, docs)
- PR 500줄 이하 유지
- Squash merge만 허용
markdown — 데이터 분석팀용
# 프로젝트 개요
데이터 파이프라인 및 분석 대시보드. Python 기반.

# 기술 스택
- 언어: Python 3.11
- 데이터: Pandas, NumPy, Polars (대용량)
- 시각화: Plotly, Streamlit
- DB: BigQuery
- 오케스트레이션: Airflow

# 절대 금지
- for 루프로 DataFrame 행 순회 (vectorize 사용)
- `.query()` 없이 BigQuery 직접 실행 (비용 이슈)
- 로컬 파일에 PII 데이터 저장
- 타입 힌트 없는 함수 작성

# 성능 기준
- 1M 행 이하: Pandas
- 1M 행 초과: Polars 사용
- BigQuery 쿼리는 반드시 LIMIT 테스트 먼저
④ 고급 기능: @파일 참조로 코드 예시 포함

설명보다 실제 코드 예시가 훨씬 효과적입니다. CLAUDE.md 안에서 @파일경로로 실제 파일을 참조할 수 있습니다.

markdown
# 코딩 패턴
에러 처리는 반드시 Result 패턴을 사용한다:
@src/types/result.ts

API 라우트 작성 예시:
@src/app/api/users/route.ts

서비스 레이어 패턴:
@src/services/user.service.ts

Claude가 CLAUDE.md를 읽을 때 @로 참조된 파일도 함께 읽어 컨텍스트에 포함합니다. 추상적인 설명보다 실제 코드 하나가 훨씬 명확합니다.

⑤ 흔한 실수
너무 길게 쓰기

CLAUDE.md가 3000자를 넘으면 Claude가 중요한 부분을 놓칩니다. 500~1500자가 최적. 핵심 규칙만 남기고 나머지는 별도 문서로.

상충하는 규칙

"함수는 짧게" + "모든 경우를 처리하라"처럼 모순되는 지시는 Claude를 혼란스럽게 합니다. 규칙 간 우선순위를 명시하세요.

오래된 내용 방치

이미 제거한 라이브러리, 바꾼 컨벤션이 CLAUDE.md에 남아있으면 Claude가 잘못된 방향으로 작업합니다. 월 1회 리뷰를 루틴화하세요.

팀원이 모르는 암묵적 관습

혼자만 아는 관습은 CLAUDE.md에 없습니다. 팀 코드리뷰에서 반복되는 지적 사항들을 모두 CLAUDE.md에 옮기세요.

전역 CLAUDE.md에 프로젝트별 내용 넣기

~/.claude/CLAUDE.md에 특정 프로젝트 내용을 넣으면 모든 프로젝트에 적용됩니다. 전역은 진짜 공통 규칙만.

CLAUDE.md
  • 프로젝트 시작 첫 30분을 CLAUDE.md에 투자 — 코드 한 줄 짜기 전에 CLAUDE.md를 먼저 작성하라. 이후 모든 Claude 작업의 품질이 여기서 결정된다.
  • "하지 말아야 할 것"이 "해야 할 것"보다 더 강력하다 — 금지 목록이 방향 제시보다 훨씬 효과적이다. Claude는 허용보다 금지를 더 잘 지킨다.
  • 실제 코드 예시를 @참조로 포함하라 — "Result 패턴 써라"보다 @src/types/result.ts가 10배 명확하다. 설명이 아닌 예시로 가르쳐라.
  • 팀 코드리뷰 체크리스트를 금지 행동으로 변환 — PR 리뷰에서 반복되는 "이거 하지 마세요" 코멘트를 전부 CLAUDE.md 금지 목록에 넣어라.
  • Claude에게 현재 CLAUDE.md 평가를 요청 — "현재 CLAUDE.md에서 모순이나 누락된 중요 규칙이 있는지 평가해줘"로 품질 점검.
  • 폴더별 CLAUDE.md로 영역 분리 — frontend/CLAUDE.md, backend/CLAUDE.md, test/CLAUDE.md를 각각 두면 영역별로 다른 규칙을 적용할 수 있다.
  • 신규 팀원 온보딩 가이드로 겸용 — "프로젝트 이해하고 싶으면 CLAUDE.md부터 읽어라"가 될 수 있도록 작성하면 두 역할을 한다.
  • 월 1회 리뷰 & 업데이트 루틴화 — 프로젝트는 계속 변한다. 스테일한 CLAUDE.md는 없는 것보다 나쁠 수 있다.
⚙️
Chapter 2 🟢 중급

Skills (Custom Slash Commands) — 나만의 명령어

반복하는 프롬프트를 /커맨드 한 줄로. 팀 전체가 동일한 품질로 Claude를 사용한다.

Skills(커스텀 슬래시 커맨드)는 자주 사용하는 프롬프트를 .md 파일로 저장해두고 /커맨드명으로 즉시 실행하는 기능입니다. "Conventional Commits 형식으로 커밋 메시지 작성해줘, 영어로, 스코프 포함해서..."를 매번 타이핑하는 대신 /commit 한 번으로 끝냅니다.

팀 레벨에서 스킬을 관리하면 모든 팀원이 동일한 기준으로 Claude를 사용하게 됩니다. 개인 스킬 라이브러리를 구축하면 생산성이 극적으로 올라갑니다.

① 파일 위치 — 개인 vs 팀 공유
text
~/.claude/commands/            ← 개인 스킬 (모든 프로젝트에서 사용 가능)
  ├── commit.md                  /commit 커맨드
  ├── standup.md                 /standup 커맨드
  └── debug.md                   /debug 커맨드

.claude/commands/              ← 팀 프로젝트 스킬 (git에 커밋, 팀 공유)
  ├── pr.md                      /pr 커맨드
  ├── review.md                  /review 커맨드
  └── security-audit.md          /security-audit 커맨드
개인 스킬 (~/.claude/commands/)

내 모든 프로젝트에서 사용. 개인 선호에 맞춘 커맨드.

예: /standup, /debug, /explain
팀 스킬 (.claude/commands/)

git으로 공유. 팀 전체가 동일한 커맨드 사용.

예: /pr, /review, /security-audit
② 스킬 파일 구조 — Frontmatter 필드 설명
markdown — .claude/commands/commit.md
---
name: commit
description: 스테이징된 변경사항을 분석하고 Conventional Commits 형식으로 커밋
---

현재 git staging area에 있는 변경사항을 분석하고 커밋해줘.

요구사항:
- 형식: type(scope): description (영어, 50자 이내)
- type: feat/fix/refactor/docs/test/chore/style
- scope: 변경된 주요 모듈명
- body: 변경 이유와 영향 범위 (한국어 OK)
- footer: 관련 이슈 번호 (있으면)

예시:
feat(auth): add OAuth2 login with GitHub provider

Closes #123

Co-Authored-By: Claude <noreply@anthropic.com>
markdown — frontmatter 필드 전체 설명
---
name: review              # /name 으로 호출되는 커맨드명
description: 코드 리뷰    # /help 에서 보이는 설명
model: claude-haiku-4-5  # 이 스킬에서 사용할 모델 (비용 최적화)
---

프롬프트 내용...

# $ARGUMENTS 로 동적 인자 전달
# /review src/auth.ts → $ARGUMENTS = "src/auth.ts"
$ARGUMENTS 파일을 코드 리뷰해줘.
③ 실전 스킬 파일 5개 — 바로 쓸 수 있는 예제
markdown — /pr (PR 생성)
---
name: pr
description: PR 생성 — 변경 내용 자동 분석 후 GitHub PR 생성
---

현재 브랜치의 커밋들을 분석해서 GitHub PR을 생성해줘.

PR 형식:
**제목**: feat(scope): 핵심 변경 내용 (영어, 70자 이내)

**본문**:
## 변경 사항
- 주요 변경 내용 불릿 포인트

## 테스트 방법
1. 단계별 테스트 방법

## 관련 이슈
Closes #이슈번호 (있으면)

gh pr create 명령으로 실제로 PR을 생성해줘.
markdown — /review (코드 리뷰)
---
name: review
description: 파일 코드 리뷰 — 보안/로직/성능 3가지 관점
---

$ARGUMENTS 파일을 아래 3가지 관점으로 코드 리뷰해줘.

1. **보안**: 인증/인가 누락, 입력 검증 부재, SQL 인젝션, XSS
2. **로직**: 엣지 케이스 누락, 에러 처리 불완전, 비즈니스 로직 오류
3. **성능**: N+1 쿼리, 불필요한 연산, 메모리 누수 가능성

각 이슈마다:
- 이슈 설명
- 코드 라인 번호
- 수정 제안 (코드 예시 포함)
markdown — /standup (스탠드업 메시지)
---
name: standup
description: 오늘 작업 내용을 분석해 스탠드업 메시지 생성
---

최근 git 커밋 로그와 현재 변경 중인 파일들을 분석해서
스탠드업 미팅 메시지를 작성해줘.

형식:
**어제 한 일**
- 완료된 작업들

**오늘 할 일**
- 현재 진행 중인 작업들

**블로커**
- 있으면 명시, 없으면 "없음"

간결하게, Slack 붙여넣기용으로.
markdown — /debug (체계적 디버깅)
---
name: debug
description: 에러 메시지를 분석해 원인과 해결 방법 찾기
---

아래 에러를 체계적으로 디버깅해줘:

$ARGUMENTS

디버깅 순서:
1. 에러 메시지 해석 (정확히 무슨 의미인지)
2. 발생 가능한 원인 목록 (가능성 높은 순)
3. 원인 파악을 위한 확인 사항
4. 각 원인별 수정 방법
5. 재발 방지를 위한 코드 개선 제안
④ 내장 스킬 (기본 제공)
커맨드설명
/commit변경 사항 분석 후 Conventional Commits 형식으로 커밋
/review-prPR 코드 리뷰 (GitHub MCP 연결 시 인라인 코멘트까지)
/simplify선택한 코드를 더 단순하게 리팩토링
/help사용 가능한 모든 커맨드 목록 (내장 + 커스텀)
⑤ 흔한 실수
스킬 하나에 너무 많은 역할

"리뷰하고 수정하고 커밋하고 PR도 올려줘"를 한 스킬에 넣으면 각 단계를 제어하기 어렵다. 역할 하나 = 스킬 하나.

팀 스킬을 개인 폴더에 저장

~/.claude/commands/에 저장하면 팀원과 공유되지 않는다. 팀 공유 스킬은 반드시 .claude/commands/에 넣고 git 커밋.

description 필드 소홀히 하기

/help를 쳤을 때 description이 없으면 커맨드가 뭘 하는지 알 수 없다. 항상 한 줄 설명을 명확하게 작성할 것.

Skills
  • 하루 3번 이상 타이핑하는 프롬프트는 즉시 스킬로 — "또 같은 말 하고 있다"는 생각이 드는 순간 스킬로 만들어라. 30초 투자로 매번 2분을 절약한다.
  • $ARGUMENTS로 유연한 재사용 — 파일명, 이슈번호, 브랜치명 등을 인자로 받으면 하나의 스킬로 다양한 상황에 대응할 수 있다.
  • model 필드로 비용 최적화 — 단순한 스탠드업 메시지 생성, 간단한 리포맷에는 model: claude-haiku-4-5를 지정하면 비용을 90% 절감할 수 있다.
  • 팀 스킬 라이브러리를 git으로 관리 — .claude/commands/ 폴더를 git에 포함시켜라. 팀 스킬은 팀의 자산이다. PR 리뷰처럼 스킬 파일도 리뷰하라.
  • 스킬 체이닝 패턴 — /feature-ship 같은 상위 스킬 하나가 Plan → Implement → Test → /commit → /pr 순서를 자동으로 실행하도록 설계할 수 있다.
  • 스킬 안에서 다른 스킬 호출 — 스킬 파일 내에서 "다음으로 /commit을 실행해줘"처럼 다른 스킬을 체이닝할 수 있다.
🧠
Chapter 3 🟢 중급

Memory 시스템 — 세션을 넘나드는 기억

Claude는 세션이 끝나면 모든 걸 잊는다. Memory 시스템이 그 한계를 돌파한다.

Claude는 세션이 끝나면 대화 내용을 기억하지 못합니다. 내일 다시 열면 오늘 했던 결정, 배운 선호도, 진행 중인 작업 컨텍스트가 모두 사라집니다. Memory 시스템은 이 한계를 극복합니다. 중요한 정보를 파일에 저장해두면 다음 세션에서도 자동으로 로딩합니다.

CLAUDE.md가 "프로젝트 규칙"이라면, Memory는 "학습된 개인 맥락"입니다. "이 사람은 TypeScript 5년차다", "응답 마지막에 요약 붙이지 말라고 했다", "현재 인증 모듈 리팩토링 중이다" 같은 동적인 정보를 저장합니다.

어떤 정보를 어디에 넣어야 하나?
정보 유형어디에?이유
TypeScript any 금지CLAUDE.md팀 규칙 → 모든 팀원에게 적용돼야 함
나는 React 초보야Memory (user)개인 정보 → 나한테만 적용, 동료와 다름
요약 붙이지 마Memory (feedback)대화 중 발생한 선호도 → 규칙이 아니라 학습
현재 인증 모듈 리팩토링 중Memory (project)바뀌는 상태 → CLAUDE.md에 넣으면 업데이트 안 됨
Linear 이슈 추적 URLMemory (reference)외부 링크 → 코드가 아니라 도구 위치 정보

핵심 구분: "팀 전체에 항상 적용될 규칙"은 CLAUDE.md, "나에게만·지금만 해당되는 상태"는 Memory. 리팩토링 완료 후 Memory에서 지우면 되지만, CLAUDE.md에 넣으면 완료 후에도 계속 남아 혼란을 줍니다.

CLAUDE.md vs Memory — 무엇이 다른가
구분CLAUDE.mdMemory
용도프로젝트 규칙·구조학습된 선호도·맥락
변경 빈도드물게 (팀이 관리)자주 (대화 중 자동 저장)
대상모든 팀원에게 공통개인별 or 프로젝트별
편집 방법직접 파일 편집Claude에게 요청 or 직접 편집
① 4가지 메모리 타입 — 각각의 역할
user
사용자 프로필 — 기술 레벨, 선호도, 배경

Claude가 설명 깊이, 언어, 예시 방식을 맞추는 데 사용합니다. 한 번 설정하면 계속 적용됩니다.

"나는 TypeScript 10년차 백엔드 개발자야. React는 6개월차. Rust는 처음이야. 이걸 기억해줘."
markdown — user_profile.md
---
type: user
name: 사용자 기술 프로필
---
TypeScript 10년차 백엔드 개발자. Go 경험 있음.
React는 6개월차 — 프론트엔드 설명 시 백엔드 개념과 연결해 설명.
Rust는 처음 — 기초부터 설명 필요.
한국어로 소통 선호.
feedback
피드백 — 하지 말아야 할 것, 잘된 것

Claude가 같은 실수를 반복하지 않도록 기록합니다. 부정적 피드백뿐 아니라 잘된 접근 방식도 저장합니다.

"응답 마지막에 '요약하면~' 같은 요약 붙이지 마. 읽으면 아니까. 이거 기억해줘."
markdown — feedback_response_style.md
---
type: feedback
name: 응답 스타일 피드백
---
응답 마지막에 요약 붙이지 말 것.
**Why:** 사용자가 이미 내용을 읽었으므로 중복.
**How to apply:** 요약 없이 작업 결과만 전달.

코드 설명 시 주석보다 예제 코드 중심으로 할 것.
**Why:** 주석은 추상적, 예제는 직관적.
**How to apply:** 설명 전에 예제 코드 먼저 보여주기.
project
프로젝트 맥락 — 진행 중인 작업, 결정사항

현재 무엇을 하고 있는지, 어떤 결정을 내렸는지 기록합니다. 반드시 절대 날짜를 사용합니다.

"인증 모듈 리팩토링 중이야. JWT를 세션 기반으로 바꾸는 건데, 2026-05-15 배포 목표야. 기억해줘."
markdown — project_auth_refactor.md
---
type: project
name: 인증 모듈 리팩토링
---
JWT → 세션 기반 인증으로 전환 중.
**Why:** 보안 감사 결과 JWT 만료 처리 이슈 발견.
**배포 목표:** 2026-05-15 (스테이징 2026-05-01)
**How to apply:** 인증 관련 작업 시 세션 기반 방향으로 제안.
현재 진행: UserService 완료, AuthMiddleware 진행 중.
reference
레퍼런스 — 외부 시스템 위치 정보

버그 트래커, 대시보드, 문서 위치 등 "어디서 찾아야 하는지"를 기록합니다.

"버그는 Linear의 'PROJ' 프로젝트에서 추적해. Grafana 대시보드는 grafana.internal/d/api-latency야. 기억해줘."
② 메모리 파일 구조
text
~/.claude/projects/[프로젝트경로해시]/memory/
  ├── MEMORY.md               ← 인덱스 (목차, 200줄 제한)
  ├── user_profile.md         ← user 타입
  ├── feedback_style.md       ← feedback 타입
  ├── feedback_testing.md     ← feedback 타입 (복수 가능)
  ├── project_auth.md         ← project 타입
  └── reference_systems.md   ← reference 타입

# MEMORY.md 예시
- [사용자 프로필](user_profile.md) — TypeScript 10년차, React 6개월
- [응답 스타일](feedback_style.md) — 요약 없이, 예제 코드 중심
- [인증 리팩토링](project_auth.md) — JWT→세션, 2026-05-15 배포
- [외부 시스템](reference_systems.md) — Linear, Grafana 위치

MEMORY.md는 세션 시작 시 항상 로딩됩니다. 200줄 이상이면 잘립니다. 간결하게 유지하고 상세 내용은 개별 파일로 분리합니다.

③ 흔한 실수
코드 패턴이나 파일 경로를 Memory에 저장

코드는 코드베이스에, 패턴은 CLAUDE.md에. Memory는 코드로 확인할 수 없는 "사람의 맥락"만 저장하는 곳입니다.

상대 날짜로 저장

"다음 달 배포"는 한 달 뒤에 읽으면 의미가 없습니다. 반드시 "2026-05-15 배포"처럼 절대 날짜를 쓰세요.

오래된 메모리 방치

6개월 전 project 타입 메모리가 "현재 진행 중"으로 남아있으면 Claude가 잘못된 맥락으로 작업합니다. 프로젝트 전환 시 반드시 업데이트.

Memory에만 의존하고 CLAUDE.md 방치

팀 규칙은 Memory가 아닌 CLAUDE.md에 있어야 합니다. Memory는 개인 맥락, CLAUDE.md는 팀 공통 규칙입니다.

Memory 시스템
  • 첫 대화에서 user 타입 기억시키기 — 기술 레벨, 선호 언어, 설명 방식을 알려주면 Claude가 즉시 맞춤형으로 응답한다. 이걸 안 하면 매번 같은 수준으로 설명한다.
  • 실수할 때마다 feedback 타입 즉시 기록 — Claude가 같은 실수를 두 번 하면 바로 기억시켜라. 세 번째 실수는 없어진다.
  • 프로젝트 전환 시 project 타입 업데이트 — 새 프로젝트 시작 또는 큰 마일스톤 완료 시 project 메모리를 업데이트. 오래된 맥락이 남아있으면 혼란을 야기한다.
  • 절대 날짜로 저장 — "다음 달" X → "2026-05-15" O. 메모리는 시간이 지나도 읽힌다. 상대 날짜는 시간이 지나면 쓸모없어진다.
  • Why와 How to apply를 항상 포함 — "요약 붙이지 말 것"만 쓰면 나중에 이유를 모른다. "이유: 사용자가 이미 읽었으므로"를 함께 써야 Claude가 유사 상황에서 판단할 수 있다.
  • 월 1회 메모리 감사 — 완료된 project, 더 이상 유효하지 않은 feedback을 제거. 스테일 메모리는 없는 것보다 나쁠 수 있다.
🔌
Chapter 4 🟡 중급+

MCP 서버 — Claude를 외부 세계와 연결하기

로컬 파일만 다루던 Claude가 GitHub, Slack, DB까지 직접 조작하게 된다.

MCP(Model Context Protocol)는 Claude와 외부 시스템을 연결하는 표준 프로토콜입니다. 기본 Claude Code는 로컬 파일과 터미널만 다룰 수 있습니다. MCP 서버를 연결하면 GitHub PR 생성, Linear 이슈 조회, Slack 메시지 발송, 데이터베이스 쿼리 등을 Claude가 직접 처리할 수 있습니다.

MCP는 Anthropic이 만든 오픈 표준입니다. 누구나 MCP 서버를 만들 수 있고, 커뮤니티에서 수백 개의 MCP 서버가 공개되어 있습니다. 사내 API에 연결하는 커스텀 MCP 서버도 직접 구축할 수 있습니다.

MCP 없을 때 vs MCP 있을 때
MCP 없이MCP 있을 때
"PR 올려줘" → 직접 gh 명령 실행해야 함Claude가 GitHub MCP로 PR 생성, 코멘트 작성까지 자동
"Linear 이슈 #123 보여줘" → Claude가 접근 불가Claude가 이슈 읽고, 분석하고, 업데이트까지
"Slack에 배포 완료 알려줘" → 직접 해야 함Claude가 Slack MCP로 지정 채널에 메시지 발송
"DB에서 느린 쿼리 찾아줘" → DB 접근 불가Claude가 DB MCP로 직접 쿼리하고 분석
① MCP 아키텍처 — 어떻게 동작하나
text
Claude Code  ←→  MCP 서버  ←→  외부 서비스
     │               │
     │  JSON-RPC     │  API 호출
     │  (stdio/HTTP) │  (REST, GraphQL, DB)

예시 흐름:
1. Claude: "PR #123에 리뷰 코멘트 달아줘"
2. MCP 서버 (GitHub): GitHub API 호출
3. GitHub: PR에 인라인 코멘트 생성
4. MCP 서버: 결과를 Claude에게 반환
5. Claude: "코멘트 3개 추가했습니다"
stdio 방식

로컬에서 프로세스로 실행. 대부분의 MCP 서버가 이 방식.

json
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"]
HTTP 방식

원격 서버에서 실행. 사내 API 연결에 유용.

json
"url": "https://mcp.internal.company.com",
"apiKey": "..."
② 주요 MCP 서버 목록 — 설정 코드 포함
json — GitHub MCP (~/.claude/settings.json)
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxx"
      }
    }
  }
}

GitHub MCP로 가능한 것: 이슈 생성/조회/업데이트, PR 생성/리뷰/코멘트, 브랜치 관리, 파일 읽기/쓰기, 워크플로우 트리거

json — Filesystem MCP
{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/Users/me/projects",
        "/Users/me/documents"
      ]
    }
  }
}

지정된 폴더 경로만 접근 가능. Claude의 파일 접근 범위를 명시적으로 제한할 때 사용.

json — Slack MCP
{
  "mcpServers": {
    "slack": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-slack"],
      "env": {
        "SLACK_BOT_TOKEN": "xoxb-xxxxxxxxxxxx",
        "SLACK_TEAM_ID": "T0XXXXXXXXX"
      }
    }
  }
}

Slack MCP로 가능한 것: 채널 메시지 읽기/보내기, DM 발송, 채널 목록 조회, 스레드 답글

json — 여러 MCP 동시 연결
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxx" }
    },
    "slack": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-slack"],
      "env": { "SLACK_BOT_TOKEN": "xoxb-xxxx", "SLACK_TEAM_ID": "T0XXX" }
    },
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/me/projects"]
    }
  }
}
③ 개인 설정 vs 팀 공유 설정 — 보안의 핵심
❌ git에 올리면 안 되는 것
json — ~/.claude/settings.json
{
  "mcpServers": {
    "github": {
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_실제토큰"
      }
    }
  }
}

개인 토큰은 홈 디렉토리의 settings.json에만. 절대 git push 금지.

✅ git에 올려도 되는 것
json — .claude/settings.json (프로젝트)
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"]
    }
  }
}

구조만 커밋. 토큰은 각자 ~/.claude/settings.json에 추가.

④ 어떤 경우에 어떤 MCP를 써야 하나
상황MCP할 수 있는 것
코드 리뷰 자동화GitHub MCPPR 생성, 인라인 코멘트, 리뷰 상태 변경
이슈 트래킹GitHub MCP / Linear MCP이슈 생성, 라벨 추가, 담당자 지정
팀 커뮤니케이션Slack MCP배포 알림, 스탠드업 발송, 버그 리포트
문서 관리Google Drive MCP문서 읽기/쓰기, 시트 업데이트
사내 시스템 연결커스텀 HTTP MCP백오피스 API, 내부 대시보드, 레거시 DB
⑤ 흔한 실수 & 보안 주의사항
토큰을 프로젝트 settings.json에 넣고 git push

GitHub Personal Access Token이 공개 레포에 올라가면 즉시 무효화됩니다. 개인 토큰은 반드시 ~/.claude/settings.json에만.

실제로 어떤 일이 생기나: GitHub는 자동 봇으로 public 레포의 모든 커밋을 스캔합니다. ghp_로 시작하는 토큰이 감지되면 수 초 내로 해당 토큰을 비활성화하고 계정 소유자에게 이메일 알림을 보냅니다. 이미 push된 커밋에서 토큰을 삭제해도 git 히스토리에 남아있으면 소용없습니다. git history 전체를 rewrite해야 합니다. private 레포라도 팀원 전체가 내 개인 토큰으로 작업하게 되어 권한·책임이 뒤섞입니다.

모든 MCP를 한번에 다 연결

연결된 MCP 서버가 많을수록 Claude의 컨텍스트가 무거워지고, 불필요한 권한이 부여됩니다. 필요한 것만 연결하고 나머지는 제거.

쓰기 권한 토큰으로 시작

처음엔 read-only 토큰으로 시작하고, 쓰기가 필요해지면 그때 권한을 추가하세요. 최소 권한 원칙을 지키세요.

MCP
  • GitHub MCP + /review 스킬 조합이 최강 — Claude가 코드를 분석하고, GitHub API로 PR에 인라인 코멘트를 직접 달고, 리뷰 상태까지 변경하는 완전 자동화 리뷰 파이프라인이 만들어진다.
  • 사용 안 하는 MCP는 즉시 제거 — 연결된 MCP가 많을수록 시작 속도가 느려지고 보안 노출 면적이 넓어진다. 쓰는 것만 연결.
  • read-only 토큰으로 시작 — GitHub에서 read-only 토큰을 먼저 발급받아 조회 기능만 테스트하고, 익숙해지면 쓰기 권한 추가. 실수로 의도치 않은 변경을 방지.
  • HTTP MCP로 사내 API 연결 — 내부 백오피스, 모니터링 대시보드, 레거시 시스템을 Claude와 연결하면 Claude가 실제 프로덕션 데이터를 보고 분석할 수 있다.
  • 팀 공유 MCP는 구조만 커밋 — .claude/settings.json에 MCP 서버 구조(command, args)만 커밋하고, 각자의 토큰은 ~/.claude/settings.json에 추가하는 방식으로 팀 표준화와 보안을 동시에.
🪝
Chapter 5 🟡 중급+

Hooks — 이벤트 기반 자동화

CLAUDE.md는 권고, Hooks는 강제. 위험 명령 차단부터 자동 포맷까지.

CLAUDE.md에 "rm -rf 쓰지 마세요"라고 써도 Claude가 간혹 무시할 수 있습니다. Hooks는 다릅니다. 특정 이벤트가 발생하면 무조건 지정한 스크립트가 실행됩니다. Claude를 우회할 수 없습니다.

Hooks는 이벤트 드리븐 자동화 시스템입니다. Claude가 도구를 실행하기 전/후, 사용자가 프롬프트를 제출할 때, 응답이 완료된 후 — 각 시점에 원하는 스크립트를 걸어둘 수 있습니다. exit code로 계속 진행할지 차단할지를 제어합니다.

① Hook 실행 흐름 — exit code가 핵심
text
이벤트 발생
    ↓
Hook 스크립트 실행
    ↓
exit code 0    → 정상 진행
exit code != 0 → 작업 차단 (Claude에게 에러 메시지 전달)

stdout → Claude가 읽음 (컨텍스트로 전달)
stderr → 로그로만 기록 (Claude에게 전달 안 됨)
stdout vs stderr를 구분하는 이유

stdout에 출력한 내용은 Claude가 읽습니다. "이 파일은 production DB 설정이야. 수정 금지"처럼 컨텍스트를 Claude에게 전달할 때 stdout을 사용합니다. stderr는 디버깅용 로그만 출력하세요. stdout에 디버그 로그를 섞으면 Claude가 불필요한 내용을 컨텍스트로 인식합니다.

exit code를 잘못 반환하면 어떻게 되나

항상 exit 0을 반환하는 hook: 위험 명령 차단 hook이 에러를 감지해도 exit 0을 반환하면 Claude가 그냥 진행합니다. rm -rf /도 차단되지 않습니다.

항상 exit 1을 반환하는 hook: 모든 도구 실행이 차단됩니다. Claude가 파일을 읽을 수도 없게 됩니다. hook 스크립트에 버그가 있으면 Claude Code 전체가 마비될 수 있습니다.

② 4가지 Hook 이벤트 — 각각의 역할
이벤트실행 시점차단 가능?주요 용도
PreToolUseClaude가 도구 실행 직전가능위험 명령 차단, dry-run 패턴
PostToolUseClaude가 도구 실행 직후불가자동 포맷, 린트, git add
UserPromptSubmit사용자 프롬프트 전송 시가능컨텍스트 자동 주입, 프롬프트 보강
PostResponseClaude 응답 완료 후불가로그 저장, Slack 알림, 통계
③ 실전 Hook 예제 5개
json — 예제 1: 위험 명령 차단 (PreToolUse)
{
  "hooks": {
    "PreToolUse": [{
      "matcher": "Bash",
      "hooks": [{
        "type": "command",
        "command": "bash -c 'cmd=$(echo \"$CLAUDE_TOOL_INPUT\" | jq -r .command); if echo \"$cmd\" | grep -qE \"rm -rf|git push --force|DROP TABLE\"; then echo \"위험 명령 감지: $cmd\" && exit 1; fi'"
      }]
    }]
  }
}
json — 예제 2: 파일 저장 후 Prettier 자동 실행 (PostToolUse)
{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Write|Edit",
      "hooks": [{
        "type": "command",
        "command": "bash -c 'file=$(echo \"$CLAUDE_TOOL_RESULT\" | jq -r .path // empty); if [ -n \"$file\" ] && echo \"$file\" | grep -qE \"\\.(ts|tsx|js|jsx|json)$\"; then npx prettier --write \"$file\" 2>/dev/null; fi'"
      }]
    }]
  }
}
json — 예제 3: 프롬프트에 현재 브랜치 자동 주입 (UserPromptSubmit)
{
  "hooks": {
    "UserPromptSubmit": [{
      "hooks": [{
        "type": "command",
        "command": "bash -c 'branch=$(git branch --show-current 2>/dev/null || echo \"unknown\"); issue=$(echo \"$branch\" | grep -oE \"[0-9]+\" | head -1); echo \"[현재 브랜치: $branch, 이슈: #$issue]\"; exit 0'"
      }]
    }]
  }
}

이 훅이 설치되면 모든 프롬프트에 "[현재 브랜치: feature/123-auth, 이슈: #123]"이 자동으로 주입됩니다. Claude가 항상 현재 컨텍스트를 압니다.

json — 예제 4: 파일 저장 후 자동 git add (PostToolUse)
{
  "hooks": {
    "PostToolUse": [{
      "matcher": "Write|Edit",
      "hooks": [{
        "type": "command",
        "command": "bash -c 'file=$(echo \"$CLAUDE_TOOL_RESULT\" | jq -r .path // empty); if [ -n \"$file\" ]; then git add \"$file\" 2>/dev/null; echo \"auto-staged: $file\"; fi'"
      }]
    }]
  }
}
json — 예제 5: 작업 완료 시 Slack 알림 (PostResponse)
{
  "hooks": {
    "PostResponse": [{
      "hooks": [{
        "type": "http",
        "url": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
        "method": "POST",
        "headers": { "Content-Type": "application/json" },
        "body": "{\"text\": \"Claude 작업 완료 ✅\"}"
      }]
    }]
  }
}
④ Hook 설정 위치
text
~/.claude/settings.json    ← 전역 훅 (모든 프로젝트에 적용)
.claude/settings.json      ← 프로젝트 훅 (팀 공유 가능, 토큰 없는 것만)
⑤ 흔한 실수
훅 스크립트에 버그가 있으면 Claude의 모든 작업이 막힌다

PreToolUse 훅이 항상 exit 1을 반환하면 Claude가 어떤 명령도 실행할 수 없게 됩니다. 반드시 훅 스크립트를 단독으로 먼저 테스트하세요.

PostToolUse 훅이 느리면 매 파일 저장마다 지연

Prettier 실행, 린트, 타입 체크 등을 PostToolUse에 넣으면 파일 저장마다 수초가 걸립니다. 훅 스크립트는 200ms 이하로 유지하거나 비동기로 실행하세요.

누적 효과: 훅 1회 실행에 500ms가 걸린다고 가정합니다. Claude가 리팩토링 작업에서 파일 20개를 수정하면, 훅이 20번 실행 = 10초 순수 대기. 100개 파일이면 50초. Claude가 멈춰 있는 것처럼 보이고 사용자는 응답을 기다립니다. 린트·타입 체크는 PostResponse(전체 작업 완료 후 1회)에 넣으면 이 문제를 피할 수 있습니다.

matcher 없이 모든 도구에 훅 적용

matcher를 지정하지 않으면 모든 도구 실행마다 훅이 동작합니다. "Bash", "Write", "Edit" 등 필요한 도구만 명시적으로 타겟팅하세요.

Hooks
  • LSP 강제 사용 훅이 가장 효과가 크다 — Claude가 Grep 대신 IDE LSP를 사용하도록 강제하는 훅을 설치하면 토큰 소비를 80% 줄일 수 있다. 가장 ROI가 높은 훅이다.
  • 훅 스크립트는 200ms 이하로 — 느린 훅은 전체 워크플로우를 병목으로 만든다. 오래 걸리는 작업은 백그라운드로 실행하거나 PostResponse에 넣어라.
  • PreToolUse로 dry-run 패턴 — 위험한 명령을 차단하기 전에 "이 명령을 실행하려 합니다: [명령]"을 stdout으로 출력하면 Claude가 그 내용을 컨텍스트로 받아 더 신중하게 결정한다.
  • PostToolUse로 자동 스테이징 — 파일 수정 후 즉시 git add를 자동 실행하면, /commit 실행 시 빠짐없이 모든 변경사항이 포함된다.
  • UserPromptSubmit으로 컨텍스트 자동 주입 — 현재 브랜치, 이슈 번호, 환경 정보를 모든 프롬프트에 자동으로 붙여 Claude가 항상 현재 상황을 인식하게 만들어라.
  • CLAUDE.md + Hooks 이중 레이어 — CLAUDE.md는 "방향 제시 (권고)", Hooks는 "강제 실행". 중요한 규칙은 CLAUDE.md에 쓰고 Hooks로도 강제하면 절대 무시되지 않는다.
  • 훅 에러는 별도 로그 파일로 관리~/.claude/hook-errors.log에 stderr를 리다이렉트하면 디버깅이 훨씬 쉬워진다.
⚙️
Chapter 6 🟡 중급+

Settings & 환경설정 — Claude를 내 방식대로

모델 선택, 퍼미션 제어, 자동 승인 범위. Claude의 동작 방식을 세밀하게 제어한다.

Settings는 Claude의 동작 방식, 퍼미션, 사용 모델, 자동 승인 범위를 제어하는 설정 파일입니다. 잘 설정하면 매번 승인 요청 없이 Claude가 빠르게 작업하면서도, 위험한 명령은 차단됩니다.

① 설정 파일 위치 및 우선순위
text
우선순위 (아래로 갈수록 높음)

~/.claude/settings.json        ← 전역 기본값 (모든 프로젝트 적용)
.claude/settings.json          ← 프로젝트 설정 (전역 덮어씀)
환경변수 (ANTHROPIC_MODEL 등)  ← 최우선 (CI/CD에서 유용)
② 완전한 settings.json 예제 — 주요 설정 항목 모두 포함
json — ~/.claude/settings.json
{
  "model": "claude-sonnet-4-6",

  "permissions": {
    "allow": [
      "Bash(git *)",
      "Bash(npm *)",
      "Bash(npx *)",
      "Read(**)",
      "Write(src/**)",
      "Write(test/**)"
    ],
    "deny": [
      "Bash(rm -rf *)",
      "Bash(git push --force*)",
      "Bash(git push --force-with-lease*)",
      "Bash(DROP *)",
      "Write(.env*)"
    ]
  },

  "autoApprove": {
    "tools": ["Read", "Glob", "Grep", "LS"]
  },

  "env": {
    "NODE_ENV": "development",
    "LOG_LEVEL": "debug"
  },

  "includeCoAuthoredBy": true,

  "disabledTools": ["WebSearch", "WebFetch"]
}
③ 핵심 설정 항목 상세 설명
model — 사용 모델 지정
json
"model": "claude-sonnet-4-6"   // 균형잡힌 성능/비용
"model": "claude-opus-4-6"     // 최고 성능 (복잡한 작업)
"model": "claude-haiku-4-5-20251001"  // 빠르고 저렴 (단순 작업)

스킬 파일의 model 필드로 스킬별 모델을 개별 지정할 수도 있습니다. 간단한 스킬엔 Haiku로 비용 절감.

permissions.allow / deny — 퍼미션 제어
json
"permissions": {
  "allow": [
    "Bash(git *)",        // git 명령은 모두 허용
    "Bash(npm test)",     // npm test만 허용
    "Read(**)",           // 모든 파일 읽기 허용
    "Write(src/**)"       // src 폴더만 쓰기 허용
  ],
  "deny": [
    "Bash(rm -rf *)",     // rm -rf 완전 차단
    "Bash(* --force*)",   // --force 포함 명령 차단
    "Write(.env*)"        // .env 파일 수정 차단
  ]
}

deny가 allow보다 우선합니다. 읽기는 넓게, 쓰기는 좁게, 위험한 것은 명시적으로 차단.

왜 deny가 우선인가? allow: Bash(git *)는 모든 git 명령을 허용하지만, deny: Bash(git push --force*)가 있으면 force push는 차단됩니다. "허용 안에서도 일부를 막는" 구조입니다. deny를 allow보다 약하게 설계하면, deny를 추가했는데도 allow가 덮어써서 차단이 무력화되는 사고가 생길 수 있습니다.

autoApprove — 승인 없이 자동 실행할 도구
json
"autoApprove": {
  "tools": ["Read", "Glob", "Grep", "LS"]
}
// Read/Glob/Grep/LS: 파일 시스템을 읽기만 함. 코드를 실행하거나 파일을 변경하지 않음.
// Write, Edit, Bash: 파일 수정·삭제·명령 실행이 가능. 반드시 사람이 확인.
// 규칙: 상태를 변경할 수 있는 도구는 autoApprove에 넣지 않는다.
disabledTools — 특정 도구 완전 비활성화
json
"disabledTools": ["WebSearch", "WebFetch"]
// 오프라인 환경, 보안 정책상 외부 접근 차단 시
// 또는 Claude가 웹 검색으로 집중력이 분산되는 것을 방지
④ 환경변수로 설정 오버라이드 (CI/CD용)
bash
# 모델 오버라이드
ANTHROPIC_MODEL=claude-haiku-4-5-20251001 claude -p "빠른 작업"

# API 키 오버라이드
ANTHROPIC_API_KEY=sk-ant-xxx claude -p "작업 실행"

# GitHub Actions에서 Claude 실행
env:
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
  ANTHROPIC_MODEL: claude-sonnet-4-6
Settings
  • deny 목록을 먼저 설정하라 — 허용 목록보다 금지 목록이 더 중요하다. rm -rf, git push --force, .env 수정을 명시적으로 차단하는 것부터 시작하라.
  • autoApprove는 Read/Glob/Grep만으로 시작 — 읽기 전용 도구만 자동 승인하고, Claude의 작업 패턴이 파악되면 점진적으로 확대하라.
  • 프로젝트별 .claude/settings.json으로 팀 표준화 — 팀 모두가 동일한 퍼미션 설정을 쓰도록 .claude/settings.json을 git에 포함시켜라.
  • disabledTools로 집중도 향상 — 특정 프로젝트에서 웹 검색이 필요 없다면 비활성화하라. Claude의 응답이 더 명확해지고 토큰도 절약된다.
  • 환경변수로 CI/CD에서 설정 오버라이드 — GitHub Actions에서 ANTHROPIC_MODEL을 Haiku로 설정하면 자동화 비용을 크게 절감할 수 있다.
SECTION 2

실행 모드 마스터

Claude가 어떤 방식으로 작업을 수행하는지 이해하고, 상황에 맞는 모드를 선택한다.

🗺️
Chapter 7 🟡 고급

Plan Mode — 실행 전 설계

먼저 계획하고, 사람이 승인하면 실행한다. 복잡한 작업의 안전장치.

Plan Mode는 Claude가 실행 전에 계획만 세우고, 사람이 승인할 때까지 기다리는 모드입니다. 복잡한 작업을 바로 실행하면 Claude가 잘못된 방향으로 수십 개 파일을 수정할 수 있습니다. Plan Mode를 사용하면 "이렇게 하겠습니다"를 먼저 보여주고, 사람이 검토한 후 실행합니다.

① 언제 Plan Mode가 필요한가
Plan Mode가 필요한 상황
  • 처음 보는 코드베이스에서 큰 변경 작업
  • 여러 파일에 걸친 리팩토링 (10개 이상)
  • 아키텍처 수준의 설계 변경
  • 결과를 예측하기 어려운 복잡한 버그 수정
  • 새 기능 추가 전 영향 범위 파악
  • 데이터 마이그레이션 계획
Plan Mode가 필요 없는 상황
  • 한 파일의 한 줄 수정
  • 변수명 변경
  • 주석 추가
  • 포맷 수정
  • 이미 잘 아는 영역의 간단한 기능 추가
"10개 이상"이라는 기준은 어떻게 정하나

파일 수 자체보다 되돌리기 어려운 변경인지가 핵심입니다. "10개"는 실용적인 경험칙일 뿐입니다. 팀마다 "5개 이상이면 Plan Mode" 또는 "인터페이스 변경이면 무조건 Plan Mode"처럼 자신만의 명확한 기준을 CLAUDE.md에 정의하세요. 기준이 명확할수록 매번 판단하는 비용이 없어집니다.

② Plan Mode 진입 방법
단축키
Shift+Tab+Tab

Claude Code 대화 창에서 토글. Plan Mode 아이콘이 활성화됨.

프롬프트로 명시
"plan mode로 먼저 계획만 세워줘. 실행하지 마."
CLI 플래그
bash
claude --plan "작업 내용"
③ Plan Mode 작업 흐름
text
1. Plan Mode 진입 (Shift+Tab+Tab)

2. 작업 요청
   "인증 모듈을 JWT에서 세션 기반으로 리팩토링해줘"

3. Explore sub-agent가 코드베이스 자동 조사
   - 영향 받는 파일 목록 파악
   - 현재 인증 흐름 분석
   - 의존성 파악

4. Plan sub-agent가 구현 전략 설계
   - 변경 순서 결정
   - 각 파일별 변경 사항 명시
   - 위험 요소 식별

5. 계획 파일 생성 (사람이 검토 가능한 형태)
   예: "변경 파일 7개, 순서: middleware → service → controller → test"

6. 사람이 계획 검토
   - 동의하면: Plan Mode 종료 → 실행
   - 수정 요청: "3단계 순서를 바꿔줘"

7. 실행
④ Plan Mode에서 사용하는 Sub-agent 타입
Sub-agent역할언제 쓰나
Explore코드베이스 조사 전문낯선 코드 이해, 파일 구조 파악, 의존성 추적
Plan구현 전략 설계접근 방법 결정, 트레이드오프 분석, 순서 설계
general-purpose범용 실행특정 전문화가 필요 없는 일반 작업
⑤ 실전 시나리오: Plan Mode 없을 때 vs 있을 때
Plan Mode 없이 (안티패턴)

사용자: "인증 시스템을 JWT에서 세션 기반으로 바꿔줘"

Claude: (즉시 실행) auth.ts, middleware.ts, userController.ts, sessionStore.ts, tests/auth.test.ts, config.ts, types/index.ts... 12개 파일 수정

→ 30분 후: 앱이 시작도 안 됨. 어디서 깨졌는지 모름

Plan Mode 진입 후 (추천 패턴)

사용자: [Plan Mode 진입 후] "인증 시스템을 JWT에서 세션 기반으로 바꿔줘"

→ Claude가 계획을 먼저 출력, 사람이 검토 후 승인

→ 잘못된 순서 발견 시 수정 후 재실행 가능

text — Claude 계획 출력 예시
📋 변경 계획
영향 파일: 12개
예상 위험: AuthService가 JWT 토큰 검증에 의존하고 있어 순서가 중요합니다.

실행 순서:
1. [위험 낮음] config/session.ts 생성 — 세션 설정
2. [위험 낮음] middleware/session.ts 수정 — passport-session 추가
3. [위험 중간] services/AuthService.ts 수정 — JWT → 세션 교체
4. [위험 중간] controllers/UserController.ts 수정 — 토큰 응답 제거
5. [위험 낮음] tests/auth.test.ts 수정 — 세션 기반 테스트로 교체

진행하시겠습니까?
계획이 마음에 안 들 때 — 수정 요청
"3단계와 4단계 순서를 바꿔줘. 컨트롤러를 먼저 수정해야 서비스와 인터페이스가 맞아."
계획 승인 후 단계별 실행
"좋아. 1~3단계만 먼저 실행해줘. 중간 결과 확인 후 4~5단계 진행할게."
⑥ CLAUDE.md로 특정 상황에 Plan Mode 자동 강제하기

매번 "plan mode로"라고 말하는 대신, CLAUDE.md에 규칙을 정의하면 Claude가 자동으로 판단합니다.

markdown — CLAUDE.md Plan Mode 규칙
# Plan Mode 자동 적용 규칙
다음 상황에서는 반드시 Plan Mode로 계획을 먼저 제시하고, 승인 없이 실행 금지:
- 10개 이상 파일에 걸친 변경
- DB 스키마 변경 (migration 파일 생성 필요)
- API 인터페이스 변경 (다른 서비스/클라이언트에 영향)
- package.json 의존성 추가/제거
- 인증/보안 관련 코드 변경

계획 출력 형식:
- 영향 파일 수
- 변경 실행 순서 (위험도 포함)
- 예상 위험 요소
효과

CLAUDE.md에 이 규칙이 있으면, 해당 상황이 올 때마다 Claude가 자동으로 Plan Mode처럼 동작합니다. 실수로 큰 작업을 바로 실행하는 일이 없어집니다.

Plan Mode
  • 10개 이상 파일이 바뀌는 작업은 항상 Plan Mode — 기준을 명확히 정해두라. "파일 10개 이상이면 Plan Mode"처럼 규칙을 만들어두면 판단 비용이 없어진다.
  • Plan Mode에서도 Explore를 먼저 실행 — 계획을 세우기 전에 코드베이스를 충분히 탐색해야 올바른 계획이 나온다. "먼저 관련 파일을 모두 탐색해줘"로 시작하라.
  • 계획을 파일로 저장하라 — "이 계획을 PLAN.md로 저장해줘"를 요청하면 나중에 참조하거나 팀원과 공유할 수 있다.
  • 계획 단계에서 질문을 많이 하라 — Plan Mode에서 질문하는 토큰 비용은 실수로 잘못 구현했다가 롤백하는 비용보다 훨씬 싸다.
  • 계획 승인 후 단계별로 확인하며 실행 — 계획을 승인했다고 끝까지 놔두지 마라. 중간 체크포인트를 설정하고 단계마다 결과를 확인하라.
🤖
Chapter 8 🔴 고급

Sub-agents & Agent Teams — 병렬 지능

여러 에이전트가 동시에 다른 부분을 작업하면 훨씬 빠르다. 단, 충돌 방지가 핵심이다.

Sub-agents는 Claude가 복잡한 작업을 처리할 때 독립된 하위 에이전트에게 특정 태스크를 위임하는 방식입니다. 혼자 순서대로 작업하는 것보다, 여러 에이전트가 병렬로 조사하거나 개발하면 훨씬 빠릅니다.

① Sub-agents vs Agent Teams — 무엇이 다른가
구분Sub-agentsAgent Teams
실행 위치현재 세션 내부독립된 별도 세션
조율 방식직접 결과 반환공유 태스크 파일로 소통
적합한 작업빠른 조사, 단순 위임장기 병렬 개발 작업
복잡도낮음높음
Sub-agents를 쓸 때

"30분 안에 끝나는 분석/조사 작업"이면 Sub-agents. 메인 세션 안에서 실행되므로 설정 없이 바로 병렬 실행되고, 결과가 즉시 반환됩니다. 파일 분석, 코드 탐색, 보고서 작성에 최적.

Agent Teams를 쓸 때

"여러 시간 걸리는 구현 작업"이면 Agent Teams. 각 에이전트가 독립 세션이라 메인 Claude가 다른 작업을 하면서 기다릴 수 있습니다. 단, tasks.md 설정 등 초기 오버헤드가 있습니다. 단순 조사에 쓰면 설정 비용이 더 비쌉니다.

② Sub-agents 사용 패턴 (병렬 조사)
순차 방식 (비효율)

"auth/ 분석해줘" → 5분 대기

"API 목록 정리해줘" → 5분 대기

"테스트 커버리지 확인해줘" → 5분 대기

총 15분 소요. 각 작업이 앞 결과와 무관한데도 순서대로 기다린다.

Sub-agents 병렬 방식 (효율)

3개 Explore agent 동시 실행

auth 분석 + API 목록 + 테스트 커버리지 → 동시 진행

총 ~5분 소요. 서로 독립적인 작업이라 순서 의존성이 없다.

왜 Explore agent를 지정하나? 일반 agent에게 분석을 맡기면 분석 중에 파일을 수정하거나 명령을 실행할 수 있습니다. Explore를 명시하면 읽기 전용으로 동작이 제한되어, 병렬 실행 중 의도치 않은 파일 변경이 발생하지 않습니다.

왜 3개인가? 분석 영역이 3개(인증/API/테스트)이기 때문입니다. 에이전트 수는 독립적으로 분리 가능한 영역 수와 맞추는 것이 원칙입니다. 억지로 5개로 늘리면 결과 취합 복잡도만 높아집니다.

text — 프롬프트 예시
"이 프로젝트를 동시에 분석해줘:
 - Explore agent 1: src/auth/ 관련 모든 파일 분석하고 인증 흐름 정리
 - Explore agent 2: API 엔드포인트 목록과 각 엔드포인트의 미들웨어 정리
 - Explore agent 3: 현재 테스트 커버리지 현황과 누락된 테스트 파악
결과를 취합해서 종합 보고서 작성해줘."
text — 메인 Claude의 내부 흐름
메인 Claude
  ├── Explore agent 1 → auth 폴더 분석 보고서 반환
  ├── Explore agent 2 → API 목록 반환            (동시 실행)
  └── Explore agent 3 → 테스트 커버리지 반환

메인 Claude → 3개 보고서 취합 → 종합 분석
언제 병렬화가 의미 없는가

작업들 사이에 순서 의존성이 있으면 병렬화해도 빨라지지 않습니다. "auth 분석 결과를 보고 API 설계를 결정해줘"처럼 앞 결과가 뒤 작업의 입력이 되는 경우는 순차가 맞습니다. 독립적인 작업인지 먼저 확인하세요.

③ Agent Teams 패턴 (장기 병렬 개발)
markdown — 공유 태스크 파일 (tasks.md)
## 태스크 목록

- [진행중] [AGENT-A] auth/ 폴더 — JWT 제거, 세션 미들웨어 구현
- [ ] [AGENT-B] payment/ 폴더 — Stripe 웹훅 핸들러 구현
- [ ] [AGENT-C] test/ 폴더 — 위 두 모듈의 통합 테스트 작성
- [완료] [AGENT-D] docs/ 폴더 — API 문서 업데이트

## 규칙
- 각 에이전트는 자신의 폴더만 수정
- 공유 types/ 폴더 수정 시 리드 에이전트에게 위임
- 태스크 시작 시 [진행중]으로 변경
- 완료 시 [완료]로 변경 후 다음 태스크 선택
text — 파일 충돌 방지 전략
충돌 방지 3원칙:

1. 영역 분리: 각 에이전트에게 담당 폴더를 명확히 지정
   AGENT-A → auth/
   AGENT-B → payment/
   AGENT-C → test/

2. 공유 파일은 리드 에이전트만 수정
   types/, utils/ 등 공통 모듈은 한 에이전트만 담당

3. 태스크 파일에 상태 표시
   작업 시작 전 [진행중]으로 표시해 중복 작업 방지
규칙을 어기면 어떻게 되나

영역 분리 없이 실행 → AGENT-A가 auth/user.ts의 User 타입을 수정하는 동시에 AGENT-B가 같은 파일의 다른 부분을 수정. 나중에 합치면 한쪽 변경이 덮어써진다. Git merge 충돌도 발생.

공유 파일을 여러 에이전트가 수정 → types/index.ts에 AGENT-A가 User 인터페이스를 추가하고, AGENT-B가 같은 파일의 다른 인터페이스를 동시에 수정. 두 버전 중 하나만 살아남는다.

[진행중] 표시 없이 작업 → AGENT-A와 AGENT-B가 tasks.md에서 같은 [ ] 태스크를 동시에 읽고 둘 다 작업 시작. 동일한 작업이 두 번 구현되고 나중에 통합 시 충돌.

규칙이 권장 사항이 아닌 이유

여러 Claude 인스턴스는 서로의 작업을 실시간으로 볼 수 없습니다. 인간 개발자처럼 "아 저 파일은 다른 사람이 수정 중이구나"를 감지하지 못합니다. 명시적 규칙만이 충돌을 막는 유일한 수단입니다.

④ 실전 시나리오 — 경쟁적 디버깅
text — 프롬프트 예시
"이 버그의 원인으로 두 가지 가설이 있어:
 - Agent A: 가설1 — 캐시 무효화 타이밍 문제를 검증해줘
 - Agent B: 가설2 — 타임존 처리 오류를 검증해줘
먼저 재현 성공한 에이전트의 가설이 맞을 가능성이 높아.
각자 독립적으로 검증하고 결과를 보고해줘."

두 에이전트가 동시에 다른 가설을 검증하므로, 단순 순차 방식보다 2배 빠르게 버그 원인을 찾을 수 있습니다.

⑤ Sub-agent 타입별 실전 사용 가이드
Explore
조사/분석 전문 — 쓰기 작업 없음

코드를 읽고 분석하는 작업에 특화. 파일을 수정하지 않으므로 안전하게 병렬 실행 가능.

"auth/ 폴더의 모든 파일을 읽고 인증 흐름을 다이어그램으로 정리해줘. 파일은 수정하지 마."
Plan
설계/전략 수립 전문

구현 순서, 접근 방법, 트레이드오프 분석. 탐색 결과를 기반으로 실행 전략을 수립할 때 사용.

"이 API를 REST에서 GraphQL로 바꾸는 마이그레이션 전략을 수립해줘. 장단점과 단계별 순서를 포함해서."
general
실제 구현/실행

파일 수정, 코드 작성, 명령 실행. 특정 전문화가 필요 없는 일반 작업.

"UserService.ts에 Redis 캐시 레이어를 추가해줘."
text — 3개 타입 조합 프롬프트 예시
"동시에 진행해줘:
 - Explore agent: 현재 인증 구조 파악 (auth/ 폴더 전체 분석)
 - Explore agent: API 엔드포인트 전체 목록 정리
 - Plan agent: 세션 기반 전환 전략 수립 (장단점 포함)

3개 결과를 취합해서 마이그레이션 로드맵 만들어줘.

→ 순차 진행보다 3배 빠름
→ 각 에이전트가 독립 컨텍스트로 해당 영역에만 집중
⑥ Git Worktree로 에이전트 완전 격리 (파일 충돌 원천 차단)
같은 폴더에서 여러 에이전트가 작업할 때의 문제

두 에이전트가 같은 파일을 동시에 수정하면 충돌 발생. tasks.md로 영역을 나눠도 공유 파일(types/, config/)은 여전히 위험.

Worktree 방식: 에이전트마다 독립 브랜치 + 독립 폴더. 파일 충돌 자체가 불가능.

bash — Worktree 기반 병렬 에이전트 설정
# 에이전트별 독립 작업 공간 생성
git worktree add ../project-auth feature/auth-session
git worktree add ../project-payment feature/payment-stripe
git worktree add ../project-notify feature/notification

# 프롬프트: 각 worktree에 에이전트 배치
"3개 worktree에서 병렬로 작업해줘:
 - ../project-auth 폴더: 세션 인증 구현 (auth/ 폴더만)
 - ../project-payment 폴더: Stripe 웹훅 구현 (payment/ 폴더만)
 - ../project-notify 폴더: 알림 시스템 구현 (notification/ 폴더만)

 각자 자신의 폴더에서만 작업. 완료 시 PR 생성 후 보고해줘."

# 완료 후 정리
git worktree remove ../project-auth
git worktree remove ../project-payment
git worktree remove ../project-notify
Worktree vs 폴더 분리의 차이

폴더 분리: 같은 git 저장소, 같은 파일 시스템 → 공유 파일 충돌 가능
Worktree: 각자 다른 브랜치, 완전히 독립된 파일 상태 → 충돌 원천 차단

Sub-agents & Teams
  • 독립적인 탐색 작업에 가장 효과적 — 서로 의존하지 않는 조사 작업들(파일 분석, API 파악, 테스트 현황)을 병렬로 실행하면 3배 빠르다.
  • 에이전트별 파일 영역을 명확히 분리하라 — "어떤 폴더도 건드려도 됨"은 충돌의 시작이다. 담당 폴더를 폴더 단위로 명확히 지정하라.
  • 공유 파일은 한 에이전트만 담당 — types/, utils/, config/ 같은 공통 파일은 리드 에이전트 한 명만 수정하도록 규칙을 만들어라.
  • tasks.md로 중복 작업 방지 — Agent Teams에서 tasks.md에 [진행중] 상태를 표시하면 두 에이전트가 같은 작업을 하는 것을 막을 수 있다.
  • 단순 작업에 Agent Teams는 과도하다 — 설정 오버헤드가 크다. 30분 이하 작업은 Sub-agents로, 수 시간 이상 걸리는 대형 작업에 Agent Teams를 쓰라.
🚗
Chapter 9 🔴 고급

Auto Mode & Headless 실행 — 완전 자율 실행

사람이 없어도 Claude가 작업을 완수한다. CI/CD, 야간 자동화, 예약 작업에 활용.

Auto Mode와 Headless 실행은 Claude를 사람의 개입 없이 자동으로 실행하는 방법입니다. 개발 도중에는 매 실행마다 승인하지 않아도 되고, CI/CD 파이프라인에서는 완전 자동으로 코드 리뷰, 버그 수정, 문서 업데이트를 처리할 수 있습니다.

① Auto Mode — 승인 없이 자동 진행
진입 방법
Shift+Tab

대화 창에서 토글. 모드 표시기가 "Auto"로 변경됨.

동작 방식 — deny 충돌 시 어떻게 되나

settings.json의 permissions.allow 범위 안에서는 자동 실행합니다. deny에 있는 작업을 Claude가 하려 하면 조용히 실패하는 게 아니라 중단하고 사용자에게 알립니다. 예: deny에 Bash(rm *)가 있는데 Claude가 임시 파일을 지우려 하면, Auto Mode여도 승인 요청이 뜹니다.

즉, allow = "이건 자동 승인", deny = "이건 항상 물어봐". deny가 allow보다 우선합니다.

주의: Auto Mode 사용 전 반드시 확인
  • !permissions.deny에 위험한 명령들이 모두 포함되어 있는지 확인
  • !작업 범위가 잘 정의되어 있는지 확인
  • !중요한 작업은 먼저 git commit으로 백업 후 시작
② Headless 실행 — 스크립트처럼 Claude 실행
bash
# 기본 Headless 실행 (-p = prompt)
claude -p "src/ 폴더의 모든 TypeScript 파일에서 console.log를 logger.info로 교체해줘"

# 특정 모델로 실행
claude -p "보안 취약점 스캔해줘" --model claude-opus-4-6

# 퍼미션 자동 승인 (신뢰 환경에서만)
claude -p "테스트 실행하고 실패한 것들 수정해줘" --dangerously-skip-permissions

# 출력을 파일로 저장
claude -p "코드 분석 보고서 작성해줘" > report.md
③ GitHub Actions에서 Claude 실행
yaml — .github/workflows/claude-review.yml
name: Claude Code Review

on:
  pull_request:
    types: [opened, synchronize]

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Install Claude Code
        run: npm install -g @anthropic-ai/claude-code

      - name: Run Claude Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          claude -p "PR의 변경사항을 리뷰하고 GitHub PR에 인라인 코멘트를 달아줘. 보안과 로직 버그에 집중해." \
            --dangerously-skip-permissions
yaml — CI 실패 시 자동 분석
on:
  workflow_run:
    workflows: ["CI"]
    types: [completed]

jobs:
  analyze-failure:
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    runs-on: ubuntu-latest
    steps:
      - run: |
          claude -p "CI 로그를 분석해서 실패 원인과 수정 방법을 제안해줘" \
            --dangerously-skip-permissions
④ 자율 실행의 안전 설계 원칙
원칙 1: 최소 권한

자동화 작업에 필요한 permissions만 allow에 추가. rm, force push는 항상 deny.

원칙 2: 가역적 액션만

삭제보다 이동, force push 대신 일반 push. 실수해도 되돌릴 수 있는 작업만 자동화.

원칙 3: 중단 조건 명시

프롬프트에 "에러가 3번 이상 발생하면 중단해줘"처럼 중단 조건을 명확히 포함.

원칙 4: 사람 검토 게이트

중요 단계에서는 완전 자동화 대신 "결과를 보고하고 진행 여부를 물어봐줘" 패턴 사용.

⑤ Auto Mode settings.json 권한 설정 실전 예시

Auto Mode는 settings.json의 permissions.allow에 정의된 범위 안에서만 자동 실행됩니다. 범위 밖은 여전히 승인을 요청합니다.

json — 읽기 전용 Auto Mode (가장 안전, 처음 시작 시)
{
  "permissions": {
    "allow": [
      "Read(*)",
      "Glob(*)",
      "Grep(*)"
    ],
    "deny": [
      "Edit(*)",
      "Write(*)",
      "Bash(*)"
    ]
  }
}

분석, 탐색, 보고서 작성에만 사용. 파일을 절대 수정하지 않으므로 어떤 작업을 시켜도 안전.

json — 개발용 Auto Mode (일반적인 사용)
{
  "permissions": {
    "allow": [
      "Read(*)",
      "Edit(src/**)",
      "Edit(test/**)",
      "Bash(npm test*)",
      "Bash(npm run lint*)",
      "Bash(git add*)",
      "Bash(git commit*)"
    ],
    "deny": [
      "Bash(rm *)",
      "Bash(git push --force*)",
      "Bash(npm publish*)",
      "Bash(git reset --hard*)"
    ]
  }
}

src/, test/ 수정 허용. 테스트/린트 자동 실행 허용. rm, force push, npm publish 차단.

4단계 점진적 신뢰 구축
1주차
읽기 전용

deny에 모든 Edit/Write/Bash. 분석과 탐색만 허용. Claude가 어떤 판단을 하는지 관찰.

2주차
단일 파일 Edit 허용

Edit(src/utils/*.ts) 같이 특정 파일만 허용. 변경 결과를 하나씩 확인.

3주차
비핵심 폴더 허용

Edit(src/utils/**), Edit(test/**) 허용. 핵심 비즈니스 로직(src/services/)은 아직 수동 승인.

4주차
전체 src/ + 테스트 실행 허용

Edit(src/**), Bash(npm test*) 허용. 위험 명령(rm, force push)만 deny 유지.

⑥ Headless 배치 처리 실전 패턴

Headless로 반복적인 작업을 스크립트화하면, 수십 개 파일을 자동으로 처리하거나 결과를 구조화된 형태로 수집할 수 있습니다.

bash — 레거시 파일 일괄 TypeScript 변환
#!/bin/bash
FILES=(
  "src/legacy/userUtils.js"
  "src/legacy/paymentUtils.js"
  "src/legacy/emailUtils.js"
)

for file in "${FILES[@]}"; do
  echo "처리 중: $file"
  claude -p "
    $file을 TypeScript로 변환하고 ESM import/export로 교체해줘.
    변환 후 tsc --noEmit으로 컴파일 에러가 없는지 확인해줘.
    에러가 있으면 수정해줘. 에러 없이 완료해야 다음 파일로 넘어가.
  " --dangerously-skip-permissions

  if [ $? -ne 0 ]; then
    echo "오류 발생: $file 처리 중단"
    exit 1
  fi
done
echo "전체 변환 완료"
bash — 보안 스캔 결과를 JSON으로 수집 후 Slack 알림
#!/bin/bash
# 보안 스캔 결과를 JSON으로 받아 critical 건수 확인
claude -p "
  src/ 폴더의 보안 취약점을 스캔하고 결과를 JSON으로만 출력해줘:
  {\"critical\": [\"설명1\", ...], \"major\": [...], \"minor\": [...]}
  JSON 외 다른 텍스트 없이 JSON만 출력할 것.
" > security-report.json

CRITICAL=$(cat security-report.json | jq '.critical | length')

if [ "$CRITICAL" -gt 0 ]; then
  echo "🚨 Critical 취약점 ${CRITICAL}개 발견!"
  curl -X POST "$SLACK_WEBHOOK" \
    -d "{\"text\": \"보안 스캔: Critical ${CRITICAL}건 발견. 즉시 확인 필요.\"}"
  exit 1
fi
echo "✅ Critical 취약점 없음"
Auto Mode & Headless
  • 점진적 신뢰 구축 후 Auto Mode — 처음부터 Auto Mode로 큰 작업을 맡기지 마라. 1주차: 읽기만, 2주차: 단일 파일, 3주차: 멀티 파일, 4주차: Auto Mode.
  • Headless로 반복 작업 자동화 — "매일 오전 9시에 의존성 취약점 스캔해줘"처럼 cron과 결합하면 완전 자동화가 가능하다.
  • 중단 조건을 항상 명시 — "에러가 나면 중단해줘"를 빠뜨리면 Claude가 잘못된 방향으로 계속 달려간다. 자율 실행일수록 중단 조건이 더 중요하다.
  • Auto Mode 전에 git commit — 자동 실행 전에 현재 상태를 커밋해두면, 뭔가 잘못되어도 즉시 rollback이 가능하다.
  • --dangerously-skip-permissions는 신뢰 환경에서만 — CI/CD처럼 격리된 환경에서만 사용. 로컬 개발 환경에서는 절대 사용 금지.
SECTION 3

실전 워크플로우

앞에서 배운 기능들을 조합해 실제 개발 작업을 처리한다.

🌿
Chapter 10 🟡 고급

Git 기반 태스크 워크플로우 — 모든 작업의 기본 단위

Branch → Commit → PR → Merge. 이 패턴을 지키면 Claude의 모든 작업이 추적 가능하고 되돌릴 수 있다.

Claude의 작업은 되돌리기 어렵습니다. 10개 파일을 수정했다가 잘못된 방향임을 깨달았을 때, 브랜치가 없으면 수동으로 되돌려야 합니다. Branch → Commit → PR 패턴을 지키면, 잘못되어도 브랜치 삭제로 깔끔하게 리셋됩니다. 이 패턴이 모든 워크플로우의 기반입니다.

① 황금 패턴 — 모든 Claude 작업에 적용
bash — 완전한 워크플로우
# 1단계: 작업 브랜치 생성
git checkout -b feature/123-add-oauth-login

# 2단계: 프롬프트로 작업 위임
# "OAuth 로그인 기능을 추가해줘. GitHub과 Google을 지원해야 해.
#  기존 JWT 인증과 호환되어야 하고, 테스트도 작성해줘."

# 3단계: 의미 있는 단위마다 커밋 (완전 자동)
/commit
# → "feat(auth): add OAuth provider configuration"
# → "feat(auth): implement GitHub OAuth callback"
# → "test(auth): add OAuth integration tests"

# 4단계: PR 생성
/pr
# → gh pr create --title "feat: add OAuth login" --body "..."

# 5단계: 리뷰 반영
# "PR 코멘트 반영해줘" → 수정 후 /commit

# 6단계: Merge (Squash merge로 깔끔한 히스토리)
gh pr merge --squash
/commit이 하는 일 — 단순 git commit이 아니다

/commit은 Claude Code의 슬래시 커맨드입니다. Claude가 현재 변경된 파일들을 분석해서 의미 있는 단위로 자동으로 나누고, 각 단위에 맞는 Conventional Commits 형식의 메시지를 작성해 커밋합니다. "auth 설정 추가"와 "GitHub 콜백 구현"은 별도 커밋으로 분리됩니다. 그냥 git commit -am "작업 완료"와 전혀 다릅니다.

왜 브랜치를 먼저 만들어야 하나

브랜치 없이 main에서 작업하다 잘못된 방향임을 깨달았을 때, 수십 개 파일을 손으로 되돌려야 합니다. 브랜치가 있으면 git checkout main && git branch -D feature/xxx 두 줄로 완전히 리셋됩니다. Claude가 수정한 파일이 많을수록 이 안전망의 가치가 커집니다.

왜 Squash merge인가

Claude가 작업 중간에 "WIP", "fix typo", "add console.log" 같은 임시 커밋을 많이 만듭니다. Squash merge하면 이런 커밋들이 하나의 의미 있는 커밋("feat: add OAuth login")으로 합쳐져 main 히스토리가 깔끔해집니다.

② CLAUDE.md에 Git 규칙 명시하기
markdown — CLAUDE.md Git 섹션
# Git 워크플로우
- 모든 작업은 feature 브랜치에서 시작. main 직접 push 절대 금지.
- 브랜치명: feature/[이슈번호]-[짧은-설명] (예: feature/123-add-oauth)
- 커밋: Conventional Commits 형식 (feat, fix, refactor, docs, test, chore)
- PR은 500줄 이하로 유지. 초과 시 분할 제안.
- Squash merge만 허용. Merge commit 금지.
- PR 없이 main에 직접 push 하지 말 것.
③ 긴급 버그 인터럽트 패턴

왜 stash를 쓰나? feature 브랜치에서 작업 중인 파일들은 미완성 상태입니다. 이 상태에서 main으로 브랜치를 바꾸면 미완성 파일들이 함께 딸려오거나 checkout이 거부될 수 있습니다. stash는 작업 중인 변경사항을 임시 보관소에 넣어두고 워킹 디렉토리를 깨끗하게 만들어줍니다. 브랜치를 추가로 만드는 것보다 단순합니다.

bash
# 현재 작업 임시 저장 (미완성 파일 모두 보관)
git stash push -m "WIP: OAuth 로그인 구현 중"

# 긴급 버그 브랜치 생성
git checkout main
git checkout -b hotfix/critical-login-null-pointer

# 버그 수정 위임
# "로그인 시 NPE 발생하는 버그 수정해줘. 에러 로그: ..."
/commit
# → "fix(auth): handle null user session in login flow"

# main에 머지
git checkout main
git merge hotfix/critical-login-null-pointer

# 원래 작업으로 복귀 (보관해둔 미완성 파일 복원)
git checkout feature/123-add-oauth
git stash pop
stash pop에서 충돌이 나면?

hotfix에서 수정한 파일과 stash에 보관된 파일이 겹치면 충돌이 발생합니다. 이 경우 Claude에게 "stash pop 충돌이 났어. hotfix 변경사항을 우선하되, 내 OAuth 작업은 보존해줘"라고 위임하면 해결됩니다.

④ 각 단계에서 사용하는 실제 프롬프트
작업 시작 시
"feature/123-add-oauth 브랜치에서 OAuth 로그인 기능을 추가해줘. GitHub과 Google만 지원하고, 기존 /api/auth 구조에 맞춰줘."
중간 체크포인트
"지금까지 변경한 내용을 의미 있는 단위로 커밋해줘. 커밋 메시지는 Conventional Commits 형식으로."
PR 생성 시
"PR을 생성해줘. 변경 내용 요약, 테스트 방법, 관련 이슈 #123을 포함해줘."
PR 리뷰 반영 시
"PR 코멘트들을 반영해줘. 특히 보안 리뷰어의 토큰 저장 방식 피드백을 반드시 반영해."
⑤ 팀 환경 응용 패턴
Stacked PR — 의존 작업 순서 관리

기능 B가 기능 A에 의존할 때, A가 main에 merge되기 전에 B 작업을 시작해야 하는 경우.

bash
# PR1: 기반 인증 모듈 (main ← feature/auth-base)
# PR2: OAuth 기능 (feature/auth-base ← feature/oauth) ← base를 main이 아닌 auth-base로

"feature/oauth 브랜치에서 OAuth 기능을 추가해줘.
 feature/auth-base가 아직 main에 안 들어갔어.
 feature/auth-base를 base branch로 삼아서 PR 만들어줘.
 PR 설명에 'feature/auth-base 머지 후 이 PR 머지 가능'이라고 명시해줘."
Fork 모델 — 오픈소스 기여 워크플로우
"upstream/main에서 최신 변경을 가져와서 내 fork(origin)에 반영하고, 그 위에 feature/my-fix 브랜치를 만들어서 작업 시작해줘. upstream과 origin을 혼동하지 마."
⑥ Merge 충돌 해결 워크플로우
충돌 발생 시 — 양쪽 의도 보존
"git merge 중 auth/middleware.ts에서 충돌 발생. 내 변경(세션 기반 인증 추가)과 main의 변경(JWT 갱신 로직)을 양쪽 다 반영해줘. 어느 쪽도 버리지 마."
충돌 전략 선택 — 맥락에 따라
"이 충돌에서 어느 쪽을 선택해야 하는지 판단해줘. 내 변경사항의 의도와 main 변경사항의 의도를 먼저 설명하고, 통합 방법을 추천해줘."
충돌 유형대응 전략
같은 코드의 다른 수정양쪽 의도 파악 후 통합 — "두 변경사항을 모두 반영한 버전 만들어줘"
한쪽이 파일 삭제삭제 이유 확인 후 결정 — "git log로 삭제 이유 파악해줘"
설정 파일 충돌각 설정값의 역할 파악 후 병합 — "각 키의 의미를 분석해서 안전하게 합쳐줘"
완전히 다른 로직두 버전 모두 보여주고 선택 — "내가 선택할 수 있도록 두 버전의 결과를 비교해줘"
Git 워크플로우
  • Claude에게 작업을 주기 전에 항상 브랜치 생성 — 이 하나만 지켜도 잘못된 작업을 브랜치 삭제로 깔끔하게 리셋할 수 있다.
  • /commit을 의미 있는 단위마다 실행 — "작업 다 끝나면 커밋할게"는 위험하다. 중간 중간 커밋해야 어디서 잘못됐는지 추적할 수 있다.
  • CLAUDE.md에 Git 규칙을 명시 — "main 직접 push 금지", "PR 500줄 이하" 같은 규칙을 CLAUDE.md에 넣으면 Claude가 자연스럽게 지킨다.
  • 긴급 상황을 대비한 stash 패턴을 준비 — 언제 긴급 버그가 올지 모른다. stash → hotfix → stash pop 패턴을 숙달해두라.
  • PR은 가능한 작게 유지 — 500줄 이하 PR이 리뷰 받기 쉽고, Claude도 더 정확하게 리뷰할 수 있다. 큰 PR은 분할 제안을 요청하라.
  • Squash merge로 깔끔한 히스토리 — Claude가 중간에 수십 개의 "WIP" 커밋을 만들어도, Squash merge하면 하나의 의미 있는 커밋만 main에 남는다.
🧪
Chapter 11 🟡 고급

TDD 워크플로우 — 테스트가 먼저다

Claude는 구현 먼저 하려는 본능이 있다. 이 본능을 명시적으로 제어해야 진짜 TDD가 된다.

Claude에게 "loginUser 함수 만들어줘"라고 하면 즉시 구현 코드를 작성합니다. TDD를 하려면 이 패턴을 깨야 합니다. 테스트를 먼저 작성하고, 그 테스트를 통과시키는 최소한의 구현을 하고, 리팩토링하는 순서를 Claude에게 명시적으로 지시해야 합니다.

① CLAUDE.md에 TDD 규칙 강제하기
markdown — CLAUDE.md 테스트 섹션
# 테스트 원칙 (TDD)
- 구현 코드 작성 전 반드시 실패하는 테스트를 먼저 작성
- 테스트 없이 구현 코드 추가 금지 (예외 없음)
- Red → Green → Refactor 순서 엄수
- 테스트가 Green이 된 후에만 리팩토링 가능
- 테스트 프레임워크: Vitest
- 커버리지 최소 80% 유지
- 모든 public 함수에 단위 테스트 필수
CLAUDE.md 규칙이 "강제"되는 원리

Claude는 매 대화 시작 시 CLAUDE.md를 자동으로 읽고 시스템 지시로 인식합니다. "구현 전 테스트 먼저"가 명시되어 있으면, Claude가 자동으로 이를 고려해서 구현 코드보다 테스트를 먼저 작성하는 방향으로 행동합니다. 단, 이는 소프트 강제입니다. 명시적으로 "구현만 해줘"라고 요청하면 규칙을 무시할 수 있으므로, 중요한 제약은 그 세션에서 다시 한 번 프롬프트로 명시하는 것이 안전합니다.

규칙 없이 요청하면 어떻게 되나

"loginUser 함수 만들어줘"라고만 하면 Claude는 구현 코드를 먼저 작성합니다. CLAUDE.md에 TDD 규칙이 없으면, 매번 "테스트 먼저 작성하고, 구현하지 마"라고 프롬프트에 포함해야 합니다. CLAUDE.md는 이 반복을 없애줍니다.

② TDD 단계별 워크플로우
R
Red — 실패하는 테스트 먼저
"loginUser 함수의 단위 테스트를 먼저 작성해줘. 아직 구현은 하지 마. 실패하는 테스트만 작성해. 케이스: 정상 로그인, 존재하지 않는 유저, 잘못된 비밀번호, 잠긴 계정."
bash
npm test -- loginUser.test.ts
# → 4개 모두 FAIL (예상된 결과)
G
Green — 최소 구현으로 통과
"방금 작성한 테스트를 통과시키는 최소한의 구현만 작성해줘. 완벽한 코드보다 테스트 통과가 목표야."
bash
npm test -- loginUser.test.ts
# → 4개 모두 PASS
R
Refactor — 테스트 유지하면서 개선
"테스트는 건드리지 말고 구현 코드만 개선해줘. 중복 제거, 가독성 향상, 에러 처리 보강."
bash
npm test -- loginUser.test.ts
# → 여전히 4개 PASS (리팩토링 검증)
bash — 완료 후 커밋
/commit
# → "test(auth): add loginUser unit tests"
# → "feat(auth): implement loginUser function"
③ 버그 수정 시 회귀 테스트 패턴
Step 1. 버그를 재현하는 테스트 먼저
"이 버그를 재현하는 실패 테스트를 먼저 작성해줘. 버그: 세션이 만료된 후 로그인 시 500 에러 발생."
Step 2. 버그 수정
"방금 작성한 테스트가 Green이 되도록 버그를 수정해줘."
효과

이 테스트는 코드베이스에 영원히 남아 같은 버그가 다시 발생하면 즉시 감지합니다. 버그 수정 = 회귀 테스트 추가.

④ 레거시 코드에 TDD 도입하기
문제 상황: 테스트 없는 레거시 코드를 변경해야 할 때

테스트 없이 변경하면 무엇이 깨졌는지 알 수 없다. 그렇다고 테스트를 먼저 작성하자니 함수가 뭘 해야 하는지조차 모른다. 이 딜레마를 Characterization Test가 해결한다.

Step 1. Characterization Test — 현재 동작을 그대로 기록
"calculateDiscount(user, cart) 함수가 있어. 테스트가 하나도 없어. 이 함수를 수정하기 전에, 현재 동작 방식을 그대로 기록하는 Characterization Test를 먼저 작성해줘. 함수 내부를 이해하려 하지 말고, 다양한 입력에 대한 실제 출력값만 기록해. 테스트 이름에 'characterizes_current_behavior' 포함해줘."
Step 2. 변경 후 테스트 실행

Characterization Test가 깨지면 → 기존 동작이 바뀐 것. 의도한 변경인지 확인.
Characterization Test 통과 → 기존 동작 보존. 새 케이스만 추가 가능.

왜 이 방법인가

기존 동작을 "계약서"처럼 고정합니다. 레거시 코드를 리팩토링해도 계약이 깨지지 않으면 안전합니다. "이 함수가 원래 이렇게 동작했나?"를 테스트가 증명해줍니다.

⑤ 테스트 더블 전략 — Mock/Stub/Spy 언제 쓰나
markdown — CLAUDE.md 테스트 더블 정책
# 테스트 더블 정책
- 외부 API 호출 (Stripe, SendGrid, Slack): Mock 사용 — 실제 호출 절대 금지
- DB 쿼리: 단위 테스트는 In-memory DB 또는 Stub, 통합 테스트는 실제 DB
- 이메일 발송: Stub으로 발송 내용만 검증 (실제 발송 금지)
- 파일 시스템: 실제 임시 디렉토리 사용 (os.tmpdir())
- 시간 의존 코드 (new Date()): 시간을 인자로 주입받는 구조로 리팩토링 후 테스트
Mock — 외부 서비스 대체 (호출 자체를 검증)
"sendWelcomeEmail 함수 테스트 작성해줘. SendGrid API는 Mock으로 대체해줘. Mock에서 검증할 것: 올바른 이메일 주소로 호출됐는지, 템플릿 ID가 맞는지, 사용자 이름이 변수로 전달됐는지."
Stub — 특정 값을 반환하도록 고정
"사용자 등급별 할인 계산 테스트 작성해줘. UserRepository는 Stub으로 대체하고, VIP 유저 반환/일반 유저 반환/유저 없음 케이스를 각각 Stub으로 설정해줘."
테스트 더블언제목적
Mock외부 API, 이메일 발송호출 여부, 호출 인자 검증
StubDB 조회, 설정 파일특정 값 반환 강제
실제 객체순수 함수, 유틸리티복잡성 없이 실제 동작 검증
TDD 워크플로우
  • CLAUDE.md에 "구현 전 테스트 먼저"를 명시 — Claude는 기본적으로 구현을 먼저 하려 한다. CLAUDE.md에 TDD 규칙을 명시해야 Claude가 항상 테스트를 먼저 작성한다.
  • "실패하는 테스트만"을 명시적으로 요청 — "테스트 작성해줘"는 구현도 같이 만들 수 있다. "아직 구현하지 마. 실패하는 테스트만"이라고 명확히 지시하라.
  • 버그를 만날 때마다 회귀 테스트 추가 — 버그를 고칠 때 항상 재현 테스트를 먼저 작성하라. 이 테스트가 미래의 회귀를 막아준다.
  • Hooks로 테스트 자동 실행 — PostToolUse 훅에 npm test를 연결하면 파일 저장마다 테스트가 자동 실행되어 즉시 피드백을 받을 수 있다.
  • 커버리지를 CLAUDE.md에 명시 — "커버리지 80% 이상 유지"를 CLAUDE.md에 넣으면 Claude가 구현 후 자동으로 커버리지를 확인하고 누락된 테스트를 추가한다.
🔍
Chapter 12 🟡 고급

코드 리뷰 워크플로우

관점 하나씩 집중 리뷰가 전체 리뷰보다 깊다. GitHub MCP와 결합하면 인라인 코멘트까지 자동화.

"전체 리뷰해줘"라고 하면 피상적인 리뷰가 나옵니다. 관점 하나씩 집중해서 요청할 때 깊이 있는 리뷰가 나옵니다. 보안 → 로직 → 성능 순서로 라운드를 나눠 요청하는 것이 핵심 전략입니다.

① 3라운드 리뷰 워크플로우
"전체 리뷰해줘" 방식의 문제

Claude의 컨텍스트는 한 번에 여러 관점을 동시에 깊게 볼 수 없습니다. "전체 리뷰"를 요청하면 보안, 로직, 성능을 얕게 훑고 표면적인 이슈만 잡습니다. 중요한 SQL 인젝션이나 레이스 컨디션 같은 미묘한 버그는 놓치기 쉽습니다.

관점 분리 방식의 장점

한 라운드에 한 관점만 요청하면 Claude가 해당 관점에만 집중합니다. 보안 라운드에서는 인증/입력 검증만 생각하므로, "전체" 리뷰보다 훨씬 깊이 파고듭니다. 중요한 코드일수록 라운드 수를 늘리세요.

왜 보안 → 로직 → 성능 순서인가? 보안 취약점은 치명적이고 나중에 발견할수록 고치기 어렵습니다. 성능은 문제가 생겨도 핫픽스가 가능하지만 보안 취약점은 데이터 유출로 이어질 수 있습니다. 심각도 순서대로 리뷰합니다.

1라운드: 보안 리뷰 — 가장 먼저, 가장 중요
"이 PR에서 보안 취약점만 집중해서 찾아줘. 인증/인가 누락, 입력 검증 부재, SQL 인젝션 가능성, XSS 취약점, 민감 정보 노출 위험 중심으로. 다른 건 신경 쓰지 마."
2라운드: 로직 리뷰 — 비즈니스 정확성
"이제 비즈니스 로직 버그 가능성만 검토해줘. 엣지 케이스 누락, 에러 처리 불완전, 상태 관리 오류, 레이스 컨디션 가능성 중심으로."
3라운드: 성능 리뷰 — 마지막에 확인
"마지막으로 성능 문제만 검토해줘. N+1 쿼리, 불필요한 반복 연산, 메모리 누수 가능성, 과도한 DB 호출 중심으로."
시간 대비 효율 — 3라운드가 항상 필요한 건 아니다

내부 유틸리티나 간단한 기능 추가라면 1라운드만 해도 충분합니다. 인증/결제 같은 보안 민감 코드나 대용량 데이터를 처리하는 코드라면 3라운드 모두 진행하세요. PR의 위험도에 비례해서 라운드 수를 결정하면 됩니다.

② GitHub MCP로 인라인 코멘트 자동화

GitHub MCP가 연결되어 있으면 Claude가 PR에 직접 인라인 코멘트를 달 수 있습니다.

text — 프롬프트
"PR #123의 각 파일을 검토하고 이슈마다 GitHub PR 인라인 코멘트를 직접 달아줘.
 각 코멘트에는:
 - 이슈 설명 (한국어)
 - 심각도 (critical/major/minor)
 - 수정 제안 코드 (있으면)

 보안 이슈는 반드시 포함. critical 이슈는 PR approval 거부."

Claude가 GitHub API로 직접 PR에 코멘트를 게시합니다. 리뷰어가 별도로 코멘트를 달 필요가 없어집니다.

③ 제출 전 자기 리뷰 패턴
text — PR 생성 전 셀프 리뷰
# PR 생성 전에 자신이 만든 코드를 스스로 리뷰하게 하기
"방금 작성한 코드를 PR 제출 전에 스스로 리뷰해줘.
 엄격한 시니어 리뷰어 관점에서. 발견한 이슈들을 수정하고,
 수정 완료 후 /commit 해줘. 그 다음 /pr으로 PR 생성."
④ 대규모 PR 리뷰 전략 (500줄 초과)

500줄이 넘는 PR을 한 번에 리뷰하면 중요한 이슈를 놓치기 쉽습니다. 파일 레이어별로 나눠 라운드를 진행하면 각 레이어에 집중할 수 있습니다.

text — 레이어별 분할 리뷰 프롬프트
"PR #45는 820줄이야. 파일 레이어별로 나눠서 리뷰해줘:

 라운드 1: *.test.ts 파일만 — 테스트 품질과 커버리지
 라운드 2: services/ 레이어만 — 비즈니스 로직과 도메인 규칙
 라운드 3: controllers/ 레이어만 — API 설계와 HTTP 처리
 라운드 4: types/ 파일만 — 타입 정의와 인터페이스 설계

 각 라운드 결과를 표로 정리해줘:
 | 파일 | 발견 이슈 | 심각도 (critical/major/minor) |"
PR 분할 제안 자동화

CLAUDE.md에 추가:

markdown
# PR 리뷰 규칙
PR 리뷰 전 변경 크기 먼저 보고:
- 500줄 초과 시: 분할 방법 먼저 제안
- 분할 기준: 레이어별, 기능별, 파일 타입별
리뷰 결과 우선순위 정리
"리뷰 결과를 critical → major → minor 순으로 정리해줘. critical 이슈는 merge 전 반드시 수정, minor는 follow-up 이슈로 등록."
⑤ 팀 컨벤션 자동 검증 리뷰

코드 스타일 리뷰는 사람이 하기 가장 지루한 작업입니다. CLAUDE.md에 정의된 팀 컨벤션을 기준으로 체크리스트 형태로 자동 검증합니다.

text — 컨벤션 체크리스트 리뷰 프롬프트
"이 PR을 CLAUDE.md의 코딩 컨벤션 기준으로 리뷰해줘.
 각 항목을 ✅ 통과 / ❌ 위반 / ⚠️ 확인필요 로 표시해줘:

 □ 함수명이 camelCase인가
 □ 클래스/컴포넌트명이 PascalCase인가
 □ any 타입 사용이 있는가 (있으면 반드시 ❌)
 □ console.log가 남아 있는가
 □ TODO 주석에 이슈 번호가 있는가 (예: TODO(#123))
 □ 에러 메시지가 한국어로 사용자 친화적인가
 □ 모든 public 함수에 JSDoc 주석이 있는가
 □ 테스트 파일명이 *.test.ts 형식인가

 위반 항목은 수정 방법도 함께 제시해줘."
활용 팁

이 체크리스트를 GitHub Actions PR 자동 리뷰에 포함하면, 모든 PR이 merge 전에 컨벤션 검증을 자동으로 통과하게 됩니다.

⑥ 리뷰 코멘트 일괄 반영 패턴

리뷰 코멘트가 많을 때, 하나씩 읽으며 반영하는 것은 비효율적입니다. GitHub MCP를 연결하면 모든 코멘트를 가져와서 우선순위별로 일괄 처리할 수 있습니다.

text — 리뷰 코멘트 일괄 처리 프롬프트
"PR #45의 모든 리뷰 코멘트를 GitHub에서 가져와서:

 1단계: 심각도별로 분류
   - critical: 보안 취약점, 데이터 손실 가능성
   - major: 버그, 잘못된 로직
   - minor: 스타일, 네이밍, 가독성

 2단계: critical → major 순서로 모두 수정
   (minor는 별도 이슈 생성만)

 3단계: 수정 완료 후 /commit

 4단계: 수정한 파일들만 다시 셀프 리뷰
   (리뷰어 의도가 제대로 반영됐는지 확인)"
수정 후 재확인 프롬프트
"리뷰어 코멘트를 반영한 파일들만 다시 읽고, 각 코멘트의 의도가 완전히 반영됐는지 확인해줘. 놓친 부분이 있으면 추가 수정해줘."
코드 리뷰
  • 관점 하나씩 집중 리뷰 — "전체 리뷰"보다 "보안만", "로직만", "성능만"이 훨씬 깊은 리뷰를 만들어낸다. 라운드를 나눠라.
  • GitHub MCP 연결 후 인라인 코멘트 자동화 — Claude가 직접 PR에 코멘트를 달면 리뷰 시간이 80% 줄어든다. GitHub MCP가 가장 ROI가 높은 MCP다.
  • PR 제출 전 셀프 리뷰를 루틴화 — Claude가 자신이 만든 코드를 스스로 리뷰하게 하면 외부 리뷰에서 발견될 이슈의 절반을 사전에 제거할 수 있다.
  • 관련 파일만 로딩 — "PR의 auth 관련 파일만 읽어서 리뷰해줘"처럼 범위를 제한하면 컨텍스트 낭비 없이 깊은 리뷰가 가능하다.
  • critical 이슈와 minor 이슈를 구분 — 모든 이슈를 같은 우선순위로 다루면 진짜 중요한 것이 묻힌다. 심각도 분류를 요청하라.
🔨
Chapter 13 🟡 고급

리팩토링 워크플로우 — 작게, 안전하게, 계속

한 번에 모든 걸 바꾸면 무엇이 문제인지 알기 어렵다. 작은 단계, 테스트, 커밋의 반복이 안전한 대규모 리팩토링을 만든다.

리팩토링의 핵심은 외부 동작은 바꾸지 않고 내부 구조를 개선하는 것입니다. Claude에게 "전체 리팩토링해줘"라고 하면 한번에 너무 많은 것을 바꿔서 테스트가 깨질 때 어디서 문제가 생겼는지 추적하기 어렵습니다. 작은 단계로 나눠서 각 단계마다 테스트를 확인하고 커밋하는 패턴이 안전합니다.

① 안전한 리팩토링 단계별 워크플로우
Step 1. 현재 상태 확인
"리팩토링 전에 현재 테스트 커버리지 확인하고 보고해줘. 어떤 테스트가 있는지, 커버리지가 몇%인지."
Step 2. 좁은 범위로 첫 리팩토링
"UserService의 중복 validation 로직을 Extract Method로 정리해줘. 이 파일만. 다른 파일은 건드리지 마."
Step 3. 테스트 확인
bash
npm test -- UserService.test.ts
# → 모두 PASS 확인 후 다음 단계
Step 4. 커밋하고 다음 단계
bash
/commit
# → "refactor(user): extract duplicate validation into validateUserInput"
# 다음 파일로 이동하여 반복
② 리팩토링 유형별 전략
유형전략
단일 파일 정리한 번에 진행. 중간 저장 후 테스트 확인.
멀티 파일 리팩토링파일별로 순차 처리. 파일마다 테스트 + 커밋.
인터페이스 변경Plan Mode로 전체 영향 범위 먼저 파악 후 실행.
아키텍처 레이어 분리레이어 하나씩 순서대로. 각 단계에서 테스트 통과 확인.
레거시 코드 현대화먼저 테스트 작성 → 리팩토링. 테스트 없이 레거시 건드리는 것은 위험.
③ 대규모 리팩토링 전 Plan Mode 필수
text — 인터페이스 변경 전 Plan Mode 사용
# Plan Mode 진입 후:
"UserRepository 인터페이스를 변경해서 비동기 메서드로 바꾸려고 해.
 변경 전에 이 인터페이스가 몇 군데에서 사용되는지,
 어떤 순서로 변경해야 하는지 계획만 세워줘."

# 예상 결과:
# "UserRepository는 12개 파일에서 사용됩니다.
#  변경 순서: repository → service → controller → test
#  예상 위험: AuthService에서 동기 호출을 가정하고 있어 수정 필요."
#
# 계획 검토 후 실행 결정
④ Before/After 실제 코드 비교 — Extract Method

리팩토링 전후를 구체적으로 요청하면 Claude가 비교 결과를 보여줍니다.

typescript — Before: 3가지 책임이 한 함수에 혼재 (200줄)
async function processOrder(orderId: string, userId: string) {
  // 1. 유효성 검사 (40줄)
  const user = await db.users.findById(userId);
  if (!user) throw new Error('User not found');
  if (user.status === 'banned') throw new Error('User is banned');
  const order = await db.orders.findById(orderId);
  if (!order) throw new Error('Order not found');
  if (order.userId !== userId) throw new Error('Not authorized');

  // 2. 결제 처리 (80줄)
  const cart = await db.carts.findByOrderId(orderId);
  const total = cart.items.reduce((sum, i) => sum + i.price, 0);
  const payment = await stripe.charge({ amount: total });

  // 3. 후처리 (80줄)
  await db.orders.update(orderId, { status: 'paid', paymentId: payment.id });
  await sendEmail(user.email, 'order-confirmation', { orderId });
  await analytics.track('order_completed', { userId, orderId, total });
}
typescript — After: 각 함수가 단일 책임, 개별 테스트/재사용 가능
async function processOrder(orderId: string, userId: string) {
  const { user, order } = await validateOrderAccess(orderId, userId);
  const payment = await chargeOrder(order);
  await completeOrder(order, user, payment);
}

async function validateOrderAccess(orderId: string, userId: string) { ... }
async function chargeOrder(order: Order) { ... }
async function completeOrder(order: Order, user: User, payment: Payment) { ... }
리팩토링 전후 지표 측정 요청
"리팩토링 전후 지표를 측정해줘: 가장 긴 함수 Top 5, 함수 평균 길이, 중복 코드 패턴 수, 테스트 커버리지 변화."
⑤ 레거시 현대화: Strangler Fig 패턴
한꺼번에 교체하면 안 되는 이유

레거시 서비스를 한 번에 새 버전으로 교체하면, 문제 발생 시 어디서 깨졌는지 알 수 없고 롤백도 힘들다. 나무를 감아 올라가듯 점진적으로 대체하는 Strangler Fig 패턴이 안전하다.

Step 1. 기존 코드 옆에 새 버전 생성
"UserService.ts는 건드리지 마. NewUserService.ts를 새로 만들어줘. 기존과 동일한 인터페이스지만 내부를 현대적으로 구현해줘. NewUserService 테스트가 모두 통과하면 보고해줘."
Step 2. 엔드포인트 하나씩 새 버전으로 라우팅
"UserController에서 GET /users/profile 엔드포인트만 NewUserService를 쓰도록 바꿔줘. 나머지는 여전히 UserService 사용. 이 엔드포인트가 1주일 안정화되면 다음 엔드포인트로 이동할 거야."
Step 3. 모든 엔드포인트 전환 완료 후 기존 코드 제거
"모든 엔드포인트가 NewUserService를 쓰도록 전환됐어. 이제 UserService.ts를 안전하게 제거해줘. 참조하는 곳이 없는지 확인 후 제거해."
리팩토링
  • 항상 테스트 먼저 확인하고 시작 — 테스트가 없는 코드를 리팩토링하면 무엇이 깨졌는지 모른다. 테스트 커버리지가 부족하면 먼저 테스트를 작성하라.
  • "이 파일만, 다른 건 건드리지 마"를 명시 — 범위를 명확히 제한해야 Claude가 관련 없는 파일까지 수정하는 것을 막을 수 있다.
  • 인터페이스 변경은 항상 Plan Mode — 인터페이스 하나를 바꾸면 수십 곳이 영향받는다. Plan Mode로 영향 범위를 먼저 파악하고 순서를 결정하라.
  • 각 단계마다 커밋 — "리팩토링 끝나면 커밋할게"는 위험하다. 각 단계마다 커밋해야 어느 단계에서 문제가 생겼는지 정확히 파악할 수 있다.
  • 리팩토링 전용 브랜치 생성 — 리팩토링은 feature가 아닌 refactor/ 브랜치에서. 기능 개발과 분리해야 코드 리뷰도 쉬워진다.
🗺️
Chapter 14 🟡 고급

코드베이스 탐색 워크플로우

처음 보는 프로젝트에 투입되었을 때. Sub-agents 병렬 탐색으로 30분 만에 전체 파악.

새 팀에 합류하거나 오픈소스 프로젝트를 분석할 때, 코드베이스를 혼자 읽으면 며칠이 걸립니다. Claude의 Explore Sub-agents를 활용하면 30분 만에 전체 구조를 파악하고 문서화까지 할 수 있습니다.

① 단계별 탐색 워크플로우
Step 1. 전체 구조 파악 (5분)
"이 프로젝트의 폴더 구조를 분석하고 각 폴더의 역할을 설명해줘. package.json도 분석해서 주요 의존성과 각각의 역할을 정리해줘."
Step 2. 핵심 데이터 흐름 추적 (15분)
"사용자가 로그인 요청을 보냈을 때 어떤 파일들을 거치는지 추적해줘. 진입점부터 응답까지 전체 흐름을 코드 레벨로."
Step 3. 병렬 심층 분석 (10분)
"동시에 분석해줘: Agent 1은 auth 관련 파일 전체, Agent 2는 API 엔드포인트 목록과 미들웨어, Agent 3는 테스트 커버리지 현황. 결과 취합해서 보고."
Step 4. 문서화
"분석한 내용을 바탕으로 ARCHITECTURE.md를 작성해줘. 폴더 구조, 데이터 흐름, 주요 모듈 역할, 개발 시 주의사항 포함."
② 의존성 감사 워크플로우
"사용하지 않는 npm 패키지를 찾아줘. 제거해도 안전한지 확인도 해줘."
"순환 의존성이 있는지 확인해줘. 있으면 어떤 파일들이 연루되어 있는지 명시해줘."
"npm audit 실행하고 심각도 high 이상 취약점만 수정 방법과 함께 보고해줘."
"버전이 2개 이상 오래된 주요 패키지들을 찾아줘. 마이그레이션 가이드도 포함해줘."
③ 신규 팀원 온보딩 문서 자동 생성

탐색한 내용을 문서로 남기면, 다음 신규 팀원도 같은 30분을 절약할 수 있습니다. ONBOARDING.md 한 번 작성으로 팀 전체가 혜택을 받습니다.

text — 온보딩 문서 생성 프롬프트
"이 프로젝트에 오늘 합류한 신규 개발자 관점으로 ONBOARDING.md를 작성해줘.
 포함할 내용:
 1. 개발 환경 셋업 (필수 도구, 버전, 설치 순서)
 2. 프로젝트 실행 방법 (로컬 개발, 테스트, 빌드)
 3. 폴더 구조와 각 폴더의 역할 (각 2줄 이내)
 4. 핵심 도메인 용어 사전 (코드에서 자주 나오는 비즈니스 용어)
 5. '첫 주에 반드시 읽어야 할 파일들' Top 5
 6. '절대 건드리면 안 되는 파일/폴더' 목록과 이유
 7. 신규 입사자가 자주 하는 실수 Top 3"
text — 기술 스택 선택 이유 파악
"이 프로젝트의 기술 스택을 처음 보는 사람도 이해하도록 설명해줘.
 각 기술이 '왜 선택됐는지', '어떤 문제를 해결하는지', '주요 대안이 무엇인지'도 포함해줘.
 package.json, docker-compose.yml, 설정 파일들을 근거로 분석해줘."
④ 아키텍처 유형별 탐색 전략
모노레포 탐색 특화 프롬프트
"이 모노레포 구조를 분석해줘: 1) 패키지 목록과 각 역할 2) 패키지 간 의존 관계 (mermaid 다이어그램으로) 3) 공유 패키지(shared/common)가 어디서 사용되는지 4) 빌드 순서 5) 패키지 하나 변경 시 재빌드 필요한 패키지 목록"
마이크로서비스 탐색 특화 프롬프트
"이 마이크로서비스 아키텍처를 분석해줘: 1) 각 서비스의 책임과 소유 도메인 2) 서비스 간 통신 방식 (REST/gRPC/이벤트?) 3) 공유 DB가 있는가? (있으면 위험 요소) 4) API Gateway 라우팅 규칙 5) 서비스 A 수정 시 영향받는 다른 서비스 목록"
탐색 결과 보관 전략

ARCHITECTURE.md에 탐색 날짜를 기록해두면 몇 개월 후 "이게 최신 내용인가?" 판단이 가능합니다. 큰 구조 변경 후에는 Claude에게 문서 업데이트도 요청하세요.

코드베이스 탐색
  • Explore Sub-agents로 병렬 탐색 — 혼자 순차 탐색하는 것보다 3개의 Explore agent가 동시에 다른 영역을 탐색하면 3배 빠르다.
  • 탐색 결과는 ARCHITECTURE.md로 저장 — 탐색하고 끝내지 말고 문서로 남겨라. 다음 신규 팀원도 같은 시간을 절약할 수 있다.
  • 데이터 흐름 추적이 구조 파악보다 빠르다 — 폴더 구조보다 "로그인 요청이 어떤 파일을 거치는가"를 추적하면 핵심 구조를 훨씬 빨리 이해할 수 있다.
  • 의존성 감사를 월 1회 루틴화 — 쌓인 unused package와 보안 취약점을 Claude에게 정기적으로 감사하게 하면 기술 부채를 예방할 수 있다.
🚀
Chapter 15 🔴 고급

DevOps & CI/CD 워크플로우

2-레이어 품질 게이트. 로컬 Hooks + GitHub Actions로 코드 품질을 자동 보장한다.

코드 품질을 사람이 수동으로 체크하는 시대는 끝났습니다. 레이어 1(로컬 Hooks)과 레이어 2(GitHub Actions)를 결합하면 커밋 전, PR 전, 머지 전 모든 단계에서 품질이 자동으로 보장됩니다.

① 2-레이어 품질 게이트 구조
CI/CD만 있는 경우의 문제

GitHub Actions는 PR 시에만 실행됩니다. 로컬에서 코드를 잘못 작성해도 push하기 전에는 모릅니다. 타입 에러, 포맷 문제가 PR에서 발견되면 작은 수정도 새 커밋을 만들어야 합니다. 피드백 루프가 길어집니다.

로컬 Hooks만 있는 경우의 문제

팀에서 혼자만 Hooks를 설정하면 의미가 없습니다. 팀원이 다른 에디터나 환경을 쓰면 Hooks가 작동하지 않을 수 있고, 강제성이 없어 bypass하기 쉽습니다.

2-레이어의 역할 분담

로컬 Hooks = 빠른 개인 피드백. Claude가 파일을 저장하는 순간 즉시 린트/타입 체크. 잘못된 코드가 커밋되기 전에 차단. 1-2초 이내 피드백.
GitHub Actions = 팀 단위 강제. 팀 전체에 동일한 기준 적용. 로컬 Hooks를 우회해도 PR에서 막힘. 설정 파일이 레포에 있으므로 모든 팀원에게 자동 적용.

text
레이어 1: 로컬 Hooks (Claude Code hooks) — 즉각적, 개인적
  PreToolUse → 위험 명령 차단 (실행 전)
  PostToolUse → 파일 저장 시 Prettier 자동 실행
  PostToolUse → TypeScript 타입 체크
  → 문제 발견 즉시 차단, 커밋 전에 수정

레이어 2: GitHub Actions (PR 시) — 팀 전체, 강제적
  PR 생성 → Claude 자동 코드 리뷰
  PR 생성 → 린트 + 타입 체크
  PR 생성 → 단위 테스트 + 통합 테스트
  PR 생성 → 코드 커버리지 체크 (80% 미만 실패)
  PR 생성 → 보안 취약점 스캔
  → 모두 통과해야 Merge 허용
② GitHub Actions + Claude 통합 패턴
yaml — PR 자동 리뷰
name: Claude Code Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  claude-review:
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm install -g @anthropic-ai/claude-code
      - name: Claude Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          claude -p "PR #${{ github.event.pull_request.number }}의 변경사항을 리뷰하고 GitHub PR에 인라인 코멘트를 달아줘. 보안 이슈는 critical로 표시." \
            --dangerously-skip-permissions
yaml — CI 실패 자동 분석 + 수정 시도
name: Auto Fix CI Failure
on:
  workflow_run:
    workflows: ["CI"]
    types: [completed]

jobs:
  analyze-and-fix:
    if: ${{ github.event.workflow_run.conclusion == 'failure' }}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g @anthropic-ai/claude-code
      - name: Analyze and Fix
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude -p "CI가 실패했어. 로그를 분석하고 원인을 파악해서 수정해줘. 수정 후 커밋까지 해줘." \
            --dangerously-skip-permissions
yaml — 릴리즈 자동화
name: Auto Release
on:
  push:
    tags: ['v*']

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - run: npm install -g @anthropic-ai/claude-code
      - name: Generate Release Notes
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          claude -p "이 태그(${{ github.ref_name }})의 변경사항을 분석해서 CHANGELOG.md를 업데이트하고 GitHub Release를 생성해줘." \
            --dangerously-skip-permissions
③ 야간 자동화 루틴
yaml — 야간 의존성 체크
name: Nightly Maintenance
on:
  schedule:
    - cron: '0 2 * * 1'  # 매주 월요일 오전 2시

jobs:
  maintenance:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install -g @anthropic-ai/claude-code
      - name: Weekly Maintenance
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          claude -p "주간 유지보수: 1) npm audit 실행 후 high 취약점 수정 2) 오래된 의존성 업데이트 PR 생성 3) 스테일 이슈 레이블 정리" \
            --dangerously-skip-permissions
④ 배포 파이프라인 안전 장치 패턴

배포 자동화에서 가장 중요한 것은 '문제 발생 시 즉시 감지하고 롤백'입니다. Claude를 Smoke Test 단계에 통합하면 배포 직후 이상을 자동 감지할 수 있습니다.

yaml — Blue-Green 배포 + Claude Smoke Test
name: Safe Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Deploy to Green slot
        run: kubectl apply -f k8s/green/

      - name: Claude Smoke Test
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          claude -p "
            Green 환경 (${{ env.GREEN_URL }})에 smoke test 실행해줘:
            1) /health 엔드포인트 200 응답 확인
            2) /api/auth/login API 응답시간 200ms 이하 확인
            3) DB 연결 상태 확인 (/api/health/db)
            4) 핵심 비즈니스 API 3개 응답 확인

            테스트 결과를 JSON으로 보고해줘.
            하나라도 실패하면 exit 1로 파이프라인 중단.
          " --dangerously-skip-permissions

      - name: Switch traffic to Green (smoke test 통과 시에만)
        if: success()
        run: |
          kubectl patch service myapp \
            -p '{"spec":{"selector":{"slot":"green"}}}'
          echo "✅ Green으로 트래픽 전환 완료"

      - name: Auto rollback on failure
        if: failure()
        run: |
          echo "❌ Smoke test 실패. Blue로 유지."
          kubectl rollout undo deployment/myapp
배포 후 이상 감지 자동화
"배포 완료 후 5분 동안 에러율을 모니터링해줘. 에러율이 배포 전보다 2% 이상 증가하면 즉시 보고하고 롤백 명령을 제안해줘."
DevOps & CI/CD
  • 2-레이어 구조를 반드시 갖춰라 — 로컬 Hooks만 있으면 팀원이 다를 수 있고, CI/CD만 있으면 피드백이 느리다. 두 레이어가 다 있어야 완전하다.
  • PR 자동 리뷰를 가장 먼저 설정 — Claude가 모든 PR을 자동으로 리뷰하면 인간 리뷰어는 Claude가 놓친 부분만 집중하면 된다. 리뷰 시간이 70% 줄어든다.
  • CI 실패 자동 분석을 연결 — CI가 실패하면 개발자가 로그를 읽고 분석하는 시간이 소요된다. Claude가 자동으로 분석하고 수정 시도하면 이 시간이 없어진다.
  • 야간 유지보수 루틴화 — 의존성 업데이트, 보안 스캔, 스테일 이슈 정리를 야간 자동화로 설정하면 기술 부채가 쌓이지 않는다.
  • 릴리즈 노트 자동 생성 — 태그 push 시 Claude가 커밋 로그를 분석해서 CHANGELOG와 GitHub Release를 자동 생성하면 릴리즈 작업이 한 줄로 끝난다.
🤝
Chapter 16 🔴 고급

멀티 에이전트 워크플로우

독립적인 모듈을 병렬로 개발하거나, 여러 가설을 동시에 검증한다. 제대로 설계하면 속도가 N배.

멀티 에이전트는 여러 Claude 인스턴스가 동시에 다른 작업을 처리하는 방식입니다. 잘 설계하면 개발 속도가 N배가 되지만, 잘못 설계하면 파일 충돌과 불일치로 오히려 더 오래 걸립니다. 독립성이 핵심입니다.

① 어떤 작업이 병렬화에 적합한가

판단 기준은 "서로 다른 에이전트의 결과가 서로에게 의존하는가?"입니다. 의존성이 없으면 병렬화 가능, 있으면 순차가 맞습니다.

병렬화에 적합한 작업
  • 독립적인 모듈 개발 (auth, payment, notification)
  • 여러 파일의 동시 분석/탐색
  • 경쟁적 가설 테스트 (버그 원인 2개 동시 검증)
  • 독립적인 테스트 작성
  • 서로 다른 언어/기술의 병렬 구현
병렬화하면 위험한 작업
  • 순서가 중요한 순차 작업 (A 완료 후 B 가능)
  • 같은 파일을 여러 에이전트가 수정
  • 결과물이 서로 의존하는 작업
  • 공유 상태를 변경하는 작업 (캐시, 세션)
  • DB 스키마 변경 (테이블 순서 의존)
경쟁적 가설 테스트가 왜 빠른가

버그 원인을 모를 때 가장 시간이 걸리는 것은 "가설 검증"입니다. Agent A가 가설 1을 검증하는 동안 Agent B가 가설 2를 검증합니다. 순차로 하면 가설 1 실패 후 가설 2 시작이지만, 병렬로 하면 가장 빨리 재현에 성공한 가설이 정답입니다. 가설이 2개라면 시간이 이론적으로 절반이 됩니다.

잘못 설계된 병렬화의 결과

Agent A가 User 타입에 sessionId: string를 추가하고, 동시에 Agent B가 같은 User 타입에 token: string을 추가했다면? 나중에 합칠 때 한 쪽의 변경이 사라집니다. 병렬화를 잘못 설계하면 합치는 과정에서 오히려 더 많은 시간이 소요됩니다.

공유 타입/인터페이스는 반드시 리드 에이전트가 단독 관리해야 합니다.

② 패턴 1: 리드 에이전트 + 병렬 팀
text — 프롬프트
"다음 3개 모듈을 병렬로 개발해줘:
 - Agent A: src/auth/ 폴더에 JWT 제거, 세션 기반 인증 구현
 - Agent B: src/payment/ 폴더에 Stripe 웹훅 핸들러 구현
 - Agent C: src/notification/ 폴더에 이메일/Slack 알림 구현

 각 에이전트는 자신의 폴더만 수정할 것.
 src/types/는 내(리드)가 통합 후 업데이트할 것.
 tasks.md에 진행 상태를 업데이트하면서 작업할 것."
③ 패턴 2: 경쟁적 디버깅 (가설 병렬 검증)
text — 프롬프트
"프로덕션에서 간헐적으로 결제 실패가 발생해. 두 가설이 있어:
 - Agent A: 가설1 — Redis 캐시 동시 접근 레이스 컨디션 검증해줘
 - Agent B: 가설2 — Stripe 웹훅 타임아웃으로 중복 처리 검증해줘

 각자 재현 시나리오를 만들고 테스트해줘.
 먼저 재현한 쪽이 정답일 가능성이 높아.
 결과를 각자 보고해줘."
④ 공유 태스크 리스트 (tasks.md) 예시
markdown — tasks.md
## 태스크 목록 (멀티 에이전트용)

## 규칙
- 태스크 시작 전 [진행중]으로 변경 (중복 방지)
- 완료 시 [완료]로 변경 후 다음 태스크 선택
- 자신의 담당 폴더 외 수정 금지
- src/types/ 수정 필요 시 리드 에이전트에게 위임

## 태스크

- [완료] [AGENT-A] src/auth/ — 세션 기반 인증 구현
- [진행중] [AGENT-B] src/payment/ — Stripe 웹훅 구현
- [ ] [AGENT-C] src/notification/ — 이메일 알림 구현
- [ ] [AGENT-C] test/integration/ — 통합 테스트 작성

## 공유 파일 (리드 에이전트만 수정)
- src/types/index.ts
- src/config/index.ts
- package.json
⑤ Git Worktree 기반 완전 격리 병렬 개발

tasks.md로 폴더를 분리해도 types/, config/ 같은 공유 파일은 여전히 충돌 위험이 있습니다. Git Worktree를 사용하면 에이전트마다 독립 브랜치 + 독립 파일 시스템을 부여해 충돌을 원천 차단합니다.

bash — Worktree 기반 병렬 에이전트 설정
# 에이전트별 독립 작업 공간 생성 (각자 다른 브랜치)
git worktree add ../project-auth feature/auth-session
git worktree add ../project-payment feature/payment-stripe
git worktree add ../project-notify feature/notification

# 프롬프트: 각 worktree에 에이전트 배치
"3개 worktree에서 병렬로 작업해줘:
 - ../project-auth 폴더 (feature/auth-session 브랜치): 세션 인증 구현
 - ../project-payment 폴더 (feature/payment-stripe 브랜치): Stripe 웹훅 구현
 - ../project-notify 폴더 (feature/notification 브랜치): 알림 시스템 구현

 각자 자신의 worktree에서만 작업.
 공유 파일(types/)은 메인 브랜치에서 내가 직접 통합할 예정.
 완료 시 PR 생성 후 보고해줘."

# 완료 후 정리
git worktree remove ../project-auth
git worktree remove ../project-payment
git worktree remove ../project-notify
방식충돌 가능성적합한 상황
tasks.md 폴더 분리낮음 (공유 파일 위험)단기 작업, 공유 파일 수정이 적은 경우
Git Worktree 격리없음 (완전 격리)장기 작업, 공유 파일 수정이 많은 경우
⑥ 파이프라인 패턴 — 순차 + 병렬 혼합

단순 병렬보다 파이프라인(Stage 1 병렬 → Stage 2 통합 → Stage 3 병렬) 구조가 실제 개발 흐름과 맞습니다.

text — 파이프라인 구조
Stage 1 — 병렬 탐색 (동시 실행):
  Explore A: 인증 코드 분석
  Explore B: API 엔드포인트 분석
  Explore C: 테스트 현황 분석
  ↓ (모두 완료 대기)

Stage 2 — 순차 통합/설계 (사람 개입 포함):
  Plan: 3개 분석 결과 취합 → 구현 전략 수립
  → 나에게 계획 보고 후 승인 대기
  ↓ (승인 후)

Stage 3 — 병렬 구현 (동시 실행):
  Agent A: 인증 모듈 구현 (auth/ worktree)
  Agent B: 결제 모듈 구현 (payment/ worktree)
  ↓ (모두 완료 대기)

Stage 4 — 순차 통합 테스트:
  통합 테스트 실행 → 문제 수정 → PR 생성
text — 파이프라인 실행 프롬프트
"4단계 파이프라인으로 진행해줘:

 Stage 1 (병렬): Explore 에이전트 3개로 인증/API/테스트 현황 동시 분석
 Stage 2 (순차): 분석 완료 후 나에게 구현 계획 보고. 내 승인 대기.
 Stage 3 (병렬): 승인 후 auth/, payment/ 모듈 동시 구현
 Stage 4 (순차): 모두 완료 후 통합 테스트 실행

 각 Stage 완료 시 진행 상황 보고해줘.
 Stage 2에서는 반드시 멈추고 내 승인을 기다려."
멀티 에이전트
  • 폴더 단위로 담당 영역을 명확히 분리 — "어떤 파일이든 수정해도 됨"은 충돌의 시작이다. auth/, payment/, notification/ 같이 폴더 단위로 명확히 지정하라.
  • 공유 파일은 리드 에이전트 한 명만 — types/, config/, package.json은 한 에이전트만 담당. 두 에이전트가 같은 파일을 동시에 수정하면 충돌이 발생한다.
  • tasks.md의 [진행중] 상태가 핵심 — 에이전트가 태스크를 시작하기 전에 [진행중]으로 표시해야 다른 에이전트가 같은 태스크를 집지 않는다.
  • 경쟁적 디버깅으로 버그 원인 탐색 시간 50% 절감 — 가설이 2개라면 두 에이전트가 동시에 검증하면 된다. 하나가 먼저 재현하면 그게 정답이다.
  • Agent Teams는 대형 작업에만 — 설정 오버헤드가 크다. 30분 이하 작업은 Sub-agents로, 수 시간 이상 걸리는 대형 작업에만 Agent Teams를 쓰라.
SECTION 4

전문가 패턴

모든 기능과 워크플로우를 꿰뚫는 상위 레벨 전략. 상위 1%처럼 Claude Code를 다루는 법.

👑
Chapter 17 🔴 전문가

Claude Code 마스터 사용법

일반 사용자는 Claude에게 막연하게 부탁한다. 전문가는 Claude가 최선의 결과를 내도록 환경을 설계한다.

Claude Code를 수개월 사용하면 패턴이 보입니다. Claude의 출력 품질은 환경 설계 품질에 비례합니다. 아무리 좋은 프롬프트를 써도 CLAUDE.md가 없으면 매번 같은 실수를 반복합니다. 환경을 먼저 설계하고, 프롬프트는 나중입니다.

레버 1: CLAUDE.md 완성도가 모든 것을 결정한다

Claude의 출력 품질 = CLAUDE.md 품질 × 프롬프트 품질

CLAUDE.md 품질 체크리스트
기술 스택이 버전까지 명시되어 있는가?
금지 행동이 구체적으로 나열되어 있는가? ("any 금지", "console.log 금지")
실제 코드 예시가 @참조로 포함되어 있는가?
테스트 방침이 명확한가? (프레임워크, 커버리지 목표)
Git 워크플로우 규칙이 있는가?
최근 1개월 이내에 업데이트되었는가?
레버 2: 컨텍스트 관리 — 유한한 창을 잘 써라
/compact 사용 타이밍
  • 대화가 30분 이상 진행되었을 때
  • 한 작업이 끝나고 다음 작업 시작 전
  • Claude가 이전 내용을 잊는 것 같을 때
  • /cost로 토큰이 많이 쌓였을 때
세션 분리 기준
  • → 새 세션완전히 다른 기능 작업 시작
  • → 새 세션다른 팀원의 코드 분석
  • → 같은 세션같은 기능의 연속 작업
  • → 같은 세션리팩토링 → 테스트 → 커밋
"src/auth/ 폴더만 읽고 작업해줘. 다른 폴더는 필요할 때만 읽어."

핵심 파일만 로딩하면 컨텍스트가 덜 찼고 더 집중된 응답이 나옵니다.

레버 3: 프롬프트 설계 원칙
원칙 1: 중단 조건을 명시하라
❌ 나쁜 예
"로그인 기능 구현해줘"
✅ 좋은 예
"로그인 기능 구현해줘. 단, 데이터베이스 스키마는 건드리지 말고, 기존 테스트가 깨지면 즉시 중단해."
원칙 2: 가역적 액션만 허용하라
❌ 나쁜 예
"불필요한 파일 정리해줘"
✅ 좋은 예
"불필요해 보이는 파일 목록 보여줘. 삭제는 내가 확인 후 직접 할게."
원칙 3: 좁고 명확하게
❌ 나쁜 예
"이 코드 좋게 만들어줘"
✅ 좋은 예
"loginUser 함수의 에러 처리 부분만 개선해줘. 성능이나 다른 부분은 건드리지 마."
레버 4: 점진적 신뢰 구축
text
1주차: 읽기, 분석, 제안만 (실행 없음)
  → Claude의 판단 방식을 관찰

2주차: 단일 파일 수정 (검토 후 적용)
  → 예상 범위 내에서 작업하는지 확인

3주차: 멀티 파일 수정 (Plan Mode 필수)
  → 더 복잡한 작업으로 신뢰 범위 확장

4주차: Auto Mode 활용 (검증된 범위에서만)
  → 자율 실행 범위를 점진적으로 확대
레버 5: 잘못된 방향 빠른 감지 & 리셋
Claude가 잘못된 방향으로 가고 있는 신호
  • 관련 없는 파일을 수정하기 시작할 때
  • 요청하지 않은 기능을 추가할 때
  • 같은 에러로 3번 이상 실패할 때
  • 아키텍처 변경을 제안할 때 (작은 작업에서)
"잠깐, 방향이 잘못된 것 같아. 지금까지 한 변경사항을 git reset으로 취소하고, 다시 Plan Mode로 계획부터 세워줘."
레버 6: Claude가 잘 못하는 것들 — 솔직한 한계 인정
Claude가 약한 것더 나은 대안
완전히 새로운 아키텍처 설계사람이 설계하고 Claude에게 구현 위임
프로덕션 배포 결정항상 사람이 최종 판단
외부 서비스 장애 디버깅실제 로그와 모니터링 도구 활용
오래된 레거시 코드 이해 (문서 없음)원저자와 직접 소통 후 맥락 제공
UI/UX 디자인 판단디자이너와 협업 후 구현 위임
상위 1% Claude Code 사용자의 습관
  • CLAUDE.md를 코드보다 먼저 쓴다 — 프로젝트 첫날, 코드 한 줄 짜기 전에 CLAUDE.md를 작성한다. 이 투자가 이후 모든 작업의 품질을 결정한다.
  • 실수할 때마다 CLAUDE.md나 Memory를 업데이트 — "Claude가 또 같은 실수를 했다"는 생각이 드는 순간, CLAUDE.md에 금지 항목으로 추가하거나 feedback 메모리에 기록한다.
  • 작업 시작 전 브랜치를 만든다 — 조건반사처럼. "claude에게 맡기기 전에 git checkout -b"가 습관이 되면 잘못된 작업을 언제든 되돌릴 수 있다.
  • 복잡한 작업은 Plan Mode로 먼저 — "빨리 해야 하니까 바로 실행"은 착각이다. Plan Mode에서 5분 투자하면 잘못된 방향으로 1시간 달리는 것을 막을 수 있다.
  • 잘못된 방향은 즉시 리셋 — Claude가 이상한 방향으로 가고 있다는 신호를 보이면 즉시 Esc. 계속 진행하게 두는 것보다 리셋이 훨씬 빠르다.
  • /compact를 주기적으로 실행 — 대화가 길어지면 Claude의 집중도가 떨어진다. 30분마다 /compact로 압축하면 항상 예리한 상태를 유지할 수 있다.
  • Hooks로 반복 행동을 자동화 — "Claude에게 매번 같은 걸 요청하고 있다"는 생각이 드는 순간 Hook으로 자동화한다. Prettier, lint, git add는 Hook의 기본이다.
  • Claude의 한계를 인정하고 사람이 판단할 것들을 명확히 한다 — 아키텍처 결정, 배포 승인, UI 판단은 Claude에게 맡기지 않는다. Claude는 구현 전문가, 결정은 사람이 한다.
📚
Appendix

부록 — 학습 경로 & 기능-워크플로우 지도

어디서 시작해서 어디로 갈지. 수준별 추천 경로와 기능 연결 지도.

수준별 추천 학습 경로
🟢 입문자 경로
Ch.0Quick Start
Ch.1CLAUDE.md
Ch.2Skills
Ch.10Git 워크플로우
Ch.11TDD

목표: Claude를 도구로 쓰는 기본 패턴 습득

🟡 중급자 경로
Ch.3Memory 시스템
Ch.4MCP 서버
Ch.5Hooks
Ch.7Plan Mode
Ch.12코드 리뷰

목표: Claude를 팀 개발에 통합

🔴 고급자 경로
Ch.6Settings
Ch.8Sub-agents
Ch.9Auto Mode
Ch.15DevOps/CI-CD
Ch.16멀티 에이전트

목표: Claude를 자동화 인프라로 구축

기능-워크플로우 연결 지도
워크플로우주로 사용하는 기능
Git 기반 태스크Skills(/commit, /pr), CLAUDE.md(Git 규칙)
TDDCLAUDE.md(TDD 규칙 강제), Hooks(테스트 자동 실행)
코드 리뷰MCP(GitHub), Skills(/review), Sub-agents(병렬 리뷰)
리팩토링Plan Mode(영향 범위 파악), Skills(/commit)
코드베이스 탐색Sub-agents(Explore), Memory(탐색 결과 저장)
DevOps/CI-CDHooks(로컬 게이트), Auto Mode, Headless
멀티 에이전트Agent Teams, 공유 tasks.md, Settings(권한)
완벽 정복 핵심 요약
  • CLAUDE.md가 기반이다 — 모든 것은 여기서 시작한다. 프로젝트 첫 30분을 CLAUDE.md에 투자하라.
  • Skills로 반복을 없애라 — 같은 프롬프트를 3번 이상 타이핑했다면 즉시 스킬로 만들어라.
  • Memory로 개인 맥락을 보존하라 — user, feedback, project, reference 타입을 적극 활용하면 Claude가 점점 더 나를 이해하게 된다.
  • MCP로 외부 도구와 연결하라 — GitHub MCP + /review 스킬 조합이 가장 ROI가 높다. 여기서 시작하라.
  • Hooks로 Claude의 행동을 강제하라 — CLAUDE.md는 권고, Hooks는 강제다. 중요한 규칙은 Hooks로 보장하라.
  • Plan Mode로 큰 작업을 안전하게 — 10개 이상 파일이 바뀌는 작업은 항상 Plan Mode. 계획 검토 없이 실행하지 마라.
  • Git 브랜치가 안전망이다 — Claude에게 작업을 주기 전에 항상 브랜치를 생성하라. 실수해도 브랜치 삭제로 리셋 가능하다.
  • 환경을 설계하면 프롬프트가 짧아진다 — CLAUDE.md + Skills + Memory + Hooks가 잘 갖춰지면, 프롬프트 한 줄로 복잡한 작업을 처리할 수 있다.