ํด๋ก๋ ์ฝ๋(Claude Code) ์ค์ ์ํฌํ๋ก. AI์๊ฒ "๊ทธ๋ฅ ์ํค๋" ๊ฒ๊ณผ "์ ๋๋ก ์ํค๋" ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ค. ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ๋น ๋ฅด๊ฒ, ๊ทธ๋ฌ๋ ๋ง๊ฐ์ง์ง ์๊ฒ ๋ง๋๋ Claude Code ํ์ฉ๋ฒ์ CLAUDE.md·๊ณํ ์ฐ์ ·์๋ธ์์ด์ ํธ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๋ค.
๋ค์ด๊ฐ๋ฉฐ
์ง๋ ๊ธ์์ ๋ฐ์ด๋ธ ์ฝ๋ฉ์ ํ๊ณ๋ฅผ ๋ดค๋ค. ๋๊ตฌ๋ 70%๊น์ง ๋ฐ๋ ค๋ค์ฃผ์ง๋ง, ๋๋จธ์ง 30%๋ ๊ฒฐ๊ตญ ์ฌ๋์ด ์ฑ์์ผ ํ๋ค๊ณ . ๊ทธ๋ ๋ค๋ฉด ์ง๋ฌธ์ด ๋ฐ๋๋ค. ๊ฐ๋ฐ ์ง์์ด ์๋ ์ฌ๋์ AI ์ฝ๋ฉ ๋๊ตฌ๋ฅผ ์ด๋ป๊ฒ ์จ์ผ ๊ทธ 30%๊น์ง ๋๊ณ ๊ฐ ์ ์์๊น?
ํต์ฌ์ ๋๊ตฌ ์ ํ์ด ์๋๋ผ ์ผํ๋ ๋ฐฉ์์ด๋ค. ๊ฐ์ Claude Code๋ฅผ ์จ๋, "๊ทธ๋ฅ ์ํค๋" ์ฌ๋๊ณผ "๊ตฌ์กฐ๋ฅผ ์ก๊ณ ์ํค๋" ์ฌ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ์์ ํ ๋ค๋ฅด๋ค.
ํ ํต๊ณ๊ฐ ์ธ์์ ์ด๋ค. AI๊ฐ ๊ฐ๋ณ ๊ฒฐ์ ์ 80% ํ๋ฅ ๋ก ๋งํ๋ค๊ณ ํด๋, ๊ธฐ๋ฅ ํ๋์ ๊ฒฐ์ ์ง์ ์ด 20๊ฐ๋ฉด ์ ๋ถ ๋ง์ ํ๋ฅ ์ 0.8์ 20์ ๊ณฑ, ์ฝ 1%๋ค. ๊ณํ์ด ์ด ๋ฌธ์ ๋ฅผ ํผ๋ค.
์ด ๊ธ์์๋ ์ฌ์ด๋ ํ๋ก์ ํธ๋ฅผ ๋น ๋ฅด๋ฉด์๋ ๋ง๊ฐ์ง์ง ์๊ฒ ๋ง๋๋ Claude Code ์ค์ ์ํฌํ๋ก๋ฅผ ์ ๋ฆฌํ๋ค.
์ "๊ทธ๋ฅ ์ํค๊ธฐ"๋ ์คํจํ๋๊ฐ
Claude Code์ "ํ ์ผ ๊ด๋ฆฌ ์ฑ ๋ง๋ค์ด์ค"๋ผ๊ณ ๋์ง๋ฉด, ์ฒ์ ๋ช ๋ถ์ ๋ง๋ฒ ๊ฐ๋ค. ๊ทธ๋ฌ๋ค ์ ์ ์ด๊ธ๋๋ค. ๋ณ์๋ช ์ด ๋ค์ญ๋ ์ญํด์ง๊ณ , ์์์ ๋ง๋ ํจํด์ ์๊ณ , ์๋ฑํ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ค. ๋ฐ์ด๋ธ ์ฝ๋ฉ์์ ๋ดค๋ ๊ทธ 30%์ ๋ฒฝ์ด๋ค.
์์ธ์ ์์์ ๋งํ ํ๋ฅ ๋์ ์ด๋ค. ๊ธฐ๋ฅ ํ๋๋ ์์ญ ๊ฐ์ ์์ ๊ฒฐ์ ์ผ๋ก ์ด๋ค์ง๋ค. "DB๋ ๋ญ ์ธ์ง, ํด๋ ๊ตฌ์กฐ๋ ์ด๋ป๊ฒ ํ ์ง, ์๋ฌ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง..." ๊ฐ ๊ฒฐ์ ์์ AI๊ฐ ์กฐ๊ธ์ฉ ์ด๊ธ๋๋ฉด, ๊ทธ๊ฒ ์์ฌ ์ ์ฒด๊ฐ ๋ฌด๋์ง๋ค.
Anthropic ๋ด๋ถ ํ ์คํธ์์๋ ์๋ฌด ๊ฐ์ด๋ ์์ด ์ํจ ์์ ์ ์ฑ๊ณต๋ฅ ์ ์ฝ 33%์๋ค. ๋ค์ง์ผ๋ฉด, ๋๋จธ์ง๋ ๊ตฌ์กฐ๋ฅผ ์ก์์ค์ผ ์ฑ๊ณตํ๋ค๋ ๋ป์ด๋ค. ๊ณ ์ถ๋ ฅ ๊ฐ๋ฐ์์ ๊ทธ๋ ์ง ์์ ์ฌ๋์ ์ฐจ์ด๋ ํ๋กฌํํธ ์์จ๊ฐ ์๋๋ผ, ์คํ ์ ์ ๋ง๋ค์ด๋๋ ๊ตฌ์กฐ์ ์๋ค.
๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ์ธ ๊ฐ์ง ๋๊ตฌ๊ฐ CLAUDE.md, ๊ณํ ์ฐ์ , ์๋ธ์์ด์ ํธ๋ค.
1. CLAUDE.md — ํ๋ก์ ํธ์ ๊ท์น์ ๊ณ ์ ํ๋ค
๊ฐ์ฅ ๋จผ์ ํ ์ผ์ ํ๋ก์ ํธ ๋ฃจํธ์ CLAUDE.md ํ์ผ์ ๋๋ ๊ฒ์ด๋ค. Claude Code๊ฐ ๋งค๋ฒ ์๋์ผ๋ก ์ฝ๋ ํ์ผ๋ก, ํ๋ก์ ํธ์ ์์ ๊ท์น์ ํ๊ณณ์ ๊ณ ์ ํ๋ค. ์ฌ๋์ด ๋งค๋ฒ ์ค๋ช ํ์ง ์์๋, AI๊ฐ ์ผ๊ด๋ ๊ธฐ์ค์ผ๋ก ์ผํ๊ฒ ๋ง๋๋ ์ฅ์น๋ค.
# CLAUDE.md
## ๊ธฐ์ ์คํ
- Backend: FastAPI (Python 3.12)
- DB: PostgreSQL + SQLAlchemy
- ํจํค์ง ๊ด๋ฆฌ: uv
## ์ฝ๋ฉ ๊ท์น
- ๋ชจ๋ ํจ์์ ํ์
ํํธ๋ฅผ ๋ถ์ธ๋ค
- API ์๋ต์ Pydantic ๋ชจ๋ธ๋ก ๊ฒ์ฆํ๋ค
- ์์ธ๋ ๋๋ฉ์ธ๋ณ ์ปค์คํ
์์ธ๋ก ์ฒ๋ฆฌํ๋ค (๋น except ๊ธ์ง)
## ํด๋ ๊ตฌ์กฐ
- app/routers/ : API ์๋ํฌ์ธํธ
- app/services/ : ๋น์ฆ๋์ค ๋ก์ง
- app/models/ : DB ๋ชจ๋ธ
## ํ์ง ๋ง ๊ฒ
- ๋น๋ฐํค๋ฅผ ์ฝ๋์ ํ๋์ฝ๋ฉํ์ง ์๋๋ค (.env ์ฌ์ฉ)
- ํ
์คํธ ์์ด ๊ธฐ๋ฅ์ ์๋ฃ๋ก ํ์ํ์ง ์๋๋ค
์ด๋ ๊ฒ ๊ท์น์ ๋ฐ์๋๋ฉด, AI๊ฐ ๋งค๋ฒ ๋ค๋ฅธ ์คํ์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ ์ผ์ด ์ค์ด๋ ๋ค. ๋ฐ์ด๋ธ ์ฝ๋ฉ์์ "ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ์ผ๊ด์ฑ์ด ๊นจ์ง๋ค"๊ณ ํ๋ ๋ฌธ์ ๋ฅผ, CLAUDE.md๊ฐ ์๋น ๋ถ๋ถ ์ก์์ค๋ค. ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ์ด ํ์ผ์ ๊ฐ์น๊ฐ ์ฌ๋ผ๊ฐ๋ค.
2. ๊ณํ ์ฐ์ — ์ฝ๋๋ณด๋ค ์ค๊ณ๋ฅผ ๋จผ์
๊ฐ์ฅ ์ค์ํ ์์น์ด๋ค. ๋ฐ๋ก ์ฝ๋ฉ์ํค์ง ๋ง๊ณ , ๊ณํ๋ถํฐ ์ธ์ฐ๊ฒ ํ๋ค. ์์์ ๋ณธ "20๊ฐ ๊ฒฐ์ ์ 1% ํจ์ "์ ํธ๋ ์ง์ ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
๊ณํ ๋จ๊ณ์์ ๋ชจํธํ ๊ฒฐ์ ๋ค์ ๋ฏธ๋ฆฌ ํ์ ํด๋๋ฉด, ๊ฐ ๊ฒฐ์ ์ ์ฑ๊ณต๋ฅ ์ด 100%์ ๊ฐ๊น์์ง๋ค. ๊ทธ๋์ ๊ตฌํ ์ ์ ์ด๋ ๊ฒ ์์ํ๋ค.
๋: ํ ์ผ ๊ด๋ฆฌ ์ฑ์ ๋ง๋ค ๊ฑฐ์ผ. ๋ฐ๋ก ์ฝ๋ฉํ์ง ๋ง๊ณ ,
๋จผ์ ๊ตฌํ ๊ณํ์ ์ธ์์ค.
- ํ์ํ API ์๋ํฌ์ธํธ ๋ชฉ๋ก
- DB ์คํค๋ง
- ํด๋ ๊ตฌ์กฐ
๊ฐ ํญ๋ชฉ์ ๋ํด ์ ํ์ง๊ฐ ์์ผ๋ฉด ์ด์ ์ ํจ๊ป ์ ์ํด์ค.
Claude Code์ ๊ณํ ๋ชจ๋(Plan Mode) ๋ฅผ ์ฐ๋ฉด ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ค๊ณ๋ง ๋จผ์ ๋ฐ์ ์ ์๋ค. ์ด ๊ณํ์ ์ฌ๋์ด ๊ฒํ ํ๊ณ ์์ ํ ๋ค์ ๊ตฌํ์ ๋ค์ด๊ฐ๋ค. "์ด๋ค ๊ฒฐ์ ์ ๋ด๋ฆด์ง"๋ฅผ ์ฌ๋์ด ๋จผ์ ํ์ ํ๋ ๊ฒ์ด๋ค.
ํต์ฌ์ ์ด๊ฑฐ๋ค. ๊ณํ์ 20๊ฐ์ ๋ชจํธํ ๊ฒฐ์ ์, ์ฌ๋์ด ๊ฒํ ํ ๋ช ์ธ๋ก ๋ฐ๊พผ๋ค. ๊ฐ ๊ฒฐ์ ์ด ์ด๋ฏธ ๋ด๋ ค์ ธ ์์ผ๋ AI๋ ํค๋งค์ง ์๋๋ค.
์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๋ฉด ๋น ๋ฅธ ๊ฒ ๊ฐ์ง๋ง, ๊ฒฐ๊ตญ ์ด๊ธ๋ ์ฝ๋๋ฅผ ๊ณ ์น๋๋ผ ๋ ๋๋ ค์ง๋ค. ๊ธํ ์๋ก ๊ณํ๋ถํฐ.
3. ์์ ๋จ์๋ก ๋์ด์, ๊ฒ์ฆํ๋ฉฐ
๊ณํ์ด ์ฐ์ผ๋ฉด ํ ๋ฒ์ ๋ค ์ํค์ง ์๋๋ค. ๊ธฐ๋ฅ์ ์์ ๋จ์๋ก ์ชผ๊ฐ๊ณ , ๊ฐ ๋จ๊ณ๋ฅผ ๊ฒ์ฆํ๋ฉฐ ์งํํ๋ค.
1๋จ๊ณ: DB ๋ชจ๋ธ๊ณผ ๋ง์ด๊ทธ๋ ์ด์
๋ง ๋ง๋ค์ด์ค. (๊ฒํ )
2๋จ๊ณ: ํ ์ผ CRUD API๋ฅผ ๋ง๋ค์ด์ค. ํ
์คํธ๋ ํจ๊ป. (๊ฒํ + ํ
์คํธ ์คํ)
3๋จ๊ณ: ์ธ์ฆ์ ๋ถ์ฌ์ค. (๊ฒํ )
๊ฐ ๋จ๊ณ๋ง๋ค ์ฝ๋๋ฅผ ์ฝ๊ณ , ํ ์คํธ๋ฅผ ๋๋ ค๋ณธ๋ค. ์ฌ๊ธฐ์ ๋ฐ์ด๋ธ ์ฝ๋ฉ ๊ธ์์ ๊ฐ์กฐํ "๊ฒฐ๊ตญ ์ฝ๋๋ฅผ ์ฝ์ด์ผ ํ๋ค"๊ฐ ์ ์ฉ๋๋ค. AI๊ฐ ๋ง๋ ๊ฑธ ๊ฒ์ฆ ์์ด ์์ผ๋ฉด, 30%์ ๋ฒฝ์์ ๊ทธ๋๋ก ๋ฌด๋์ง๋ค.
ํนํ ์ค์ํ ๊ฑด ์ฆ๊ฑฐ๋ฅผ ์๊ตฌํ๋ ๊ฒ์ด๋ค. "๋์ด"๋ผ๋ ๋ง ๋์ , ์ค์ ํ ์คํธ ์ถ๋ ฅ์ด๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ๋ฌ๋ผ๊ณ ํ๋ค.
๋: ๋ฐฉ๊ธ ๋ง๋ API, ์ค์ ๋ก ๋์ํ๋์ง ํ
์คํธ๋ฅผ ์คํํด์
๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค. ํต๊ณผํ๋ค๊ณ ๋ง๋ง ํ์ง ๋ง๊ณ .
AI๊ฐ "์ฑ๊ณตํ๋ค"๊ณ ์ฃผ์ฅํ๋ ๊ฒ๊ณผ, ์ค์ ๋ก ํต๊ณผํ ํ ์คํธ ์ถ๋ ฅ์ ๋ณด๋ ๊ฒ์ ๋ค๋ฅด๋ค. ๊ฒ์ฆ ๊ฐ๋ฅํ ์ฆ๊ฑฐ๋ฅผ ์๊ตฌํ๋ ์ต๊ด์ด ํ์ง์ ์งํจ๋ค.
4. ์๋ธ์์ด์ ํธ — ์ปจํ ์คํธ๋ฅผ ๊นจ๋ํ๊ฒ
์กฐ๊ธ ๋ ๊น์ด ๋ค์ด๊ฐ๋ฉด, ์๋ธ์์ด์ ํธ(Subagent) ๊ฐ ๊ฐ๋ ฅํ ๋๊ตฌ๋ค. ๋ฉ์ธ ์์ ๊ณผ ๋ณ๊ฐ๋ก, ํน์ ์์ ์ ๋ ๋ฆฝ๋ ์ปจํ ์คํธ์์ ์ฒ๋ฆฌํ๊ฒ ํ๋ ๊ธฐ๋ฅ์ด๋ค.
์ ํ์ํ ๊น? AI์ ์ปจํ ์คํธ ์๋์ฐ๋ ๋ฌดํํ์ง ์๋ค. ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ์ํ๊ฑฐ๋ ๋ฆฌ๋ทฐํ๋ ์์ ์ผ๋ก ๋ฉ์ธ ๋ํ๋ฅผ ์ฑ์ฐ๋ฉด, ์ ์ ์ค์ํ ๊ตฌํ ๋งฅ๋ฝ์ด ๋ฐ๋ ค๋๋ค. ์๋ธ์์ด์ ํธ๋ ๊ทธ ํ์์ ๋ณ๋ ์ฐฝ์์ ํ๊ณ ์์ฝ๋ง ๊ฐ์ ธ์จ๋ค. ๋ฉ์ธ ๋ํ๋ ๊นจ๋ํ๊ฒ ์ ์ง๋๋ค.
๋ํ์ ์ธ ํ์ฉ์ ์ฝ๋ ๋ฆฌ๋ทฐ ์ ์ฉ ์์ด์ ํธ๋ค. .claude/agents/ ์ ์ ์ํด๋๋ค.
---
name: code-reviewer
description: ๊ธฐ๋ฅ ๊ตฌํ ํ ์ฝ๋ ํ์ง·๋ณด์์ ๋ฆฌ๋ทฐํ๋ค
tools: Read, Glob, Grep
---
๋น์ ์ ์๋์ด ์ฝ๋ ๋ฆฌ๋ทฐ์ด์
๋๋ค. ๋ค์์ ์ค์ ์ ์ผ๋ก ๋ด
๋๋ค.
- ์ธ์ ์
์ทจ์ฝ์ (SQL, XSS)
- ์ธ์ฆ·์ธ๊ฐ ๊ฒฐํจ
- ์ฝ๋์ ๋
ธ์ถ๋ ๋น๋ฐํค
- ๋น ์์ธ ์ฒ๋ฆฌ, ๊ฒ์ฆ ๋๋ฝ
๊ตฌ์ฒด์ ์ธ ๋ผ์ธ ๋ฒํธ์ ์์ ๋ฐฉ์์ ์ ์ํ์ธ์.
์ด๋ ๊ฒ ํ๋ฉด "์์ ํ AI"๊ฐ ์๋๋ผ "๋ค๋ฅธ AI"๊ฐ ๊ฒํ ํ๊ฒ ๋๋ค. ๋ง๋ ์ฌ๋์ด ์๊ธฐ ์ผ์ ์ฑ์ ํ์ง ์๊ฒ ํ๋ ๊ฒ์ด๋ค. ์ค๋ฌด์์ 3~5๊ฐ ์ ๋์ ๋ณ๋ ฌ ์๋ธ์์ด์ ํธ๊ฐ ์ ์ ์ ์ด๊ณ , ๊ทธ ์ด์์ ๋น์ฉ๋ง ๋๊ณ ํจ๊ณผ๋ ์ค์ด๋ ๋ค.
์๋ธ์์ด์ ํธ๋ ๊ฒฐ๊ตญ N+1 ๊ธ์ด๋ ๋ณด์ ๊ธ์์ ๋ค๋ฃฌ "๊ฒ์ฆ"์ ์๋ํํ๋ ์ฅ์น๋ค. AI์๊ฒ ๋งก๊ธฐ๋, ๋ค๋ฅธ AI๊ฐ ์ ๊ฒํ๊ฒ ํ๋ ๊ตฌ์กฐ๋ค.
์ค์ ์์ — ํ ์ผ API๋ฅผ ์ํฌํ๋ก๋๋ก ๋ง๋ค์ด๋ณด๊ธฐ
๋ง๋ก๋ง ํ๋ฉด ์๋ฟ์ง ์์ผ๋, ์ ์ํฌํ๋ก๋ฅผ ๊ทธ๋๋ก ๋ฐ๋ผ ํ ์ผ ๊ด๋ฆฌ API๋ฅผ ๋ง๋ค์ด๋ณด์. CLAUDE.md๋ ์์์ ๋ง๋ ๊ทธ๋๋ก ๋๊ณ ์์ํ๋ค.
1๋จ๊ณ: ๊ณํ๋ถํฐ ๋ฐ๋๋ค
๋: ํ ์ผ(Todo) CRUD API๋ฅผ ๋ง๋ค ๊ฑฐ์ผ. ๋ฐ๋ก ์ฝ๋ฉํ์ง ๋ง๊ณ
๊ณํ๋ถํฐ ์ธ์์ค. ์๋ํฌ์ธํธ ๋ชฉ๋ก๊ณผ DB ์คํค๋ง๋ฅผ ์ ์ํด์ค.
Claude Code๊ฐ ๊ณํ ๋ชจ๋์์ ์ด๋ฐ ์ค๊ณ๋ฅผ ๋๋ ค์ค๋ค.

์ฌ๊ธฐ์ ์ฌ๋์ด ๊ฒํ ํ๋ค. "์๋ฃ์ผ(completed_at)์ ๋นผ๊ณ , ์ฐ์ ์์(priority)๋ฅผ ์ถ๊ฐํด์ค" ๊ฐ์ ์์ ์ ๊ณํ ๋จ๊ณ์์ ๋๋ธ๋ค. ์ฝ๋๋ฅผ ๊ณ ์น๋ ๊ฒ๋ณด๋ค ๊ณํ์ ๊ณ ์น๋ ๊ฒ ํจ์ฌ ์ธ๋ค.
2๋จ๊ณ: ์์ ๋จ์๋ก ๊ตฌํ์ํจ๋ค
๊ณํ์ด ํ์ ๋๋ฉด ์ฒซ ๋จ์๋ง ์ํจ๋ค.
๋: ๊ณํ๋๋ก 1๋จ๊ณ๋ง ์งํํด. Todo ๋ชจ๋ธ๊ณผ ์คํค๋ง๋ง ๋ง๋ค์ด์ค.
Claude Code๊ฐ CLAUDE.md์ ๊ท์น(ํ์ ํํธ, Pydantic ๊ฒ์ฆ, ํด๋ ๊ตฌ์กฐ)์ ๋ฐ๋ผ ์ฝ๋๋ฅผ ๋ง๋ ๋ค.
# app/models/todo.py — Claude Code๊ฐ ์์ฑํ ์ฝ๋
from datetime import datetime
from sqlalchemy.orm import Mapped, mapped_column
from app.models.base import Base
class Todo(Base):
__tablename__ = "todos"
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str] = mapped_column(nullable=False)
priority: Mapped[int] = mapped_column(default=2) # 1=๋์ 2=๋ณดํต 3=๋ฎ์
done: Mapped[bool] = mapped_column(default=False)
created_at: Mapped[datetime] = mapped_column(default=datetime.utcnow)
# app/routers/todos.py — CRUD ์๋ํฌ์ธํธ (์ผ๋ถ)
from fastapi import APIRouter, HTTPException, status
from app.schemas.todo import TodoCreate, TodoResponse
from app.services.todo_service import TodoService
router = APIRouter(prefix="/todos", tags=["todos"])
@router.post("/", response_model=TodoResponse,
status_code=status.HTTP_201_CREATED)
async def create_todo(body: TodoCreate) -> TodoResponse:
return await TodoService.create(body)
@router.get("/{todo_id}", response_model=TodoResponse)
async def get_todo(todo_id: int) -> TodoResponse:
todo = await TodoService.get(todo_id)
if todo is None:
raise HTTPException(status_code=404, detail="ํ ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค")
return todo
๋์ฌ๊ฒจ๋ณผ ์ : CLAUDE.md์ ์ ์ด๋ ๊ท์น๋๋ก ํ์ ํํธ๊ฐ ์ ๋ถ ๋ถ์ด ์๊ณ , ์๋ต์ด Pydantic ๋ชจ๋ธ๋ก ๊ฒ์ฆ๋๊ณ , ํด๋ ๊ตฌ์กฐ(routers/services/models)๋ฅผ ์งํจ๋ค. ๊ท์น์ ๋ฐ์๋ ํจ๊ณผ๊ฐ ์ฝ๋์ ๊ทธ๋๋ก ๋๋ฌ๋๋ค.
3๋จ๊ณ: ์ฆ๊ฑฐ๋ฅผ ์๊ตฌํ๋ค
"๋ง๋ค์์ด"๋ผ๋ ๋ง๋ก ๋๋ด์ง ์๋๋ค. ํ ์คํธ๋ฅผ ์คํ์ํค๊ณ ์ถ๋ ฅ์ ํ์ธํ๋ค.
๋: pytest ์คํํด์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ค.
$ pytest tests/test_todos.py -v
tests/test_todos.py::test_create_todo PASSED [ 20%]
tests/test_todos.py::test_get_todo PASSED [ 40%]
tests/test_todos.py::test_get_todo_not_found PASSED [ 60%]
tests/test_todos.py::test_update_todo PASSED [ 80%]
tests/test_todos.py::test_delete_todo PASSED [100%]
======================== 5 passed in 0.42s ========================
5๊ฐ ํ ์คํธ๊ฐ ์ค์ ๋ก ํต๊ณผํ ์ถ๋ ฅ์ ํ์ธํ๋ค. ํนํ test_get_todo_not_found ๊ฐ์ ์คํจ ๊ฒฝ๋ก ํ ์คํธ๊ฐ ์๋์ง ๋ณธ๋ค. ๋ฐ์ด๋ธ ์ฝ๋ฉ์ด ๋์น๋ ์ฃ์ง ์ผ์ด์ค๊ฐ ๋ฐ๋ก ์ด๋ฐ ๋ถ๋ถ์ด๋ค.
4๋จ๊ณ: ๋์ ํ๋ฉด์ผ๋ก ํ์ธํ๋ค
์๋ฒ๋ฅผ ๋์ฐ๊ณ ์ค์ ์๋ต์ ํ์ธํ๋ค. FastAPI๋ Swagger ๋ฌธ์๊ฐ ์๋ ์์ฑ๋๋ ๋์ผ๋ก ๋ฐ๋ก ๊ฒ์ฆํ ์ ์๋ค.

$ curl -X POST http://localhost:8000/todos/ \
-H "Content-Type: application/json" \
-d '{"title": "๋ธ๋ก๊ทธ ๊ธ ์ฐ๊ธฐ", "priority": 1}'
{"id":1,"title":"๋ธ๋ก๊ทธ ๊ธ ์ฐ๊ธฐ","priority":1,"done":false,
"created_at":"2026-06-10T09:12:33"}
์ฌ๊ธฐ๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ์ ์ง์ ์ง๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์งง๋ค. ํ์ง๋ง ๊ณํ ๊ฒํ → ๋จ๊ณ ๊ตฌํ → ํ ์คํธ ์ฆ๊ฑฐ → ๋์ ํ์ธ์ด๋ผ๋ ๊ด๋ฌธ์ ๊ฑฐ์ณค๊ธฐ ๋๋ฌธ์, ๋น ๋ฅด๋ฉด์๋ "๊ทธ๋ด์ธํ ๊ป๋ฐ๊ธฐ"๊ฐ ์๋๋ผ ๊ฒ์ฆ๋ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์จ๋ค.
5๋จ๊ณ: ์๋ธ์์ด์ ํธ ๋ฆฌ๋ทฐ๋ก ๋ง๋ฌด๋ฆฌ
๋ง์ง๋ง์ผ๋ก ์์์ ์ ์ํ code-reviewer ์๋ธ์์ด์ ํธ์๊ฒ ์ ๊ฒ์ ๋งก๊ธด๋ค.
๋: code-reviewer ์๋ธ์์ด์ ํธ๋ก ๋ฐฉ๊ธ ๋ง๋ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํด์ค.
[code-reviewer ๊ฒฐ๊ณผ ์์ฝ]
โ ํ์
ํํธ, Pydantic ๊ฒ์ฆ ๊ท์น ์ค์
โ 404 ์ฒ๋ฆฌ ๋ฑ ์คํจ ๊ฒฝ๋ก ์กด์ฌ
โ app/routers/todos.py:21 — todo_id์ ์์ ๊ฒ์ฆ ์์
→ Path(gt=0) ์ถ๊ฐ ๊ถ์ฅ
โ ํ์ด์ง๋ค์ด์
์์ — ๋ชฉ๋ก API์ limit/offset ์ถ๊ฐ ๊ถ์ฅ
์์ ํ AI๊ฐ ์๋ ๋ณ๋ ์ปจํ ์คํธ์ AI๊ฐ ๋นํ์ ์ก์์ค๋ค. ์์ ID ๊ฒ์ฆ, ํ์ด์ง๋ค์ด์ ์ฒ๋ผ ์ฌ๋๋ ๋์น๊ธฐ ์ฌ์ด ๋ถ๋ถ์ด ๋ฆฌ๋ทฐ์์ ๊ฑธ๋ฆฐ๋ค. ์ด ์ง์ ์ ๋ค์ ๋จ๊ณ ์์ ์ผ๋ก ๋๊ธฐ๋ฉด ๋ฃจํ๊ฐ ์์ฑ๋๋ค.
์ค์ ์ํฌํ๋ก ์ ๋ฆฌ
์ง๊ธ๊น์ง๋ฅผ ํ๋์ ํ๋ฆ์ผ๋ก ๋ฌถ์ผ๋ฉด ์ด๋ ๋ค.
1. CLAUDE.md ์์ฑ ํ๋ก์ ํธ ๊ท์น์ ๊ณ ์
2. ๊ณํ ๋ชจ๋๋ก ์ค๊ณ ์ฝ๋ฉ ์ ์ ๊ฒฐ์ ์ ํ์
3. ์์ ๋จ์๋ก ๊ตฌํ ํ ๋ฒ์ ๋ค ์ํค์ง ์๊ธฐ
4. ๋จ๊ณ๋ง๋ค ๊ฒ์ฆ ํ
์คํธ ์ถ๋ ฅ ๋ฑ ์ฆ๊ฑฐ ์๊ตฌ
5. ์๋ธ์์ด์ ํธ๋ก ๋ฆฌ๋ทฐ ๋ณ๋ AI๊ฐ ๋ณด์·ํ์ง ์ ๊ฒ
6. ์ฌ๋์ด ์ต์ข
ํ์ธ ๋ฐฐํฌ ์ ์ง์ ์ฝ๊ธฐ
๋ฐ์ด๋ธ ์ฝ๋ฉ์ด "70%์ ๋ง๋ฒ"์ด๋ผ๋ฉด, ์ด ์ํฌํ๋ก๋ ๋๋จธ์ง 30%๋ฅผ ๋์ด์ฌ๋ฆฌ๋ ๊ตฌ์กฐ๋ค. ๋๊ตฌ๋ ๊ฐ์ง๋ง, ๊ตฌ์กฐ๋ฅผ ์ก๊ณ ์ฐ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ค.
๋ง์น๋ฉฐ
AI ์ฝ๋ฉ ๋๊ตฌ๋ฅผ ๋๋ฌ์ผ ํํ ์คํด๋ "์ข์ ํ๋กฌํํธ๊ฐ ์ค๋ ฅ"์ด๋ผ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ์ง์ง ์ฐจ์ด๋ ํ๋กฌํํธ๊ฐ ์๋๋ผ ์คํ ์ ์ ๋ง๋ค์ด๋๋ ๊ตฌ์กฐ์์ ๋์จ๋ค. CLAUDE.md๋ก ๊ท์น์ ๊ณ ์ ํ๊ณ , ๊ณํ์ผ๋ก ๊ฒฐ์ ์ ๋ฏธ๋ฆฌ ํ์ ํ๊ณ , ์์ ๋จ์๋ก ๊ฒ์ฆํ๋ฉฐ, ์๋ธ์์ด์ ํธ๋ก ์ ๊ฒํ๋ ๊ฒ. ํ๋ คํ์ง ์์ง๋ง, ์ด ํ๋ฒํ ๊ท์จ์ด 1%๋ฅผ 100%์ ๊ฐ๊น๊ฒ ๋ง๋ ๋ค.
๊ฒฐ๊ตญ ๋ฐ์ด๋ธ ์ฝ๋ฉ ๊ธ๊ณผ ์ด ๊ธ์ ๊ฐ์ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค. AI๊ฐ 70%๋ฅผ ํด์ฃผ๊ธฐ ๋๋ฌธ์, ๋๋จธ์ง 30%๋ฅผ ๋ค๋ฃฐ ์ค ์๋ ์ฌ๋์ ๊ฐ์น๊ฐ ์ค๋ฅธ๋ค. ๋๊ตฌ๋ฅผ ์ ์ด๋ค๋ ๊ฑด, ๋๊ตฌ์ ๋๋ ค๊ฐ์ง ์๊ณ ๊ตฌ์กฐ๋ก ๋๊ณ ๊ฐ๋ค๋ ๋ป์ด๋ค.
๋ค์ ๊ธ์์๋ ํ ๋ฐ ๋ฌผ๋ฌ์์, ์ด๋ฐ AI ์ฝ๋ฉ ์๋์ ๊ฐ๋ฐ์๊ฐ ๋ฌด์์ ์ค๋นํด์ผ ํ๋์ง๋ฅผ ์ด์ผ๊ธฐํด๋ณด๊ฒ ๋ค.
์ฐธ๊ณ ์ถ์ฒ
- Claude Code ๊ณต์ ๋ฌธ์: Best practices — https://code.claude.com/docs/en/best-practices
- Claude Code: CLAUDE.md ๋ฐ ์๋ธ์์ด์ ํธ ๊ฐ์ด๋ — https://code.claude.com/docs/en/best-practices
- Anthropic Engineering: Claude Code best practices — https://www.anthropic.com/engineering/claude-code-best-practices