사전 준비 확인
2분실습을 시작하기 전에 OS, Node.js, Git이 준비되어 있는지 1분 안에 확인합니다. 모든 항목이 통과하면 바로 Task 1로 넘어갑니다.
| 항목 | 요구사항 | 비고 |
|---|---|---|
| OS | macOS 12+ / Ubuntu 20.04+ / Windows WSL2 | WSL2는 Ubuntu 배포판 권장 |
| Runtime | Node.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에서 사용 |
node --version # v18.x 이상이어야 합니다
git --version # 2.x 이상 권장
nvm install 20 && nvm use 20 으로 설치하세요.
nvm, fnm 같은 버전 관리자를 쓰면 이후 글로벌 패키지 설치 시 sudo가 필요 없습니다.
설치 및 검증
6분이 랩의 EC2에는 Claude Code가 이미 설치되어 있습니다. 설치 단계는 건너뛰고, claude doctor 자가 진단으로 버전과 상태만 검증합니다.
실습 EC2에는 사전 설치되어 있으므로 이 단계는 실행하지 않습니다. 아래 명령은 나중에 본인 PC 등 다른 환경에 직접 설치할 때의 참고입니다.
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을 참고하세요.
claude --version
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.
인증 설정
5분이 랩의 터미널에는 인증이 이미 구성되어 있어 설정 단계를 생략합니다 (c4e 엔드포인트는 Claude Enterprise, ccb 엔드포인트는 Bedrock 용도에 맞게 구성됨). 아래 3가지 방법은 다른 환경에서 직접 설정할 때의 참고입니다.
Claude 구독 계정이 있다면 가장 빠른 방법입니다. 로그인 화면에서 Claude account with subscription · Pro, Max, Team, or Enterprise를 선택하면 브라우저 OAuth로 1분 안에 끝납니다.
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로 종량제 사용합니다. 환경변수로 설정하는 방식이 가장 일반적입니다.
export ANTHROPIC_API_KEY="sk-ant-api03-여기에-본인-키"
claude
echo 'export ANTHROPIC_API_KEY="sk-ant-api03-여기에-본인-키"' >> ~/.zshrc
source ~/.zshrc
AWS 청구 경로로 Claude를 사용합니다. AWS 자격증명(Profile, Access Key, IAM Role 중 하나)이 준비되어 있어야 합니다.
# 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)
어떤 방법을 사용했든, 세션 안에서 /status로 인증과 모델 상태를 확인합니다.
/status
Auth
Method: OAuth (Claude Max)
Model
Default: claude-sonnet-4-5
Usage (this session)
Context used: 3% of 200K
실습 프로젝트 준비와 첫 세션
7분의존성 없는 작은 Node.js 프로젝트를 생성하고 첫 세션을 시작합니다. 이 프로젝트에는 의도된 버그가 들어 있으며 Task 5에서 Claude가 직접 수정합니다.
아래 블록 전체를 복사해 터미널에 붙여넣으세요.
~/claude-lab/ch1에서 실행합니다.
붙여넣기 전에 프롬프트의 현재 경로를 한 번씩 확인하세요.
~/claude-lab/ch1 아래에 4개 파일이 생성되고 Git 저장소로 초기화됩니다.
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
프로젝트 루트에서 claude를 실행합니다. 현재 디렉토리가 워크스페이스가 됩니다.
cd ~/claude-lab/ch1
claude
아래 프롬프트를 입력하고, Claude가 Read / Glob 도구를 스스로 호출해 파일을 읽는 과정을 관찰하세요.
이 프로젝트의 구조와 각 파일의 역할을 간단히 설명해 주세요
[Claude calls tools]
Read package.json
Glob src/**/*.js
Read src/userService.js
...
이 프로젝트는 사용자 조회 서비스로... (요약 응답)
세션 안에서 /help와 /status를 실행해 보세요. 아래 표는 이번 랩에서 사용하는 명령입니다.
| 명령 | 동작 | 사용 시점 |
|---|---|---|
/help | 사용 가능한 모든 명령 표시 | 시작 첫 명령 |
/init | CLAUDE.md 자동 생성 | 프로젝트당 1회, Task 4 |
/status | 인증 / 모델 / 컨텍스트 사용량 | 점검 시 |
/clear | 컨텍스트 완전 초기화 | 작업 전환 시 |
/compact | 오래된 메시지 요약 압축 | 컨텍스트 부족 시 |
/cost | 토큰 사용량 확인 | 주기적 확인 |
CLAUDE.md 작성
8분프로젝트 메모리 CLAUDE.md를 자동 생성하고, 팀 규칙에 맞게 편집한 뒤 실제로 Claude의 행동이 바뀌는지 검증합니다. CLAUDE.md는 매 세션 시작 시 자동 로드됩니다.
/init
Analyzing project structure...
Detected: Node.js (ES Modules)
Detected: npm test script
Generated CLAUDE.md (preview): ...
Write to ./CLAUDE.md? (y/N) y
세션을 잠시 빠져나오거나(Ctrl + C) 다른 터미널 탭에서, 생성된 CLAUDE.md를 아래 내용으로 교체합니다. 핵심 5개 섹션(Overview / Stack / Commands / Conventions / Don't)을 갖춘 구조입니다.
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
npm test처럼 그대로 실행 가능한 명령을 적고,
결정이 바뀌면 즉시 갱신하는 살아있는 문서로 유지하세요.
새 세션을 시작하면 CLAUDE.md가 자동 로드됩니다. 규칙이 실제로 적용되는지 확인해 보세요.
claude
이 프로젝트에서 테스트는 어떻게 실행하나요? 그리고 이 프로젝트의 코딩 규칙을 요약해 주세요
CLAUDE.md에 적어둔 npm test와 Conventions / Don't 규칙을 근거로 답하면 성공입니다.
/status에서도 CLAUDE.md: loaded를 확인할 수 있습니다.
디버깅 시나리오와 Plan 모드
8분준비된 버그를 Claude에게 자율적으로 고치게 하고 (Read - Grep - Edit - Bash 흐름 관찰), 이어서 Plan 모드로 더 복잡한 변경을 계획 검토 후 실행합니다.
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)
에러 메시지, 기대 동작, 검증 방법을 함께 전달합니다. Claude 세션에서 아래를 입력하세요.
npm test 실행 시 다음 에러가 발생합니다. 원인을 찾고 수정해 주세요.
TypeError: Cannot read properties of undefined (reading 'plan')
at getUserPlan (src/userService.js:9)
기대 동작: profile이 없는 사용자는 "unknown"을 반환해야 합니다.
수정 후 npm test로 3개 테스트가 모두 PASS 하는지 직접 확인해 주세요.
Claude가 도구를 연쇄 호출하는 과정을 지켜보세요. 파일 수정(Edit)과 명령 실행(Bash)은 승인을 요청합니다.
Read src/userService.js # 에러 지점 확인
Grep "profile" # 영향 범위 검색
Edit src/userService.js # 옵셔널 체이닝 + 기본값 (승인 요청)
Bash npm test # 수정 검증 (승인 요청)
Test 1 ~ 3: PASS PASS PASS
변경 내용을 검토하고, 적절한 커밋 메시지로 git 커밋해 주세요
Shift + Tab으로 Plan 모드를 켭니다 (화면에 Plan mode: ON 표시). Plan 모드에서는 Claude가 실행 전에 단계별 계획, 영향 파일, 위험 요소를 먼저 제시합니다.
사용자 soft delete 기능을 추가해 주세요.
- users 데이터에 deletedAt 필드 (기본 null)
- removeUser(id): deletedAt에 현재 시각 기록
- getUser / getUserPlan은 삭제된 사용자를 제외해야 함
- test.js에 삭제 시나리오 테스트 추가
구현 전에 계획을 먼저 보여 주세요.
제시된 계획을 검토한 뒤 승인하거나, "테스트는 별도 파일로 분리해 주세요"처럼 수정 지시 후 재계획을 받아 보세요. 계획이 만족스러우면 승인해 실행합니다.
Plan 모드로 수정한 코드가 기존 테스트를 깨지 않았는지, ~/claude-lab/ch1에서
npm test를 다시 실행해 직접 확인합니다.
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
Headless 자동화
4분
-p 플래그로 대화 없이 Claude를 호출하고, JSON 출력과 쉘 파이프로
스크립트 / CI에 통합 가능한 형태를 실습합니다. 세션 밖 터미널에서 실행하세요.
claude -p "이 프로젝트의 구조와 목적을 3줄로 요약해 주세요" --output-format text
git log --oneline | claude -p "이 커밋 히스토리를 한 문단으로 요약해 주세요"
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로 비용을 절감하세요.
직전 커밋의 diff를 자동 리뷰하는 스크립트입니다. Chapter 5에서 cron / GitHub Actions 연동으로 심화합니다.
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
마무리, 학습 목표 체크리스트
Chapter 1의 학습 목표를 스스로 점검하세요. 미달성 항목은 강의 자료의 해당 Part를 다시 확인하거나 Slack 채널에 질문을 남기세요.
| 목표 | 확인 질문 | 관련 |
|---|---|---|
| Define | Copilot / Cursor와 Claude Code의 차이를 설명할 수 있는가 | 강의 Part 1 |
| Install | 본인 환경에 설치하고 claude doctor를 통과했는가 | Task 1 |
| Authenticate | 인증 방법 중 적절한 것을 선택해 /status로 확인했는가 | Task 2 |
| Use Tools | Read / Grep / Edit / Bash 도구 호출을 직접 관찰했는가 | Task 3, 5 |
| Memory | CLAUDE.md를 작성하고 규칙 반영을 확인했는가 | Task 4 |
| Plan Mode | 계획 검토 - 수정 - 승인 사이클을 경험했는가 | Task 5 |
| Headless | -p 플래그와 JSON 출력으로 자동화를 실행했는가 | Task 6 |