Hands-on Lab / Chapter 1

Claude Code, 설치부터 Headless 자동화까지

Claude Code Deep Dive Workshop, Chapter 1 - Overview 실습

이 랩에서는 Claude Code를 본인 환경에 설치하고, 인증을 마친 뒤 실제 버그를 고치고 자동화 파이프라인까지 실행합니다. 각 Task의 코드 블록은 복사 버튼으로 터미널에 바로 붙여넣을 수 있고, Task 끝의 체크포인트를 통과하면 상단 타임라인이 채워집니다.

소요 시간 40분 내외 Task 준비 + 6개 기준 버전 Claude Code 2.1.x Update 2026.07
TASK 00

사전 준비 확인

2분

실습을 시작하기 전에 OS, Node.js, Git이 준비되어 있는지 1분 안에 확인합니다. 모든 항목이 통과하면 바로 Task 1로 넘어갑니다.

항목요구사항비고
OSmacOS 12+ / Ubuntu 20.04+ / Windows WSL2WSL2는 Ubuntu 배포판 권장
RuntimeNode.js 18 LTS 이상20 LTS 권장
계정Claude 구독 계정(Pro/Max/Team/Enterprise), Anthropic API Key, AWS 계정 중 1개Task 2에서 택1
도구Git, 터미널, IDE(VS Code 등)Git은 Task 3, 6에서 사용
1버전 확인
Terminal
node --version   # v18.x 이상이어야 합니다
git --version    # 2.x 이상 권장
Node.js가 없거나 18 미만이라면 nvm install 20 && nvm use 20 으로 설치하세요. nvm, fnm 같은 버전 관리자를 쓰면 이후 글로벌 패키지 설치 시 sudo가 필요 없습니다.
CHECKPOINT
TASK 01

설치 및 검증

6분

이 랩의 EC2에는 Claude Code가 이미 설치되어 있습니다. 설치 단계는 건너뛰고, claude doctor 자가 진단으로 버전과 상태만 검증합니다.

1Claude Code 설치 (이 환경에선 생략)

실습 EC2에는 사전 설치되어 있으므로 이 단계는 실행하지 않습니다. 아래 명령은 나중에 본인 PC 등 다른 환경에 직접 설치할 때의 참고입니다.

Terminal
npm install -g @anthropic-ai/claude-code
권한 오류가 발생한다면 npm config get prefix 결과가 /usr/local이면 sudo가 필요할 수 있습니다. nvm / fnm / Volta 사용자는 sudo 없이 설치됩니다. macOS / Windows용 Native Installer, Docker 방식은 강의 자료 Chapter 1 Part 3을 참고하세요.
2설치 확인
Terminal
claude --version
3자가 진단 실행
Terminal
claude doctor

doctor는 아래처럼 System / Network / Auth / Config 4개 영역을 점검합니다. 지금 단계에서는 Auth 항목이 비어 있어도 정상입니다.

출력 예시
$ claude doctor
Claude Code doctor
Running: native (2.1.220)
Commit: 4073f59596e2
Platform: linux-arm64
Path: /home/ec2-user/.local/share/claude/versions/2.1.220
Config install method: native
Search: OK (bundled)
Auto-updates: disabled (set by env: DISABLE_AUTOUPDATER)
Auto-update channel: latest
Last update attempt: none recorded
Remote Control
Control this session from claude.ai/code or the Claude mobile app
No installation issues found.
For a full setup checkup that can also fix issues, run /doctor in a Claude Code session.
CHECKPOINT
TASK 02

인증 설정

5분

이 랩의 터미널에는 인증이 이미 구성되어 있어 설정 단계를 생략합니다 (c4e 엔드포인트는 Claude Enterprise, ccb 엔드포인트는 Bedrock 용도에 맞게 구성됨). 아래 3가지 방법은 다른 환경에서 직접 설정할 때의 참고입니다.

Claude 구독 계정이 있다면 가장 빠른 방법입니다. 로그인 화면에서 Claude account with subscription · Pro, Max, Team, or Enterprise를 선택하면 브라우저 OAuth로 1분 안에 끝납니다.

Terminal
claude
# 첫 실행 시 인증 안내가 표시됩니다. Enter를 누르면 브라우저가 열립니다.
# 로그인 방법 선택에서 1. Claude account with subscription 을 고릅니다.
# 이미 세션 안이라면 /login 명령으로 동일하게 진행합니다.

브라우저에서 Claude.ai 계정으로 로그인하고 Authorize Claude Code를 클릭하면 CLI로 자동 복귀합니다.

출력 예시
Successfully signed in as user@example.com
Plan: Claude Max

Anthropic Console에서 발급한 API Key로 종량제 사용합니다. 환경변수로 설정하는 방식이 가장 일반적입니다.

Terminal
export ANTHROPIC_API_KEY="sk-ant-api03-여기에-본인-키"
claude
Terminal, 영구 저장 (zsh 기준)
echo 'export ANTHROPIC_API_KEY="sk-ant-api03-여기에-본인-키"' >> ~/.zshrc
source ~/.zshrc
Key 보안 API Key를 코드나 Git에 커밋하지 마세요. macOS Keychain, 1Password CLI, direnv(.envrc는 반드시 .gitignore에 추가) 같은 안전한 저장 방식을 권장합니다.

AWS 청구 경로로 Claude를 사용합니다. AWS 자격증명(Profile, Access Key, IAM Role 중 하나)이 준비되어 있어야 합니다.

Terminal
# 1. Bedrock 모드 활성화
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_REGION=us-west-2

# 2. AWS 자격증명 (택1: AWS_PROFILE 또는 Access Key, EC2/EKS는 IAM Role 자동 감지)
export AWS_PROFILE=본인-프로필명

# 3. 모델 ID 지정 (Cross-Region Inference Profile 권장)
export ANTHROPIC_MODEL=us.anthropic.claude-sonnet-4-5-20250929-v1:0

# 4. 실행
claude
출력 예시
Successfully authenticated via AWS Bedrock (us-west-2)
사전 조건 AWS 콘솔의 Bedrock, Model access에서 Anthropic Claude 모델 액세스가 승인되어 있어야 합니다. 리전과 모델 ID가 일치하지 않으면 모델 호출이 실패합니다.
2인증 상태 확인

어떤 방법을 사용했든, 세션 안에서 /status로 인증과 모델 상태를 확인합니다.

Claude 세션 입력
/status
출력 예시 (일부)
Auth
  Method: OAuth (Claude Max)
Model
  Default: claude-sonnet-4-5
Usage (this session)
  Context used: 3% of 200K
CHECKPOINT
TASK 03

실습 프로젝트 준비와 첫 세션

7분

의존성 없는 작은 Node.js 프로젝트를 생성하고 첫 세션을 시작합니다. 이 프로젝트에는 의도된 버그가 들어 있으며 Task 5에서 Claude가 직접 수정합니다.

1샘플 프로젝트 생성

아래 블록 전체를 복사해 터미널에 붙여넣으세요.

터미널 위치 이 랩의 모든 터미널 명령은 ~/claude-lab/ch1에서 실행합니다. 붙여넣기 전에 프롬프트의 현재 경로를 한 번씩 확인하세요.

~/claude-lab/ch1 아래에 4개 파일이 생성되고 Git 저장소로 초기화됩니다.

Terminal, 전체 복사
mkdir -p ~/claude-lab/ch1/src && cd ~/claude-lab/ch1

cat > package.json << 'EOF'
{
  "name": "user-service-lab",
  "version": "1.0.0",
  "description": "Claude Code Workshop Chapter 1 sample project",
  "type": "module",
  "scripts": {
    "test": "node test.js"
  }
}
EOF

cat > src/users.js << 'EOF'
// 사용자 데이터 저장소
// 주의: 일부 사용자는 profile 필드가 없음 (마이그레이션 미수행 상황)
export const users = [
  { id: 1, name: "Kim", profile: { email: "kim@example.com", plan: "pro" } },
  { id: 2, name: "Lee", profile: { email: "lee@example.com", plan: "free" } },
  { id: 3, name: "Park" }
];
EOF

cat > src/userService.js << 'EOF'
import { users } from "./users.js";

export function getUser(id) {
  return users.find((u) => u.id === id);
}

export function getUserPlan(id) {
  const user = getUser(id);
  return user.profile.plan;
}
EOF

cat > test.js << 'EOF'
import { getUserPlan } from "./src/userService.js";

function check(name, fn, expected) {
  const actual = fn();
  console.log(`${name}: ${actual === expected ? "PASS" : `FAIL (got ${actual})`}`);
}

check("Test 1 - pro 플랜 사용자", () => getUserPlan(1), "pro");
check("Test 2 - free 플랜 사용자", () => getUserPlan(2), "free");
check("Test 3 - profile 없는 사용자", () => getUserPlan(3), "unknown");
EOF

git init -q
git add -A
git commit -q -m "chore: initial lab project" \
  || git -c user.name="lab" -c user.email="lab@example.com" commit -q -m "chore: initial lab project"

ls -R
2첫 세션 시작

프로젝트 루트에서 claude를 실행합니다. 현재 디렉토리가 워크스페이스가 됩니다.

Terminal
cd ~/claude-lab/ch1
claude
3첫 프롬프트 입력

아래 프롬프트를 입력하고, Claude가 Read / Glob 도구를 스스로 호출해 파일을 읽는 과정을 관찰하세요.

Claude 세션 입력
이 프로젝트의 구조와 각 파일의 역할을 간단히 설명해 주세요
관찰 포인트
[Claude calls tools]
  Read  package.json
  Glob  src/**/*.js
  Read  src/userService.js
  ...
이 프로젝트는 사용자 조회 서비스로... (요약 응답)
좋은 프롬프트의 4단계 구조 맥락 - 목표 - 제약 - 검증 방법 순서로 쓰면 정확도가 올라갑니다. "코드 좀 봐줘" 대신 "src/userService.js의 getUserPlan을 검토하고, null 안전성 문제가 있으면 고쳐줘. 수정 후 npm test가 모두 PASS 해야 해" 처럼 대상 / 목표 / 검증을 명시하세요.
4핵심 슬래시 명령 훑어보기

세션 안에서 /help/status를 실행해 보세요. 아래 표는 이번 랩에서 사용하는 명령입니다.

명령동작사용 시점
/help사용 가능한 모든 명령 표시시작 첫 명령
/initCLAUDE.md 자동 생성프로젝트당 1회, Task 4
/status인증 / 모델 / 컨텍스트 사용량점검 시
/clear컨텍스트 완전 초기화작업 전환 시
/compact오래된 메시지 요약 압축컨텍스트 부족 시
/cost토큰 사용량 확인주기적 확인
CHECKPOINT
TASK 04

CLAUDE.md 작성

8분

프로젝트 메모리 CLAUDE.md를 자동 생성하고, 팀 규칙에 맞게 편집한 뒤 실제로 Claude의 행동이 바뀌는지 검증합니다. CLAUDE.md는 매 세션 시작 시 자동 로드됩니다.

1/init으로 자동 생성
Claude 세션 입력
/init
출력 예시
Analyzing project structure...
  Detected: Node.js (ES Modules)
  Detected: npm test script
Generated CLAUDE.md (preview): ...
Write to ./CLAUDE.md? (y/N) y
2랩 프로젝트에 맞게 편집

세션을 잠시 빠져나오거나(Ctrl + C) 다른 터미널 탭에서, 생성된 CLAUDE.md를 아래 내용으로 교체합니다. 핵심 5개 섹션(Overview / Stack / Commands / Conventions / Don't)을 갖춘 구조입니다.

Terminal, 전체 복사
cat > CLAUDE.md << 'EOF'
# Project: user-service-lab

## Project Overview
Claude Code 워크샵 실습용 사용자 서비스 모듈.
사용자 조회와 요금제(plan) 확인 기능을 제공한다.

## Tech Stack
- Node.js 18+ (ES Modules), 외부 의존성 없음

## Commands
- 테스트: npm test

## Conventions
- ES Modules(import/export)만 사용, CommonJS 금지
- 존재하지 않는 데이터는 예외를 던지지 말고 기본값을 반환
- 모든 수정에는 test.js의 테스트 통과가 동반되어야 함

## Don't
- src/users.js의 데이터 구조를 임의로 변경하지 않기
- 새 npm 패키지를 추가하지 않기
EOF
cat CLAUDE.md
CLAUDE.md 베스트 프랙티스 500-1500 단어가 적정선입니다. 매 세션 토큰을 소비하므로 간결하게, "테스트 어떻게" 같은 설명 대신 npm test처럼 그대로 실행 가능한 명령을 적고, 결정이 바뀌면 즉시 갱신하는 살아있는 문서로 유지하세요.
3동작 검증

새 세션을 시작하면 CLAUDE.md가 자동 로드됩니다. 규칙이 실제로 적용되는지 확인해 보세요.

Terminal
claude
Claude 세션 입력
이 프로젝트에서 테스트는 어떻게 실행하나요? 그리고 이 프로젝트의 코딩 규칙을 요약해 주세요

CLAUDE.md에 적어둔 npm test와 Conventions / Don't 규칙을 근거로 답하면 성공입니다. /status에서도 CLAUDE.md: loaded를 확인할 수 있습니다.

CHECKPOINT
TASK 05

디버깅 시나리오와 Plan 모드

8분

준비된 버그를 Claude에게 자율적으로 고치게 하고 (Read - Grep - Edit - Bash 흐름 관찰), 이어서 Plan 모드로 더 복잡한 변경을 계획 검토 후 실행합니다.

1버그 재현
Terminal (~/claude-lab/ch1)
npm test
출력 예시
Test 1 - pro 플랜 사용자: PASS
Test 2 - free 플랜 사용자: PASS
TypeError: Cannot read properties of undefined (reading 'plan')
    at getUserPlan (file:///.../src/userService.js:9:23)
2에러를 그대로 전달

에러 메시지, 기대 동작, 검증 방법을 함께 전달합니다. Claude 세션에서 아래를 입력하세요.

Claude 세션 입력
npm test 실행 시 다음 에러가 발생합니다. 원인을 찾고 수정해 주세요.

TypeError: Cannot read properties of undefined (reading 'plan')
    at getUserPlan (src/userService.js:9)

기대 동작: profile이 없는 사용자는 "unknown"을 반환해야 합니다.
수정 후 npm test로 3개 테스트가 모두 PASS 하는지 직접 확인해 주세요.
3자율 작업 흐름 관찰

Claude가 도구를 연쇄 호출하는 과정을 지켜보세요. 파일 수정(Edit)과 명령 실행(Bash)은 승인을 요청합니다.

관찰 포인트
Read  src/userService.js        # 에러 지점 확인
Grep  "profile"                 # 영향 범위 검색
Edit  src/userService.js        # 옵셔널 체이닝 + 기본값 (승인 요청)
Bash  npm test                  # 수정 검증 (승인 요청)

Test 1 ~ 3: PASS PASS PASS
4수정 사항 커밋
Claude 세션 입력
변경 내용을 검토하고, 적절한 커밋 메시지로 git 커밋해 주세요
5Plan 모드로 복잡한 작업 요청

Shift + Tab으로 Plan 모드를 켭니다 (화면에 Plan mode: ON 표시). Plan 모드에서는 Claude가 실행 전에 단계별 계획, 영향 파일, 위험 요소를 먼저 제시합니다.

Claude 세션 입력, Plan 모드 ON 상태
사용자 soft delete 기능을 추가해 주세요.
- users 데이터에 deletedAt 필드 (기본 null)
- removeUser(id): deletedAt에 현재 시각 기록
- getUser / getUserPlan은 삭제된 사용자를 제외해야 함
- test.js에 삭제 시나리오 테스트 추가
구현 전에 계획을 먼저 보여 주세요.

제시된 계획을 검토한 뒤 승인하거나, "테스트는 별도 파일로 분리해 주세요"처럼 수정 지시 후 재계획을 받아 보세요. 계획이 만족스러우면 승인해 실행합니다.

Plan 모드 vs Auto 모드 아키텍처 변경, 다중 파일 수정, 데이터 마이그레이션처럼 큰 변경은 Plan 모드, 단일 함수 수정 같은 작고 명확한 변경은 Auto 모드가 적합합니다. 세션 중 언제든 Shift + Tab으로 전환할 수 있습니다.
6터미널에서 회귀 확인

Plan 모드로 수정한 코드가 기존 테스트를 깨지 않았는지, ~/claude-lab/ch1에서 npm test를 다시 실행해 직접 확인합니다.

Terminal (~/claude-lab/ch1)
cd ~/claude-lab/ch1
npm test
출력 예시
$ npm test

> user-service-lab@1.0.0 test
> node test.js

Test 1 - pro 플랜 사용자: PASS
Test 2 - free 플랜 사용자: PASS
CHECKPOINT
TASK 06

Headless 자동화

4분

-p 플래그로 대화 없이 Claude를 호출하고, JSON 출력과 쉘 파이프로 스크립트 / CI에 통합 가능한 형태를 실습합니다. 세션 밖 터미널에서 실행하세요.

1기본 Headless 호출
Terminal
claude -p "이 프로젝트의 구조와 목적을 3줄로 요약해 주세요" --output-format text
2쉘 파이프 통합
Terminal
git log --oneline | claude -p "이 커밋 히스토리를 한 문단으로 요약해 주세요"
3JSON 출력으로 후처리
Terminal
claude -p "src 디렉토리의 코드 품질 이슈를 분석해 주세요" \
  --allowed-tools "Read,Grep,Glob" \
  --output-format json > report.json

# jq가 있다면
jq '.' report.json | head -30
자동화 안전장치 --allowed-tools "Read,Grep,Glob"처럼 도구를 읽기 전용으로 제한하면 무인 실행 중 파일 수정이나 명령 실행을 원천 차단할 수 있습니다. 간단한 작업은 --model haiku로 비용을 절감하세요.
4자동화 스크립트 만들기

직전 커밋의 diff를 자동 리뷰하는 스크립트입니다. Chapter 5에서 cron / GitHub Actions 연동으로 심화합니다.

Terminal, 전체 복사
cat > review.sh << 'EOF'
#!/bin/bash
DIFF=$(git diff HEAD~1)
echo "$DIFF" | claude -p "이 diff를 코드 리뷰해 주세요. 심각도별로 정리해 주세요." \
  --allowed-tools "" --output-format text > review.md
EOF
chmod +x review.sh
./review.sh
cat review.md
CHECKPOINT

마무리, 학습 목표 체크리스트

Chapter 1의 학습 목표를 스스로 점검하세요. 미달성 항목은 강의 자료의 해당 Part를 다시 확인하거나 Slack 채널에 질문을 남기세요.

목표확인 질문관련
DefineCopilot / Cursor와 Claude Code의 차이를 설명할 수 있는가강의 Part 1
Install본인 환경에 설치하고 claude doctor를 통과했는가Task 1
Authenticate인증 방법 중 적절한 것을 선택해 /status로 확인했는가Task 2
Use ToolsRead / Grep / Edit / Bash 도구 호출을 직접 관찰했는가Task 3, 5
MemoryCLAUDE.md를 작성하고 규칙 반영을 확인했는가Task 4
Plan Mode계획 검토 - 수정 - 승인 사이클을 경험했는가Task 5
Headless-p 플래그와 JSON 출력으로 자동화를 실행했는가Task 6
NEXT CHAPTER

Chapter 2 - Agents (Subagents)

맞춤 서브에이전트 설계와 병렬 작업 위임. 하나의 세션에서 여러 전문 에이전트를 조합하는 방법을 실습합니다.