고급 기능
Claude Code의 고급 기능인 헤드리스 모드, 에이전트 팀, MCP 서버, 후크, IDE 통합 등을 알아봅니다.
claude -p "..."스크립트·자동화
--agents '[...]'병렬 복합 작업
on: pull_requestCI/CD 통합
헤드리스 모드 (비대화형 실행)
Claude Code를 스크립트나 CI/CD 파이프라인에서 비대화형으로 실행할 수 있습니다.
기본 사용법
# -p 플래그로 비대화형(headless) 모드 실행
claude -p "src/utils.ts에서 사용되지 않는 import를 찾아줘"
# 결과를 파일로 저장
claude -p "프로젝트 구조를 분석해줘" > analysis.txt
--bare 모드
CLAUDE.md, .claude/ 규칙, Auto Memory 등 모든 자동 디스커버리를 건너뛰어 CI 환경에서 빠르게 시작할 수 있습니다:
claude -p "이 코드를 분석해줘" --bare
구조화된 출력 (Structured Output)
JSON 형식으로 결과를 받을 수 있습니다:
# JSON 출력
claude -p "이 프로젝트의 의존성을 분석해줘" --output-format json
# JSON Schema로 출력 형식 지정
claude -p "src/ 디렉토리의 파일 목록과 줄 수를 알려줘" \
--output-format json \
--json-schema '{
"type": "object",
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {"type": "string"},
"lines": {"type": "number"}
}
}
}
}
}'
스트리밍 출력
실시간으로 진행 상황을 모니터링:
# 스트리밍 JSON 출력 (상세 모드)
claude -p "전체 테스트를 실행하고 결과를 알려줘" \
--output-format stream-json \
--verbose
도구 자동 승인
비대화형 환경에서 도구 사용 권한을 미리 지정:
# 특정 도구만 허용
claude -p "코드를 수정해줘" \
--allowedTools "Bash,Read,Edit"
# 모든 편집 자동 승인
claude -p "린트 에러를 수정해줘" \
--permission-mode acceptEdits
# 권한 프롬프트 자동 거부 (pre-allowed 도구만 동작, CI 전용)
claude -p "테스트를 실행하고 실패를 수정해줘" \
--permission-mode dontAsk
--permission-mode dontAsk는 권한 프롬프트를 자동으로 거부합니다. pre-allowed 도구는 계속 동작하며, 신뢰할 수 있는 CI 환경에서만 사용하세요.
권한 모드 비교
| 모드 | 설명 | 사용 환경 |
|---|---|---|
default | 매번 사용자에게 승인 요청 | 대화형 사용 |
acceptEdits | 파일 편집만 자동 승인 | 반자동화 |
dontAsk | 권한 프롬프트를 자동으로 거부 (pre-allowed 도구는 계속 동작) | CI/CD |
권한 규칙 상세 동작
인식되는 쉘 연산자
Bash 도구 사용 시 권한 규칙은 다음 쉘 연산자를 기준으로 명령어를 분리하여 각각 평가합니다:
&&, ||, ;, |, |&, &, 개행
프로세스 래퍼 자동 제거
Bash 매칭 전 다음 프로세스 래퍼들은 자동으로 제거됩니다:
timeout, time, nice, nohup, stdbuf
예시: timeout 30 git push는 git push로 평가됩니다.
심링크 권한 동작
- Allow 규칙: 링크 경로와 대상 경로 모두 패턴에 일치해야 허용됩니다.
- Deny 규칙: 링크 경로 또는 대상 경로 중 하나라도 패턴에 일치하면 거부됩니다.
additionalDirectories 플러그인 설정 로드 범위
--add-dir(additionalDirectories)로 추가된 디렉토리에서는 플러그인 설정 중 enabledPlugins와 extraKnownMarketplaces 만 로드됩니다.
--add-dir 디렉토리의 CLAUDE.md 로드 조건
--add-dir 로 추가된 디렉토리의 CLAUDE.md 파일은 CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1 환경변수를 설정한 경우에만 로드됩니다:
export CLAUDE_CODE_ADDITIONAL_DIRECTORIES_CLAUDE_MD=1
claude --add-dir /shared/team-context "작업 시작"
커스텀 시스템 프롬프트
# 시스템 프롬프트 교체
claude -p "코드 리뷰해줘" \
--system-prompt "당신은 시니어 보안 엔지니어입니다. 보안 취약점만 집중적으로 분석하세요."
# 기존 시스템 프롬프트에 추가
claude -p "코드 리뷰해줘" \
--append-system-prompt "응답은 반드시 한국어로 하세요."
세션 이어가기
# 마지막 세션 이어서 작업
claude -p "아까 수정한 부분에 테스트도 추가해줘" --continue
# 특정 세션 ID로 복원
claude -p "추가 수정 요청" --resume "$SESSION_ID"
--resume과 훅 동작--resume으로 세션을 재개할 때는 SessionStart 훅의 matcher가 resume인 훅만 실행됩니다 (startup matcher 훅은 실행되지 않음).
에이전트 팀 (Agent Teams)
여러 Claude 에이전트를 팀으로 구성하여 복잡한 작업을 병렬로 처리할 수 있습니다.
팀원 모드
# 팀원 모드로 실행 (다른 에이전트의 하위 에이전트로 동작)
claude --teammate-mode
에이전트 정의 (--agents)
JSON 형식으로 에이전트 팀을 정의합니다:
claude --agents '{
"reviewer": {
"description": "코드 리뷰어",
"prompt": "PR의 코드 품질을 리뷰하세요",
"tools": ["Read", "Bash"]
},
"tester": {
"description": "테스트 작성자",
"prompt": "테스트 커버리지를 분석하고 누락된 테스트를 작성하세요",
"tools": ["Read", "Edit", "Bash"]
}
}'
tmux 통합
tmux를 사용하면 여러 에이전트를 시각적으로 모니터링할 수 있습니다. --tmux는 반드시 --worktree와 함께 사용해야 합니다:
# tmux 통합 모드 (--worktree 필요)
claude -w feature-auth --tmux
--tmux 옵션을 사용하려면 시스템에 tmux가 설치되어 있어야 하며, --worktree 플래그와 함께 사용해야 합니다.
MCP 서버
MCP(Model Context Protocol)는 Claude가 외부 도구와 데이터 소스에 접근할 수 있게 하는 프로토콜입니다.
MCP란?
MCP 서버를 연결하면 Claude Code가 다음과 같은 외부 리소스에 접근할 수 있습니다:
- 데이터베이스: PostgreSQL, MongoDB 등에 직접 쿼리
- API: GitHub, Jira, Slack 등과 연동
- 파일 시스템: 원격 파일 접근
- 브라우저: 웹 페이지 읽기
MCP 서버 설정
프로젝트 루트의 .mcp.json 파일에 MCP 서버를 설정합니다:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "${GITHUB_TOKEN}"
}
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "${DATABASE_URL}"
}
}
}
}
자세한 설정 방법은 MCP 서버 가이드를 참고하세요.
자주 사용되는 MCP 서버
| 서버 | 용도 |
|---|---|
server-github | GitHub 이슈, PR 관리 |
server-postgres | PostgreSQL 쿼리 실행 |
server-filesystem | 추가 파일시스템 접근 |
server-brave-search | 웹 검색 |
Claude Code SDK
Claude Code SDK를 사용하면 Python이나 TypeScript 코드에서 Claude Code를 프로그래밍 방식으로 제어할 수 있습니다.
설치
# Python
pip install anthropic
# TypeScript/Node.js
npm install @anthropic-ai/sdk
Python 사용 예시
import anthropic
client = anthropic.Anthropic()
# Claude Code 프로세스 시작
with client.beta.claude_code.process(
cwd="/my/project",
allowed_tools=["Read", "Write", "Bash"]
) as proc:
result = proc.run("테스트 파일에서 실패하는 테스트를 찾아서 수정해줘")
print(result.output)
TypeScript 사용 예시
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic();
const result = await client.beta.claudeCode.process({
cwd: '/my/project',
allowedTools: ['Read', 'Write', 'Bash'],
}).run('테스트 파일에서 실패하는 테스트를 찾아서 수정해줘');
console.log(result.output);
주요 옵션
| 옵션 | 설명 |
|---|---|
cwd | 작업 디렉토리 |
allowedTools | 허용할 도구 목록 |
maxTurns | 최대 대화 턴 수 |
systemPrompt | 시스템 프롬프트 |
model | 사용할 모델 |
더 자세한 SDK 사용법은 Anthropic Python SDK 및 TypeScript SDK를 참고하세요.
후크 (Hooks)
후크는 Claude Code의 특정 이벤트에 반응하여 자동으로 실행되는 명령어 또는 로직입니다.
후크 타입
후크는 5가지 타입을 지원합니다:
| 타입 | 설명 | 예시 |
|---|---|---|
command | 로컬 셸 명령어 실행 | "npx prettier --write ${file}" |
http | HTTP 엔드포인트에 요청 전송 | "url": "https://api.example.com/hook" |
prompt | LLM 프롬프트로 동적 결정 | 코드 품질 판단, 조건부 차단 |
agent | 복잡한 멀티스텝 작업을 위한 에이전트 실행 | 자동화된 리뷰, 분석 |
mcp_tool | MCP 도구 서버를 훅 핸들러로 사용 | 외부 서비스 연동 훅 |
후크 이벤트 (28가지)
세션 및 생명주기 이벤트
| 이벤트 | 설명 |
|---|---|
SessionStart | 세션 시작 시 (matcher: startup/resume/clear/compact) |
SessionEnd | 세션 종료 시 (matcher: clear/resume/logout/prompt_input_exit/bypass_permissions_disabled/other) |
Stop | Claude Code 중단 시 |
StopFailure | Claude Code 중단 실패 시 (matcher로 오류 유형 지정 가능) |
InstructionsLoaded | CLAUDE.md 등 지시사항 로드 시 (matcher: user/project/local/plugin/managed) |
ConfigChange | 설정 파일 변경 시 (matcher: user_settings/project_settings/local_settings/mcp/permissions/policy_settings/skills) |
StopFailure 훅에서 matcher 필드로 특정 오류 유형에만 반응하도록 지정할 수 있습니다:
| matcher 값 | 설명 |
|---|---|
rate_limit | API 요청 속도 제한 초과 |
authentication_failed | 인증 실패 |
billing_error | 청구/결제 오류 |
invalid_request | 잘못된 API 요청 |
server_error | 서버 내부 오류 |
max_output_tokens | 최대 출력 토큰 초과 |
unknown | 알 수 없는 오류 |
도구 실행 이벤트
| 이벤트 | 설명 |
|---|---|
PreToolUse | 도구 실행 전 |
PostToolUse | 도구 실행 후 |
PostToolUseFailure | 도구 실행 후 실패 시 |
권한 이벤트
| 이벤트 | 설명 |
|---|---|
PermissionRequest | 권한 요청 발생 시 |
PermissionDenied | 권한 거부 시 |
파일 및 환경 이벤트
| 이벤트 | 설명 |
|---|---|
FileChanged | 파일 변경 감지 시 |
CwdChanged | 작업 디렉토리 변경 시 |
WorktreeCreate | 워크트리 생성 시 (출력: worktreePath — 생성된 worktree 경로) |
WorktreeRemove | 워크트리 제거 시 |
태스크 및 에이전트 이벤트
| 이벤트 | 설명 |
|---|---|
TaskCreated | 새 태스크 생성 시 |
TaskCompleted | 태스크 완료 시 |
SubagentStart | 서브에이전트 시작 시 (matcher: background/foreground) |
SubagentStop | 서브에이전트 종료 시 |
TeammateIdle | 팀메이트 에이전트 대기 상태 시 |
UserPromptSubmit | 사용자 프롬프트 제출 시 |
UserPromptExpansion | 사용자 프롬프트 전송 직전에 내용 수정/확장 가능한 이벤트 |
배치 및 기타 이벤트
| 이벤트 | 설명 |
|---|---|
PostToolBatch | 하나의 턴에서 여러 도구 실행이 완료된 후 (배치 완료) |
PreCompact | 컨텍스트 압축 전 (matcher: auto/user_initiated) |
PostCompact | 컨텍스트 압축 후 |
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE 환경변수로 자동 컴팩트가 실행되는 컨텍스트 사용률 임계값을 재정의할 수 있습니다. 0–100 사이의 값을 지정하세요.
# 컨텍스트 80% 사용 시 자동 컴팩트 실행
export CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=80
| Notification | 알림 발생 시 (작업 완료 등, matcher: permission_prompt/idle_prompt/auth_success/elicitation_dialog) |
| Elicitation | MCP 서버가 사용자 입력을 요청할 때 (출력: action — allow/reject/modify, content — 수정된 요청 내용) |
| ElicitationResult | MCP 서버에 응답 전송 전 (출력: content 재정의 가능 — 서버 전송 전 응답 수정) |
| preToolCall | 도구 실행 전 (레거시) |
| postToolCall | 도구 실행 후 (레거시) |
후크 설정
.claude/settings.json에서 설정합니다:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "echo '파일 수정 시작: ${toolInput.file_path}'"
}
]
}
],
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "npx prettier --write ${toolInput.file_path}"
}
]
}
],
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "node -v && npm -v && echo '환경 준비 완료'"
}
]
}
]
}
}
후크 핸들러 필드
각 훅 핸들러에서 사용할 수 있는 설정 필드입니다:
| 필드 | 타입 | 설명 |
|---|---|---|
type | string | 훅 타입: command, http, prompt, agent, mcp_tool |
command | string | 실행할 셸 명령어 (command 타입) |
matcher | string | 특정 도구명 매칭 패턴 (선택사항) |
if | string | 훅 실행 조건식 (조건 불충족 시 건너뜀) |
once | boolean | true이면 세션당 한 번만 실행 |
async | boolean | true이면 비동기로 실행 (결과 기다리지 않음) |
asyncRewake | boolean | async: true일 때 훅 완료 후 Claude를 다시 깨울지 여부. true이면 훅 완료 시 stop_reason: "async_hook_wakeup"으로 Claude 재개 |
timeout | number | 훅 실행 최대 대기 시간 (초 단위, 기본값: command=600초, prompt=30초) |
statusMessage | string | 훅 실행 중 Claude가 표시할 상태 메시지 |
shell | string | 사용할 쉘 경로 (기본값: /bin/sh) |
allowedEnvVars | array | 훅에 전달할 환경변수 이름 목록 |
훅 기본 타임아웃
timeout 필드를 지정하지 않으면 이벤트 유형별 기본 타임아웃이 적용됩니다:
| 이벤트 유형 | 기본 타임아웃 |
|---|---|
command (동기) | 600초 (10분) |
command (비동기, async: true) | 300초 (5분) |
http | 30초 |
prompt | 30초 |
agent | 600초 (10분) |
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "npx prettier --write ${toolInput.file_path}",
"if": "${toolInput.file_path.endsWith('.ts')}",
"once": false,
"async": true,
"statusMessage": "코드 포매팅 중...",
"allowedEnvVars": ["NODE_ENV", "PATH"]
}
]
}
]
}
}
후크 응답 형식
훅에서 Claude Code로 JSON 응답을 반환할 수 있습니다:
{
"continue": true,
"suppressOutput": false,
"systemMessage": "파일 포매팅이 완료되었습니다.",
"hookSpecificOutput": {
"permissionDecision": "allow"
}
}
| 필드 | 타입/값 | 설명 |
|---|---|---|
continue | boolean | 워크플로우 계속 여부 (false이면 중단) |
suppressOutput | boolean | 훅 출력 억제 여부 |
systemMessage | string | Claude에게 전달할 시스템 메시지 |
updatedInput | object | 도구 입력값 수정 (PreToolUse 전용) |
retry | boolean | 현재 턴을 재시도할지 여부 (PermissionDenied 훅에서 retry: true를 반환하면 다른 권한 결정으로 재시도) |
sessionTitle | string | 세션 제목 지정 (SessionStart 등) |
watchPaths | array | 변경 감지할 경로 목록 추가 (SessionStart 전용) |
hookSpecificOutput.permissionDecision | string | 권한 결정: allow, deny, ask, defer (PreToolUse 전용) |
hookSpecificOutput.permissionDecisionReason | string | 권한 결정 이유 (사용자에게 표시) |
hookSpecificOutput.additionalContext | string | Claude에게 추가 컨텍스트 전달 (SessionStart, UserPromptSubmit, PostToolUse 등 지원) |
stopReason | string | 워크플로우 중단 이유 (선택사항) |
PermissionRequest hookSpecificOutput 상세 응답 형식:
{
"hookSpecificOutput": {
"hookEventName": "PermissionRequest",
"decision": {
"behavior": "allow",
"updatedInput": { "command": "수정된 명령어" },
"updatedPermissions": [
{
"type": "addRules",
"rules": [{ "toolName": "Bash", "ruleContent": "npm *" }],
"behavior": "allow",
"destination": "localSettings"
}
]
},
"message": "거부 이유 (deny 시 사용자에게 표시)"
}
}
| 필드 | 타입/값 | 설명 |
|---|---|---|
decision.behavior | allow | deny | 권한 허용 또는 거부 |
decision.updatedInput | object | 도구 입력값 수정 (허용 시 실제 실행될 입력) |
decision.updatedPermissions | array | 영구 규칙 추가 — type: "addRules"로 설정 |
decision.updatedPermissions[].destination | localSettings | 규칙 저장 위치 (.claude/settings.local.json) |
message | string | 거부 이유 (사용자에게 표시) |
behavior 값 | 동작 |
|---|---|
allow | 해당 작업 허용 |
deny | 해당 작업 거부 |
PreToolUse 훅은 hookSpecificOutput.permissionDecision (allow/deny/ask/defer) 방식을 사용하지만, PermissionRequest 훅은 hookSpecificOutput.decision.behavior (allow/deny) 방식을 사용합니다. 두 이벤트의 응답 형식이 다름에 주의하세요.
permissionDecision: "defer"를 사용하면 권한 결정을 다음 훅 핸들러에게 위임합니다. 여러 훅이 체인으로 연결된 경우, 먼저 일치하는 패턴을 가진 훅이 allow/deny/ask를 반환하면 그 결정이 최종이 됩니다. 모든 훅이 defer를 반환하면 Claude Code의 기본 권한 로직이 실행됩니다.
훅의 출력(stdout/stderr)은 10,000자로 제한됩니다. 초과된 내용은 잘립니다.
HTTP 훅 상태 코드별 동작:
| HTTP 상태 코드 | 동작 |
|---|---|
200 | 성공 — 응답 본문을 훅 출력으로 처리 |
204 | 성공 — 출력 없음 (계속 진행) |
4xx/5xx | 오류 — 경고 표시 후 계속 진행 |
| 연결 실패 | 오류 — 경고 표시 후 계속 진행 |
레거시 응답 형식 (하위 호환):
{
"decision": "block",
"reason": "보안 취약점이 발견되어 파일 수정을 차단합니다",
"output": "추가 출력 메시지"
}
| 필드 | 값 | 설명 |
|---|---|---|
decision | "block" | 해당 작업 차단 |
decision | "approve" | 해당 작업 승인 |
decision | "continue" | 기본 동작 유지 |
reason | 문자열 | 결정 이유 (사용자에게 표시) |
output | 문자열 | 추가 출력 메시지 |
훅 공통 입력 필드
모든 훅 이벤트는 공통으로 다음 JSON 필드를 입력으로 받습니다:
| 필드 | 타입 | 설명 |
|---|---|---|
session_id | string | 현재 세션의 고유 ID |
transcript_path | string | 대화 트랜스크립트 파일 경로 |
cwd | string | 현재 작업 디렉토리 경로 |
permission_mode | string | 현재 권한 모드 (default/acceptEdits/plan/auto/dontAsk/bypassPermissions) |
hook_event_name | string | 발생한 훅 이벤트 이름 (예: PreToolUse) |
agent_id | string | 서브에이전트 컨텍스트에서 에이전트 ID |
agent_type | string | 서브에이전트 컨텍스트에서 에이전트 유형 |
후크 환경변수
훅 실행 시 다음 환경변수를 사용할 수 있습니다:
| 환경변수 | 설명 |
|---|---|
$CLAUDE_PROJECT_DIR | 현재 프로젝트 디렉토리 경로 |
$CLAUDE_ENV_FILE | Claude Code 환경 파일 경로 |
$CLAUDE_PLUGIN_ROOT | 플러그인 루트 경로 |
$CLAUDE_TASK_ID | 현재 실행 중인 태스크 ID |
$CLAUDE_PLUGIN_DATA | 플러그인 간 데이터 공유를 위한 직렬화된 JSON 데이터 |
Exit Code 의미
| Exit Code | 의미 |
|---|---|
0 | 성공 (계속 진행) |
2 | 차단 (블로킹 이벤트에서만 작동 — 해당 작업 중단) |
| 기타 | 오류 (경고만 표시하고 계속 진행) |
Exit Code 2의 차단 동작은 블로킹 이벤트에서만 작동합니다:
| 블로킹 이벤트 | Exit Code 2 효과 |
|---|---|
PreToolUse | 도구 실행 차단 |
PermissionRequest | 권한 요청 거부 |
UserPromptSubmit | 사용자 프롬프트 전송 차단 |
PreCompact | 컨텍스트 압축 차단 |
PostToolUse, SessionStart 등 비블로킹 이벤트에서 Exit Code 2를 반환해도 워크플로우는 중단되지 않고 경고만 표시됩니다.
모든 후크 비활성화
설정에서 disableAllHooks로 모든 후크를 비활성화할 수 있습니다:
{
"disableAllHooks": true
}
/hooks 슬래시 커맨드
현재 설정된 후크 목록을 확인하려면:
> /hooks
/hooks 출력에서 각 훅 항목의 소스 레이블을 확인할 수 있습니다:
| 레이블 | 설명 |
|---|---|
[User] | ~/.claude/settings.json에서 로드된 사용자 전역 훅 |
[Project] | .claude/settings.json에서 로드된 프로젝트 훅 |
[Local] | .claude/settings.local.json에서 로드된 로컬 훅 |
[Session] | 현재 세션에만 적용되는 훅 (임시) |
[Built-in] | Claude Code 내장 훅 |
후크 실전 예제
파일 수정 후 자동 포매팅 + 린팅:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "npx prettier --write ${toolInput.file_path} && npx eslint --fix ${toolInput.file_path}"
}
]
}
]
}
}
커밋 전 테스트 자동 실행:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if echo '${toolInput.command}' | grep -q 'git commit'; then npm test; fi"
}
]
}
]
}
}
HTTP 후크로 알림 전송:
{
"hooks": {
"SessionEnd": [
{
"hooks": [
{
"type": "http",
"url": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
"method": "POST",
"body": "{\"text\": \"Claude Code 세션이 종료되었습니다.\"}"
}
]
}
]
}
}
세션 시작 시 환경 확인:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "node -v && npm -v && echo '환경 준비 완료'"
}
]
}
]
}
}
Notification 훅으로 작업 완료 알림 보내기 (플랫폼별):
macOS:
{
"hooks": {
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"${notification.message}\" with title \"Claude Code\"'"
}
]
}
]
}
}
Linux (libnotify):
{
"hooks": {
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "notify-send 'Claude Code' '${notification.message}'"
}
]
}
]
}
}
Windows (PowerShell Toast):
{
"hooks": {
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "powershell -Command \"[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType=WindowsRuntime] | Out-Null; $template = [Windows.UI.Notifications.ToastNotificationManager]::GetTemplateContent([Windows.UI.Notifications.ToastTemplateType]::ToastText01); $template.SelectSingleNode('//text[@id=1]').InnerText = '${notification.message}'; [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('Claude Code').Show([Windows.UI.Notifications.ToastNotification]::new($template))\""
}
]
}
]
}
}
PermissionRequest 훅으로 권한 자동 결정:
{
"hooks": {
"PermissionRequest": [
{
"matcher": "Read",
"hooks": [
{
"type": "command",
"command": "echo '{\"continue\": true, \"hookSpecificOutput\": {\"decision\": {\"behavior\": \"allow\"}}}'"
}
]
}
]
}
}
커스텀 워크플로우
프로젝트에 맞는 커스텀 워크플로우를 만들 수 있습니다. 현재 권장하는 방식은 **스킬(Skills)**입니다.
스킬로 만들기 (권장)
.claude/skills/ 디렉토리에 SKILL.md 파일을 생성합니다:
---
name: review
description: 현재 브랜치의 변경 사항을 리뷰합니다
---
현재 브랜치의 변경 사항을 리뷰해줘.
다음 항목을 확인해:
1. 보안 취약점
2. 성능 이슈
3. 코딩 컨벤션 위반
4. 테스트 누락
사용:
> /review
스킬에 대한 자세한 내용은 스킬 페이지를 참고하세요.
모델 선택 및 확장 사고
모델 선택
--model 플래그 또는 settings.json에서 사용할 Claude 모델을 지정할 수 있습니다:
# CLI에서 모델 지정
claude --model claude-opus-4-5 "복잡한 아키텍처 설계해줘"
claude --model claude-sonnet-4-5 "코드 리뷰해줘"
claude --model claude-haiku-4-5 "간단한 질문"
settings.json에서 기본 모델을 설정:
{
"model": "claude-sonnet-4-5"
}
| 모델 | 플랜 | 특징 |
|---|---|---|
claude-opus-4-5 | Max | 최고 품질, 복잡한 추론 |
claude-sonnet-4-5 | Pro/Max | 균형 잡힌 성능 (기본값) |
claude-haiku-4-5 | 모든 플랜 | 빠른 응답, 간단한 작업 |
확장 사고 (Extended Thinking)
프롬프트에 특수 키워드를 포함하거나 단축키로 깊은 추론 모드를 활성화합니다:
프롬프트 키워드:
| 키워드 | 노력 수준 | 설명 |
|---|---|---|
think | low | 가볍게 생각 |
think hard | medium | 보통 수준 사고 |
think harder | high | 깊이 있는 사고 |
ultrathink | max | 최대 사고 (가장 느리지만 정확) |
# 프롬프트에 키워드 포함
> ultrathink - 이 알고리즘의 시간 복잡도를 분석하고 최적화해줘
> think hard - 이 아키텍처의 장단점을 분석해줘
단축키:
Option+T/Alt+T- 확장 사고 토글Option+O/Alt+O- 빠른 모드(Haiku) 전환Ctrl+B- 백그라운드 태스크 패널 토글 (실행 중인 백그라운드 에이전트 확인)
CLI 플래그:
# 노력 수준 지정
claude --effort xhigh "복잡한 리팩토링 계획을 세워줘"
claude --effort high "이 버그의 근본 원인을 분석해줘"
설정 (항상 확장 사고 켜기):
{
"alwaysThinkingEnabled": true,
"showThinkingSummaries": true
}
환경변수로 제어:
# 최대 사고 토큰 수 지정
export MAX_THINKING_TOKENS=20000
# 기본 노력 수준
export CLAUDE_CODE_EFFORT_LEVEL=high
# 적응형 사고 비활성화 (항상 동일 수준 사용)
export CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING=1
- 복잡한 알고리즘 설계
- 아키텍처 의사결정
- 어려운 수학/논리 문제
- 미묘한 버그 근본 원인 분석
일반적인 코드 편집에는 표준 모드가 더 빠릅니다.
Plan Mode
Plan Mode는 Claude가 실제 작업 전에 계획을 세우고 사용자 승인을 받는 모드입니다. 위험한 변경을 방지하고 작업 범위를 미리 파악하는 데 유용합니다.
Plan Mode 활성화 방법
인터랙티브 모드에서 토글:
Shift+Tab- Plan Mode 토글
CLI 플래그:
claude --permission-mode plan "모든 TypeScript 파일을 최신 ES2024 문법으로 업그레이드해줘"
항상 Plan Mode 사용 (설정):
{
"permissions": {
"defaultMode": "plan"
}
}
Plan Mode 동작 방식
- Claude가 작업 계획(목록)을 먼저 표시합니다
- 사용자가 계획을 검토하고 승인하거나 수정합니다
- 승인 후 실제 작업을 수행합니다
Plan Mode에서는 파일 읽기만 가능하고, 파일 수정이나 명령 실행은 승인 전까지 차단됩니다.
서브 에이전트 (Sub-agents)
서브 에이전트는 특정 역할과 도구를 부여받은 전문 에이전트입니다. .claude/agents/ 디렉토리에 정의하거나 /agents 슬래시 명령으로 관리합니다.
서브 에이전트 파일 구조
.claude/agents/ 디렉토리에 YAML 프론트매터를 가진 마크다운 파일로 정의합니다:
---
name: code-reviewer
description: 코드 품질과 보안을 리뷰하는 전문 에이전트
tools:
- Read
- Bash
model: claude-sonnet-4-6
permissionMode: ask
maxTurns: 20
---
당신은 경험 많은 시니어 엔지니어입니다.
코드 품질, 보안 취약점, 성능 문제를 중점적으로 리뷰하세요.
항상 구체적인 개선 방안을 제시하세요.
서브 에이전트 프론트매터 필드
| 필드 | 타입 | 설명 |
|---|---|---|
name | string | 에이전트 이름 (필수) |
description | string | 에이전트 설명 (자동 발견 시 사용) |
tools | array | 사용 가능한 도구 목록 |
model | string | 사용할 Claude 모델 |
permissionMode | string | 권한 모드: default(기본값), acceptEdits(편집 자동 승인), plan(계획 모드), auto(자동 모드), dontAsk(권한 프롬프트를 자동으로 거부, pre-allowed 도구는 계속 동작), bypassPermissions(권한 검사 우회) |
maxTurns | number | 최대 대화 턴 수 |
memory | string | 메모리 저장 범위: "user" → ~/.claude/agent-memory/<name>/, "project" → .claude/agent-memory/<name>/, "local" → .claude/agent-memory-local/<name>/ |
isolation | string | 격리 수준 (none/worktree) |
hooks | object | 에이전트 전용 훅 설정 |
skills | array | 사용할 스킬 목록 |
background | boolean | true이면 백그라운드에서 실행 (사용자 상호작용 없음) |
color | string | 에이전트 UI 색상 (HEX 또는 색상 이름) |
initialPrompt | string | 에이전트 시작 시 자동으로 실행할 초기 프롬프트 |
disallowedTools | array | 사용 금지할 도구 목록 |
effort | string | 기본 노력 수준 (low/medium/high/xhigh) |
mcpServers | object | 이 에이전트 전용 MCP 서버 설정 |
포어그라운드 vs 백그라운드 서브에이전트
| 구분 | 포어그라운드 (기본) | 백그라운드 (background: true) |
|---|---|---|
| 사용자 상호작용 | 가능 (확인 요청 등) | 불가능 (자동 완료) |
| 실행 방식 | 현재 세션 내 순차 실행 | 별도 세션에서 병렬 실행 |
| 결과 반환 | 즉시 반환 | 완료 후 알림 |
| 적합한 용도 | 대화형 리뷰, 확인이 필요한 작업 | 코드 분석, 테스트, 장시간 작업 |
서브에이전트 트랜스크립트
서브에이전트의 실행 기록은 다음 경로에 저장됩니다:
~/.claude/projects/{project}/{sessionId}/subagents/agent-{agentId}.jsonl
이 파일을 읽어 서브에이전트의 상세 실행 내역을 확인하거나 디버깅에 활용할 수 있습니다.
서브에이전트 모델 재정의
CLAUDE_CODE_SUBAGENT_MODEL 환경변수로 서브에이전트에서 사용할 모델을 지정합니다:
export CLAUDE_CODE_SUBAGENT_MODEL=claude-haiku-4-5
백그라운드 태스크 비활성화
CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1 환경변수를 설정하면 백그라운드 서브에이전트 실행이 비활성화됩니다:
export CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1
백그라운드 태스크를 비활성화하면 background: true로 설정된 서브에이전트도 포어그라운드에서 실행됩니다.
모델 결정 우선순위:
CLAUDE_CODE_SUBAGENT_MODEL환경변수- 호출 시 전달하는
model파라미터 - 에이전트 frontmatter의
model필드 - 부모 대화 모델
에이전트 범위 우선순위
에이전트는 5단계 범위로 관리되며, 숫자가 낮을수록 높은 우선순위로 동작합니다:
| 우선순위 | 범위 | 설명 |
|---|---|---|
| 1 | managed | 조직 관리자가 배포하는 관리형(Managed) 에이전트 |
| 2 | CLI 플래그 | --agents CLI 플래그로 동적으로 정의한 인라인 에이전트 |
| 3 | 프로젝트 | .claude/agents/ (프로젝트 전용 에이전트) |
| 4 | 사용자 | ~/.claude/agents/ (개인 전역 에이전트) |
| 5 | 플러그인 | 플러그인이 제공하는 에이전트 |
같은 이름의 에이전트가 여러 범위에 존재하면 우선순위가 높은 범위의 정의가 사용됩니다.
/agents 슬래시 명령
> /agents # 등록된 에이전트 목록 표시
> /agents list # 상세 목록
> /agents run code-reviewer # 특정 에이전트 실행
에이전트 자동 발견
에이전트에 description을 설정하면 Claude가 작업 내용에 따라 자동으로 적합한 에이전트를 선택합니다.
@-멘션으로 특정 에이전트 지정
프롬프트에서 @agent-<이름> 형식으로 특정 에이전트를 직접 지정하여 호출할 수 있습니다:
> @agent-code-reviewer 이 파일의 보안 취약점을 확인해줘
CLI에서도 --agent 플래그 또는 설정의 agent 필드로 기본 에이전트를 지정할 수 있습니다:
claude --agent code-reviewer "PR을 리뷰해줘"
포크 서브에이전트
/fork 명령어나 CLAUDE_CODE_FORK_SUBAGENT=1 환경변수를 사용하면 현재 세션을 포크하여 독립적인 서브에이전트로 실행할 수 있습니다:
> /fork 이 기능을 실험적으로 구현해봐줘
포크된 에이전트는 원본 세션의 컨텍스트를 복사하지만 별도의 실행 환경에서 동작합니다.
포크 패널 키보드 단축키
포크 패널이 열려 있을 때 다음 단축키로 포크를 관리할 수 있습니다:
| 단축키 | 동작 |
|---|---|
↑ / ↓ | 포크 선택 이동 |
Enter | 선택한 포크로 전환 |
x | 선택한 포크 삭제 |
Esc | 포크 패널 닫기 |
특정 에이전트 비활성화
permissions.deny에 Agent(에이전트-이름) 형식으로 추가하면 특정 서브에이전트의 사용을 막을 수 있습니다:
{
"permissions": {
"deny": [
"Agent(code-reviewer)"
]
}
}
내장 에이전트
Claude Code에는 기본 내장된 에이전트들이 있습니다:
| 에이전트 | 모델 | 특징 |
|---|---|---|
Explore | Haiku (빠름, 낮은 지연시간) | 코드베이스 탐색 전용, 읽기 전용 도구만 사용 |
Plan | 메인 모델 상속 | 계획 수립 전용, 읽기 전용 도구만 사용 |
General-purpose | 메인 모델 상속 | 범용 에이전트, 모든 도구 사용 가능 |
statusline-setup | Sonnet | /statusline 실행 시 상태 표시줄 설정 전용 |
claude-code-guide | Haiku | Claude Code 기능·문서에 관한 질문 전용 |
IDE 통합
Claude Code는 VS Code와 JetBrains IDE에서 확장 프로그램으로도 사용할 수 있습니다.
VS Code 확장
- VS Code 마켓플레이스에서 "Claude Code" 검색
- 확장 프로그램 설치
- 터미널 패널에서 Claude Code 사용
JetBrains 확장
- JetBrains 플러그인 마켓플레이스에서 "Claude Code" 검색
- 플러그인 설치
- 도구 창에서 Claude Code 사용
실전 예제: GitHub Actions에서 자동 코드 리뷰
Anthropic은 GitHub Actions 통합을 위한 공식 Action **anthropics/claude-code-action@v1**을 제공합니다. PR/이슈에서 @claude 멘션으로 Claude를 트리거할 수 있습니다.
빠른 설정
터미널에서 아래 명령어를 실행하면 대화형으로 GitHub 앱을 설치합니다 (저장소 관리자 권한 필요):
/install-github-app
기본 워크플로우 (공식 Action 사용)
# .github/workflows/claude.yml
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
jobs:
claude:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
steps:
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
설정 후 PR/이슈 댓글에서 @claude로 트리거합니다:
@claude 이 PR의 보안 취약점을 분석해줘
@claude 이 기능을 이슈 설명대로 구현해줘
@claude 이 버그 수정 후 테스트 코드도 작성해줘
자동 PR 리뷰 워크플로우
PR이 열릴 때마다 자동으로 코드 리뷰를 실행합니다:
name: Claude Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
prompt: "이 PR을 리뷰해줘. 보안 취약점, 성능 이슈, 버그 가능성을 중점적으로 분석하고 개선 사항을 제안해줘."
claude_args: "--max-turns 5 --model claude-sonnet-4-6"
주요 파라미터
| 파라미터 | 설명 | 필수 |
|---|---|---|
anthropic_api_key | Claude API 키 (직접 API 사용 시) | 예 |
prompt | Claude에 전달할 지침 (생략 시 @claude 멘션에 자동 응답) | 아니오 |
claude_args | Claude Code CLI 인수 (--max-turns, --model, --mcp-config 등) | 아니오 |
trigger_phrase | 트리거 구문 (기본값: @claude) | 아니오 |
use_bedrock | Amazon Bedrock 사용 ("true") | 아니오 |
use_vertex | Google Vertex AI 사용 ("true") | 아니오 |
plugin_marketplaces | 플러그인 마켓플레이스 Git URL | 아니오 |
plugins | 설치할 플러그인 목록 | 아니오 |
Amazon Bedrock / Google Vertex AI 사용
API 키 대신 클라우드 제공자를 사용할 수 있습니다:
# Amazon Bedrock 사용
- uses: anthropics/claude-code-action@v1
with:
use_bedrock: "true"
claude_args: "--model us.anthropic.claude-sonnet-4-6 --max-turns 10"
# AWS 자격증명은 별도 단계에서 구성 (configure-aws-credentials 등)
# Google Vertex AI 사용
- uses: anthropics/claude-code-action@v1
with:
use_vertex: "true"
claude_args: "--model claude-sonnet-4-5@20250929 --max-turns 10"
env:
ANTHROPIC_VERTEX_PROJECT_ID: ${{ steps.auth.outputs.project_id }}
CLOUD_ML_REGION: us-east5
저장소 루트에 CLAUDE.md를 생성하면 GitHub Actions에서도 Claude가 코딩 규칙, 리뷰 기준, 프로젝트 아키텍처를 반영합니다.
실전 예제: 구조화된 출력으로 코드 분석 자동화
코드 품질 메트릭을 JSON으로 추출:
claude -p "src/ 디렉토리의 코드 품질을 분석해줘" \
--output-format json \
--json-schema '{
"type": "object",
"properties": {
"summary": {"type": "string"},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"file": {"type": "string"},
"severity": {"type": "string", "enum": ["low", "medium", "high", "critical"]},
"description": {"type": "string"},
"suggestion": {"type": "string"}
},
"required": ["file", "severity", "description"]
}
},
"score": {"type": "number", "minimum": 0, "maximum": 100}
},
"required": ["summary", "issues", "score"]
}' \
--permission-mode dontAsk \
--bare
이 결과를 파이프라인에서 파싱하여 품질 게이트로 활용할 수 있습니다:
# 품질 점수가 70 미만이면 실패
SCORE=$(claude -p "..." --output-format json | jq '.score')
if [ "$SCORE" -lt 70 ]; then
echo "코드 품질 점수가 기준 미달입니다: $SCORE/100"
exit 1
fi
실전 예제: 멀티 에이전트 워크플로우
tmux와 에이전트 팀을 활용한 병렬 작업:
# 터미널 1: 프론트엔드 에이전트
claude -p "프론트엔드 컴포넌트의 접근성(a11y)을 점검하고 수정해줘" \
--allowedTools "Read,Edit,Bash"
# 터미널 2: 백엔드 에이전트
claude -p "API 엔드포인트의 에러 핸들링을 점검하고 개선해줘" \
--allowedTools "Read,Edit,Bash"
# 터미널 3: 테스트 에이전트
claude -p "테스트 커버리지를 분석하고 누락된 테스트를 작성해줘" \
--allowedTools "Read,Edit,Bash"
claude --tmux를 사용하면 이러한 병렬 에이전트를 하나의 tmux 세션에서 관리할 수 있습니다. 각 에이전트의 진행 상황을 한눈에 모니터링할 수 있습니다.
문제 해결
헤드리스 모드에서 타임아웃
# 타임아웃 늘리기
claude -p "대규모 리팩토링" --timeout 600000
도구 권한 에러
# 필요한 도구를 명시적으로 허용
claude -p "작업 수행" --allowedTools "Bash,Read,Edit,Write"
후크가 실행되지 않는 경우
.claude/settings.json의 JSON 문법 확인- 이벤트 이름이 정확한지 확인 (
PreToolUse,PostToolUse,SessionStart등) matcher값이 정확한 도구 이름인지 확인 (Edit,Bash,Read등)command가 유효한 셸 명령어인지 확인disableAllHooks: true로 설정되어 있지 않은지 확인/hooks커맨드로 현재 설정된 후크 목록 확인
연계 기능
장점, 단점과 한계점
장점
- 헤드리스 모드로 완전 자동화:
-p플래그로 비대화형 실행이 가능하여 CI/CD 파이프라인, 스크립트, 크론잡 등에서 Claude Code를 완전 자동화할 수 있습니다. - Agent SDK로 커스텀 도구 구축: 에이전트 팀을 JSON으로 정의하여 복잡한 멀티 에이전트 워크플로우를 구성할 수 있습니다.
- 구조화된 출력(JSON):
--output-format json과--json-schema로 프로그래밍적으로 파싱 가능한 정형 데이터를 받아 파이프라인에 통합할 수 있습니다. - 후크로 워크플로우 확장:
PreToolUse,PostToolUse,SessionStart이벤트에 셸 명령어를 연결하여 자동 포매팅, 린팅, 테스트 실행 등을 자동화합니다. - 에이전트 팀으로 병렬 처리: tmux 통합과
--agents옵션으로 여러 에이전트를 동시에 실행하여 대규모 작업을 병렬로 처리할 수 있습니다.
단점과 한계점
- 러닝 커브가 높음: 헤드리스 모드, 후크, 에이전트 팀, 구조화 출력 등 다양한 옵션을 익히는 데 시간이 필요하며, 초보자에게는 진입 장벽이 됩니다.
--permission-mode dontAsk주의: 사전 승인되지 않은 도구를 자동으로 거부하므로, 반드시permissions.allow목록을 사전에 명시해야 합니다. 예상치 못한 도구가 차단될 수 있어 신중하게 설정해야 합니다.- 후크 디버깅 어려움: 후크에서 오류가 발생해도 에러 메시지가 직관적이지 않으며, JSON 설정 파일의 작은 실수가 전체 후크 체인을 중단시킬 수 있습니다.
- 에이전트 팀 비용이 높음: 여러 에이전트를 병렬로 실행하면 API 사용량이 배로 증가하여, 대규모 팀 구성 시 비용 관리에 주의가 필요합니다.
- CI/CD 환경 설정 복잡: GitHub Actions 등에서 Claude Code를 실행하려면 API 키 관리, 권한 모드 설정, 출력 파싱 등 여러 단계의 구성이 필요합니다.
처음에는 --permission-mode acceptEdits로 시작하여 파일 편집만 자동 승인하고, 충분히 신뢰할 수 있는 환경에서만 dontAsk로 전환하세요. 후크 디버깅은 먼저 셸에서 command를 직접 실행하여 동작을 확인한 후 설정에 추가하는 것이 안전합니다.