ํด๋กœ๋“œ ์ฝ”๋“œ(Claude Code)๋กœ ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ — ์‹ค์ „ ์›Œํฌํ”Œ๋กœ

ํด๋กœ๋“œ ์ฝ”๋“œ(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๊ฐ€ ๊ณ„ํš ๋ชจ๋“œ์—์„œ ์ด๋Ÿฐ ์„ค๊ณ„๋ฅผ ๋Œ๋ ค์ค€๋‹ค.

Claude Code Plan

์—ฌ๊ธฐ์„œ ์‚ฌ๋žŒ์ด ๊ฒ€ํ† ํ•œ๋‹ค. "์™„๋ฃŒ์ผ(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 ๋ฌธ์„œ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜๋‹ˆ ๋ˆˆ์œผ๋กœ ๋ฐ”๋กœ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋™ ์ƒ์„ฑ๋œ 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 ์ฝ”๋”ฉ ์‹œ๋Œ€์— ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌด์—‡์„ ์ค€๋น„ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ๋‹ค.


์ฐธ๊ณ  ์ถœ์ฒ˜