ποΈ Claude Code νλ€μ€ μμ§λμ΄λ§ Γ ν¨μ
컀머μ€
Claude Code λ‘ νλ€μ€ μμ§λμ΄λ§ νκ²½μ ꡬμ±νκ³ , κ·Έ μμμ μλ₯Β·μ λ° ν¨μ
μμ¬λͺ°μ νμ€ν κ°λ°νλ μ€νμ νλ‘μ νΈ
μ΄ νλ‘μ νΈλ λ κ°μ§ λͺ©νλ₯Ό λμμ μΆκ΅¬νλ€.
νλ€μ€ μμ§λμ΄λ§ μ€ν β Claude Codeμ μ λ¬Έν μμ΄μ νΈ, 컀μ€ν
컀맨λ, PostToolUse Hookμ μ‘°ν©ν΄ κ°λ° νμ§κ³Ό μλλ₯Ό μλννλ νκ²½μ ꡬμΆνλ€.
μ»€λ¨Έμ€ λλ©μΈ κ°λ° β μ νκ²½ μμμ μ€μ λμνλ ν¨μ
μμ¬λͺ° λ°±μλΒ·νλ‘ νΈμλλ₯Ό κ°λ°νλ€.
π€ νλ€μ€ μμ§λμ΄λ§ ꡬμ±
μ’
λ₯
μ΄λ¦
μν
μμ΄μ νΈ
backend-developer
Entity / Service / Repository / Controller μ κ³μΈ΅ ꡬν
μμ΄μ νΈ
frontend-developer
Next.js νμ΄μ§ / μ»΄ν¬λνΈ / API μ°λ ꡬν
μμ΄μ νΈ
unit-test-generator
ꡬν νμΌ λΆμ ν Kotest/MockK ν
μ€νΈ μλ μμ± (TDD Mode μ§μ)
컀맨λ
/dev {domain}
μ€κ³ β TDD β ꡬν β ν
μ€νΈ β μ»€λ° β λ¬Έμν 7λ¨κ³ μλ μ€ν
컀맨λ
/doc {domain}
git diff λΆμ ν λλ©μΈΒ·APIΒ·μ€ν€λ§Β·μλ¬μ½λ λ¬Έμ μλ μ΅μ ν
컀맨λ
/ship
ν
μ€νΈ β μ»€λ° λ©μμ§ μλ μμ± β μ»€λ° β νΈμ ν λ²μ μ²λ¦¬
Hook
PostToolUse
.kt μ μ₯ μ Kotlin μ»΄νμΌ, .ts/.tsx μ μ₯ μ TypeScript νμ
μ²΄ν¬ μλ μ€ν
MCP
plan-review
ꡬν μ μ€κ³ κ³ν κ²ν
μν¬νλ‘μ° (/dev 컀맨λ κΈ°μ€)
flowchart TD
User["π¨βπ» κ°λ°μ"] -->|"/dev {domain}"| Dev["/dev 컀맨λ"]
Dev --> Plan["π Step 1\nλλ©μΈ μ€κ³ λͺ
μΈ μμ±\nEntity / Service / API νμΈ ν μ¬μ©μ μΉμΈ"]
Plan -->|μΉμΈ| TDD["π§ͺ Step 2\nunit-test-generator\nTDD λͺ¨λλ‘ ν
μ€νΈ μ€μΌλ ν€ μμ±"]
TDD --> Impl["βοΈ Step 3\nbackend-developer\nꡬν μ½λ μμ±"]
Impl --> Hook{"π PostToolUse Hook\n*.kt μ μ₯λ§λ€\nKotlin μ»΄νμΌ μλ μ€ν"}
Hook -->|μ»΄νμΌ μ€ν¨| Fix["π§ μλ¬ κ°μ§ β μ¦μ μλ μμ "]
Fix --> Hook
Hook -->|μ»΄νμΌ μ±κ³΅| Test["β
Step 4\n./gradlew test\nλλ©μΈ ν
μ€νΈ μ 체 μ€ν"]
Test -->|μ€ν¨| Retry["π§ μ€ν¨ ν
μ€νΈ λΆμ ν μμ \nbackend-developer"]
Retry --> Test
Test -->|μ 체 ν΅κ³Ό| Commit["πΎ Step 5\nꡬν 컀λ°\nConventional Commits μλ μμ±"]
Commit --> Doc["π Step 6\n/doc 컀맨λ\nλλ©μΈΒ·APIΒ·μ€ν€λ§Β·μλ¬μ½λ λ¬Έμ μλ μ΅μ ν"]
Doc --> Push["π Step 7\ngit push"]
Loading
ꡬλΆ
κΈ°μ
λ°±μλ
Kotlin 2.2.21 / Spring Boot 4.0.5 / Spring Data JPA / Spring Security + JWT
λ°μ΄ν°λ² μ΄μ€
PostgreSQL 16
νλ‘ νΈμλ
Next.js 16 (App Router) / TypeScript 5 / TanStack Query 5 / Zustand 5 / Tailwind CSS 4
AI λꡬ
Claude Code (claude-sonnet-4-6)
νλ€μ€
μ λ¬Έν μμ΄μ νΈ 3μ’
/ 컀μ€ν
컀맨λ 3μ’
/ PostToolUse Hook / MCP plan-review
μ±λ₯ ν
μ€νΈ
k6
λλ©μΈ
μν
ν΅μ¬ κΈ°μ ν¬μΈνΈ
user
β
μλ£
Spring Security + JWT μΈμ¦, BCrypt λΉλ°λ²νΈ ν΄μ±
category
β
μλ£
2depth κ³μΈ΅ ꡬ쑰 (λλΆλ₯ / μλΆλ₯)
product
β
μλ£
ProductOption λ¨μ μ¬κ³ κ΄λ¦¬, Pessimistic Lock
cart
β
μλ£
μ¬κ³ νμΈ ν CartItem CRUD
order
β
μλ£
OrderItem μ€λ
μ·, μν μ μ΄, 10λΆ λ§λ£ μ€μΌμ€λ¬
payment
β
μλ£
Mock PG μ°λ, μ€ν¨ μ μ¬κ³ Β·ν¬μΈνΈ μλ 볡μ
review
β
μλ£
OrderItem λ¨μ 리뷰, 0.5 λ¨μ λ³μ , N+1 λ°°μΉ μΏΌλ¦¬
like
β
μλ£
μ’μμ ν κΈ, 볡μ μν μν λ°°μΉ μ‘°ν
coupon
β
μλ£
μ μ‘/μ λ₯ μΏ ν°, Optimistic Lock λμ λ°κΈ μ μ΄
point
β
μλ£
리뷰·ꡬ맀 μ 립, κ²°μ μ¬μ©, Optimistic Lock
settlement
β
μλ£
μΌλ³ λ§€μΆ μ§κ³ μ€μΌμ€λ¬, PENDING β CONFIRMED β PAID
μ§ν
λͺ©ν
DAU
10,000λͺ
νΌν¬ λμ μ μ
~1,000λͺ
νΌν¬ RPS
~100 req/s
API μλ΅μκ°
P95 < 200ms
κ°μ©μ±
99.9% (μ λ€μ΄νμ < 43λΆ)
μλ¬μ¨
< 0.1%
ποΈ νλ‘μ νΈ κ΅¬μ‘°
commerce/
βββ apps/
β βββ api/ # Spring Boot λ°±μλ
β β βββ src/main/kotlin/com/example/commerce/
β β βββ {domain}/ # λλ©μΈλ³ entity / repository / service / controller / dto
β β βββ common/ # BaseEntity / ApiResponse / ErrorCode / CustomException
β βββ web/ # Next.js 16 νλ‘ νΈμλ
β βββ src/app/ # App Router νμ΄μ§ λ° μ»΄ν¬λνΈ
βββ docs/
β βββ architecture/ # μμ€ν
μν€ν
μ², JWT 보μ μ€κ³
β βββ api/ # API κ³΅ν΅ κ·μΉ, μ 체 μλν¬μΈνΈ λͺ©λ‘
β βββ database/ # μν°ν° μ€ν€λ§, κ΄κ³λ
β βββ domain/ # λλ©μΈλ³ λΉμ¦λμ€ κ·μΉ λ° μ μ€μΌμ΄μ€
β βββ development/ # λ‘컬 μΈν
, μ½λ 컨벀μ
, μλ¬ μ½λ λͺ©λ‘
β βββ troubleshooting/ # κ°λ° μ€ λ°μν λ¬Έμ μν© λ° ν΄κ²° κ³Όμ
βββ tools/
β βββ k6/ # μ±λ₯ ν
μ€νΈ μλλ¦¬μ€ μ€ν¬λ¦½νΈ
β βββ plan-review/ # MCP μλ² (μ€κ³ κ³ν κ²ν )
βββ .claude/
βββ agents/ # μ λ¬Έν μμ΄μ νΈ μ μ (backend / frontend / test)
βββ commands/ # 컀μ€ν
μ¬λμ 컀맨λ (dev / doc / ship)
βββ settings.json # PostToolUse Hook, κΆν μ€μ
JDK 21+
Node.js 20+
PostgreSQL 16+
λ°μ΄ν°λ² μ΄μ€ μ€μ
CREATE DATABASE commerce ;
CREATE USER commerce WITH PASSWORD ' commerce1234' ;
GRANT ALL PRIVILEGES ON DATABASE commerce TO commerce;
λ³μ
κΈ°λ³Έκ°
μ€λͺ
JWT_SECRET
commerce-secret-key-must-be-at-least-32-characters-long
JWT μλͺ
ν€ (μ΄μ μ λ°λμ λ³κ²½)
JWT_EXPIRATION_MS
86400000
JWT λ§λ£ μκ° (ms), κΈ°λ³Έ 24μκ°
./gradlew bootRun
# API μλ²: http://localhost:8080
# Swagger UI: http://localhost:8080/swagger-ui.html
cd apps/web
npm install
npm run dev
# κ°λ° μλ²: http://localhost:3000
OpenAPI νμ
μμ± (λ°±μλ κΈ°λ μνμμ)
κ²½λ‘
λ΄μ©
docs/architecture/
μμ€ν
κ°μ, λ μ΄μ΄ μν€ν
μ², JWT 보μ μ€κ³
docs/api/
API κ³΅ν΅ κ·μΉ, μ 체 μλν¬μΈνΈ λͺ©λ‘ (Swagger 보쑰μ©)
docs/database/
μν°ν° νλ μ μ, ν
μ΄λΈ κ΄κ³λ
docs/domain/
λλ©μΈλ³ λΉμ¦λμ€ κ·μΉ λ° μ μ€μΌμ΄μ€ μμΈ
docs/development/
λ‘컬 μΈν
κ°μ΄λ, μ½λ 컨벀μ
, μλ¬ μ½λ λͺ©λ‘
docs/troubleshooting/
κ°λ° μ€ λ°μν λ¬Έμ μ ν΄κ²° κ³Όμ κΈ°λ‘
κ° λλ©μΈ ν΄λ(apps/api/src/main/kotlin/.../domain/CLAUDE.md)μλ ν΄λΉ λλ©μΈμ Entity ꡬ쑰, λΉμ¦λμ€ κ·μΉ, API μλν¬μΈνΈλ₯Ό μ 리ν λλ©μΈ νΉν λ¬Έμκ° μλ€.