Claude Code Master Guide
โ SAL Grid Edition
SAL Grid ๊ตฌ์กฐ ์๋ด
SAL Grid๋ 3์ฐจ์ ์ง์ ๊ด๋ฆฌ ์ฒด๊ณ์ ๋๋ค:
- Stage (Y์ถ): ๋์ด๋ ๋จ๊ณ โ ์์ฐจ์ (S1โS2โS3)
- Area (X์ถ): ์ง์ ์์ญ โ ๋ณ๋ ฌ์ (์์ ์์)
- Level (Z์ถ): ์ ๋ด ์์กด์ฑ ์์ โ ์์ฐจ์ (L1โL2โL3)
- Variant: ๊ฐ์ ์น์ ์ ๋ถ๋ฆฌ๋ณธ โ ์๋ฌธ์ (a, b, c)
Stage ์ ์ (3๋จ๊ณ)
| ID | ์ด๋ฆ | ์๋ฌธ | ๋์ | |
|---|---|---|---|---|
| S1 | ์ด๊ธ | Beginner | ๋น๊ฐ๋ฐ์๋ถํฐ ํต์ฌ ๊ฐ๋ ๊ณผ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ | |
| S2 | ์ค๊ธ | Intermediate | ์ค๋ฌด ํ๋ก์ ํธ ์ง์ ์ ์ฉ | |
| S3 | ๊ณ ๊ธ | Advanced | ๋ฉํฐ ์์ด์ ํธ, ์๋ํ, ๋๊ท๋ชจ ์ด์ |
Area ์ ์ (6์์ญ)
| ID | ์ด๋ฆ | ์๋ฌธ | ํต์ฌ ์ง๋ฌธ | |
|---|---|---|---|---|
| CO | ๊ฐ๋ | Concept | ์ด๊ฒ์ ๋ฌด์์ด๊ณ ์ ํ๋๊ฐ? | |
| ST | ์คํธ๋ญ์ฒ | Structure | ์ด๋ค ํ/๊ตฌ์กฐ์์ ์ผํ๋๊ฐ? | |
| WF | ์ํฌํ๋ก์ฐ | Workflow | ๊ทธ ์์์ ์ด๋ป๊ฒ ์งํํ๋๊ฐ? | |
| TO | ํ์ด์ฉ | Team Operations | ๋๊ตฌ์/๋ฌด์๊ณผ ํจ๊ป ์ผํ๋๊ฐ? | |
| QC | ํ์ง๊ด๋ฆฌ | Quality Control | ์ด๋ป๊ฒ ์์ ํ๊ณ ์ข๊ฒ ๋ง๋๋๊ฐ? | |
| CM | ๋น์ฉ๊ด๋ฆฌ | Cost Management | ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ์ฐ๋๊ฐ? |
18์ ๊ทธ๋ฆฌ๋ ๋งต
| CO๊ฐ๋ | ST์คํธ๋ญ์ฒ | WF์ํฌํ๋ก์ฐ | TOํ์ด์ฉ | QCํ์ง๊ด๋ฆฌ | CM๋น์ฉ๊ด๋ฆฌ | |
|---|---|---|---|---|---|---|
| S1์ด๊ธ | S1CO | S1ST | S1WF | S1TO | S1QC | S1CM |
| S2์ค๊ธ | S2CO | S2ST | S2WF | S2TO | S2QC | S2CM |
| S3๊ณ ๊ธ | S3CO | S3ST | S3WF | S3TO | S3QC | S3CM |
S1 ์ด๊ธ (Beginner)
S1CO โ ๊ฐ๋ (Concept)
[S1CO1(์น์ 01)] ๋ฐ์ด๋ธ ์ฝ๋ฉ์ด๋?
์ 1์ฅ: Claude Code๋ ๋ฌด์์ธ๊ฐ?
"The best way to predict the future is to invent it." - Alan Kay
์ด ์ฅ์์๋ Claude Code๊ฐ ๋ฌด์์ธ์ง, ์ ์ค์ํ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์ ์ญ์ฌ๋ ๋์์๋ ์ถ์ํ์ ๋๊ตฌ ๋ฐ์ ์ ์ญ์ฌ์ ๋๋ค. ๊ธฐ๊ณ์ด์์ ์ด์ ๋ธ๋ฆฌ๋ก, ๊ณ ๊ธ ์ธ์ด์์ ํ๋ ์์ํฌ๋ก, ๊ทธ๋ฆฌ๊ณ ์ด์ AI์ ์์ฐ์ด๋ก ๋ํํ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ์๋ก์ด ์๋์ ๋๋ฌํ์ต๋๋ค.
Claude Code๋ ์ด๋ฐ ๋ฐ์ ์ ์ฐ์ฅ์ ์์ ์๋ ํ์ ์ ์ธ ๋๊ตฌ์ ๋๋ค. ๊ธฐ์กด ๊ฐ๋ฐ ๋ฐฉ์์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ , ๋ ํจ์จ์ ์ด๊ณ ์์ฐ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
1.1 ์ ํต์ ์ธ ๊ฐ๋ฐ ๋๊ตฌ์ ํ๊ณ
ํ์ฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋์ ๊ณผ์
๋จผ์ Claude Code๊ฐ ์ ํ์ํ์ง ์ดํดํ๊ธฐ ์ํด, ํ์ฌ ๊ฐ๋ฐ์๋ค์ด ์ง๋ฉดํ ์ฃผ์ ์ด๋ ค์๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ํญ๋ฐ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๋ณต์ก์ฑ
ํ๋์ ์ํํธ์จ์ด๋ ์ ๋ง ๋ณต์กํด์ก์ต๋๋ค. ์๋ฅผ ๋ค์ด
- ํ๋ฒํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ 100๊ฐ ์ด์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํฉ๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์๋ ์์ญ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ์๋น์ค๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ํ ๋ช ์ ๊ฐ๋ฐ์๊ฐ ํ๋ก ํธ์๋, ๋ฐฑ์๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค, DevOps๊น์ง ๋ชจ๋ ์์์ผ ํ๋ ํ์คํ ์๋์ ๋๋ค.
์ด๋ฐ ๋ณต์ก์ฑ ๋๋ฌธ์ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ํ ๋๋ง๋ค ์ด๋์๋ถํฐ ์์ํด์ผ ํ ์ง ๋ง๋งํจ์ ๋๋ผ๋ ๊ฐ๋ฐ์๋ค์ด ๋ง์ต๋๋ค.
2. ๋์์์ด ๋ณํํ๋ ๊ธฐ์ ์คํ
๊ธฐ์ ๋ณํ์ ์๋๋ ์ ๋ง ๋น ๋ฆ ๋๋ค.
- JavaScript ์ํ๊ณ์์๋ ๋งค๋ ์๋ก์ด ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํฉ๋๋ค.
- AWS๋ง ํด๋ 200๊ฐ๊ฐ ๋๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
- ๊ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ง๋ค ๊ณ ์ ํ ์ฒ ํ๊ณผ ์ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ด์ ํ์ต ๋ถ๋ด์ด ํฝ๋๋ค.
๋น ๋ฅด๊ฒ ๋ณํํ๋ ๊ธฐ์ ํ๊ฒฝ์์ ์ง์์ ์ธ ํ์ต๊ณผ ์ ์์ด ํ์ํ ์ํฉ์ ๋๋ค.
3. ๋ฐ๋ณต์ ์ด๊ณ ์ง๋ฃจํ ์์ ๋ค
๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ฐฝ์์ ์ธ ๋ถ๋ถ๋ณด๋ค๋ ๋ฐ๋ณต์ ์ธ ์์ ์ ์๊ฐ์ ๋ง์ด ์ฐ๊ฒ ๋ฉ๋๋ค.
- ๋งค๋ฒ ๋๊ฐ์ ํํ์ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋ ์์ฑ
- ๋น์ท๋น์ทํ CRUD ๊ธฐ๋ฅ๋ค์ ๋ฐ๋ณต ๊ตฌํ
- ๊ท์ฐฎ์ง๋ง ๊ผญ ํ์ํ ๋ฌธ์ํ์ ์ฃผ์ ์์ฑ
- ์ค์ํ์ง๋ง ์ง๋ฃจํ ํ ์คํธ ์ฝ๋ ์์ฑ
์ด๋ฐ ์์ ๋ค์ ํ์ํ์ง๋ง, ๊ฐ๋ฐ์์ ์ฐฝ์์ ์ธ ์๋์ง๋ฅผ ์๋ชจ์ํค๋ ์์ธ์ด ๋๊ณ ์์ต๋๋ค.
IDE์ ์งํ์ ํ๊ณ
ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ(IDE)์ ์ง๋ ์์ญ ๋ ๊ฐ ๊พธ์คํ ๋ฐ์ ํด์์ต๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
timeline
title IDE ์งํ์ ์ญ์ฌ
1980๋
๋ : ํ
์คํธ ์๋ํฐ
: ๋ณ๋ ์ปดํ์ผ๋ฌ
: ๋ช
๋ นํ ๊ธฐ๋ฐ
1990๋
๋ : ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ
: ๋ฌธ๋ฒ ๊ฐ์กฐ
: ๋ด์ฅ ๋๋ฒ๊ฑฐ
: ํ๋ก์ ํธ ๊ด๋ฆฌ
2000๋
๋ : ์ธํ
๋ฆฌ์ผ์ค
: ์๋ ๋ฆฌํฉํ ๋ง
: ์ฝ๋ ์์ฑ
: ๋ฒ์ ์ ์ด ํตํฉ
2010๋
๋ : ํ๋ฌ๊ทธ์ธ ์ํ๊ณ
: ํด๋ผ์ฐ๋ ํตํฉ
: ์ค์๊ฐ ํ์
: ๋ชจ๋ฐ์ผ ์ง์
2020๋
๋ : AI ์ฝ๋ ์์ฑ
: ์ง๋ฅํ ์ ์
: ์๋ ํ
์คํธ ์์ฑ
: ์์ฐ์ด ์ธํฐํ์ด์ค
ํ์ง๋ง ์ฌ์ ํ ํ๊ณ๊ฐ ์กด์ฌํฉ๋๋ค.
- ์ปจํ ์คํธ ์ดํด ๋ถ์กฑ: IDE๋ ์ฝ๋์ ๋ฌธ๋ฒ์ ์ดํดํ์ง๋ง, ๋น์ฆ๋์ค ๋ก์ง์ด๋ ์๋๋ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
- ์๋์ ์ธ ๋๊ตฌ: ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ์์ฒญํด์ผ๋ง ๋์์ ์ ๊ณตํฉ๋๋ค.
- ๋จํธ์ ์ธ ์ง์: ์ฝ๋ ์์ฑ, ํ ์คํธ, ๋ฌธ์ํ, ๋ฐฐํฌ ๋ฑ์ด ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค.
1.2 AI ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ๋ฑ์ฅ
ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ ์
์ ํต์ ์ธ ํ์ด ํ๋ก๊ทธ๋๋ฐ
- ๋ ๋ช ์ ๊ฐ๋ฐ์๊ฐ ํ๋์ ์ปดํจํฐ ์์ ์์ ์์
- ํ ๋ช ์ ์ฝ๋๋ฅผ ์์ฑ(Driver), ๋ค๋ฅธ ํ ๋ช ์ ๊ฒํ (Navigator)
- ์ง์ ๊ณต์ ์ ์ฝ๋ ํ์ง ํฅ์์ด ๋ชฉ์
AI ํ์ด ํ๋ก๊ทธ๋๋ฐ
- ๊ฐ๋ฐ์์ AI๊ฐ ๋ํํ๋ฉฐ ํ์
- AI๋ 24์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋์ด ๊ฐ๋ฐ์ ์ญํ
- ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ๊ณผ ๋ค์ํ ๊ด์ ์ ๊ณต
AI ๊ฐ๋ฐ ๋๊ตฌ์ ์คํํธ๋ผ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph LR
subgraph matrix [" "]
direction LR
subgraph level1 ["๊ธฐ๋ณธ ์ง์"]
A1["์๋์์ฑ<br/>GitHub Copilot"]
A2["์ฝ๋ ์์ฑ<br/>Tabnine"]
end
subgraph level2 ["๊ณ ๊ธ ์ง์"]
B1["๋ํํ AI<br/>Claude Code"]
B2["์์จ ์์ด์ ํธ<br/>Future Tech"]
end
A1 -.->|์งํ| A2
A2 -.->|๋์ฝ| B1
B1 -.->|๋ฐ์ | B2
end
classDef current fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef future fill:#f8fafc,stroke:#94a3b8,stroke-width:2px,stroke-dasharray: 5 5,color:#64748b
classDef basic fill:#f8fafc,stroke:#cbd5e1,stroke-width:1px,color:#64748b
classDef highlight fill:#e2e8f0,stroke:#334155,stroke-width:3px,color:#0f172a
class B1 highlight
class B2 future
class A1,A2 basic
Claude Code๋ '๋ํํ ์ด์์คํดํธ' ์์ญ์์ ๊ฐ์ฅ ์ง๋ณด๋ ํํ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
1.3 Claude Code์ ํต์ฌ ์ฒ ํ
1. ์ ์ฐ์ฑ (Flexibility)
Claude Code๋ ํน์ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ ํ์ง ์์ต๋๋ค.
# ๋ค์ํ ์ ๊ทผ ๋ฐฉ์ ๋ชจ๋ ๊ฐ๋ฅ
claude "๋ฒ๊ทธ๋ฅผ ์ฐพ์์ ์์ ํด์ค"
claude "TDD ๋ฐฉ์์ผ๋ก ์ ๊ธฐ๋ฅ์ ๊ตฌํํด์ค"
claude "์ด ์ฝ๋๋ฅผ ํจ์ํ ์คํ์ผ๋ก ๋ฆฌํฉํ ๋งํด์ค"
claude "์ํคํ
์ฒ๋ฅผ ๋ถ์ํ๊ณ ๊ฐ์ ์ ์ ์ ์ํด์ค"
2. ํฌ๋ช ์ฑ (Transparency)
๋ชจ๋ ์์ ๊ณผ์ ์ด ํฌ๋ช ํ๊ฒ ๊ณต๊ฐ๋ฉ๋๋ค.
# Claude Code์ ์์
๊ณผ์ ์ ์ค์๊ฐ์ผ๋ก ํ์ธ
> ํ์ผ ํ์ ์ค: src/components/
> ์ฝ๋ ๋ถ์ ์ค: UserProfile.jsx
> ์์ ์ฌํญ ์ ์ฉ ์ค...
> ํ
์คํธ ์คํ ์ค...
3. ํ์ (Collaboration)
AI๋ ๋๊ตฌ๊ฐ ์๋ ๋๋ฃ์ ๋๋ค.
- ์ ์๊ณผ ๋์ ์ ์
- ์ ์ฌ์ ๋ฌธ์ ์ฌ์ ๊ฒฝ๊ณ
- ๋ ๋์ ํด๊ฒฐ์ฑ ํ ๋ก
- ํ์ต๊ณผ ์ฑ์ฅ ์ง์
4. ๋งฅ๋ฝ ์ดํด (Context Awareness)
์ ์ฒด ํ๋ก์ ํธ ๋งฅ๋ฝ์ ์ดํดํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#334155", "primaryBorderColor": "#e2e8f0"}, "mindmap": {"htmlLabels": false, "useMaxWidth": false}}}%%
mindmap
root((๋งฅ๋ฝ ์ดํด))
ํ๋ก์ ํธ ๋ถ์
ํ์ผ ๊ตฌ์กฐ ํ์
์์กด์ฑ ๋งคํ
์ํคํ
์ฒ ํจํด ์ธ์
์ปจ๋ฒค์
ํ์ต
์ฝ๋ฉ ์คํ์ผ ๋ถ์
๋ค์ด๋ฐ ๊ท์น ํ์
ํฌ๋งทํ
ํจํด ์ธ์
๋ก์ง ์ดํด
๋น์ฆ๋์ค ์๊ตฌ์ฌํญ
๋ฐ์ดํฐ ํ๋ก์ฐ
์๋ฌ ์ฒ๋ฆฌ ํจํด
์๋ฃจ์
์ ๊ณต
์ต์ ํ๋ ๊ตฌํ
๋ฒ ์คํธ ํ๋ํฐ์ค ์ ์ฉ
ํ์ฅ ๊ฐ๋ฅํ ์ค๊ณ
1.4 ๋ค๋ฅธ AI ์ฝ๋ฉ ๋๊ตฌ์์ ์ฐจ๋ณ์
GitHub Copilot๊ณผ์ ๋น๊ต
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph LR
subgraph comparison [" "]
direction TB
subgraph copilot ["GitHub Copilot"]
direction TB
A1["์ธ๋ผ์ธ ์๋์์ฑ<br/>๊ฐ๋จํ ์ ์"]
A2["ํ์ฌ ํ์ผ ์ค์ฌ<br/>์ ํ์ ์ปจํ
์คํธ"]
A3["์ฝ๋ ์์ฑ<br/>๋จ์ผ ๊ธฐ๋ฅ"]
A4["์ ํ์ ์ค์ <br/>๊ธฐ๋ณธ ์ต์
๋ง"]
A5["๋ฎ์ ํ์ต ๊ณก์ <br/>์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅ"]
end
subgraph claude ["Claude Code"]
direction TB
B1["๋ํํ ํ์
<br/>์์ฐ์ด ์ธํฐํ์ด์ค"]
B2["์ ์ฒด ํ๋ก์ ํธ<br/>์์ ํ ์ปจํ
์คํธ"]
B3["์ ์ฒด ๋ผ์ดํ์ฌ์ดํด<br/>์ค๊ณ๋ถํฐ ๋ฐฐํฌ๊น์ง"]
B4["์์ ์ปค์คํฐ๋ง์ด์ง<br/>CLAUDE.md ํ์ฉ"]
B5["์ ์ํ ํ์ต<br/>์ ์ง์ ๋ง์คํฐ๋ฆฌ"]
end
A1 -.->|vs| B1
A2 -.->|vs| B2
A3 -.->|vs| B3
A4 -.->|vs| B4
A5 -.->|vs| B5
end
classDef copilotStyle fill:#f1f5f9,stroke:#64748b,stroke-width:1px,color:#475569
classDef claudeStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
class A1,A2,A3,A4,A5 copilotStyle
class B1,B2,B3,B4,B5 claudeStyle
| ํน์ง | GitHub Copilot | Claude Code | |
|---|---|---|---|
| ์๋ ๋ฐฉ์ | ์ธ๋ผ์ธ ์๋์์ฑ | ๋ํํ ์ํธ์์ฉ | |
| ์ปจํ ์คํธ | ํ์ฌ ํ์ผ ์ค์ฌ | ์ ์ฒด ํ๋ก์ ํธ | |
| ์์ ๋ฒ์ | ์ฝ๋ ์์ฑ | ์ค๊ณ, ๊ตฌํ, ํ ์คํธ, ๋ฐฐํฌ | |
| ์ปค์คํฐ๋ง์ด์ง | ์ ํ์ | ์์ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ | |
| ํ์ต ๊ณก์ | ๋ฎ์ | ์ค๊ฐ |
ChatGPT์์ ๋น๊ต
| ํน์ง | ChatGPT | Claude Code | |
|---|---|---|---|
| ํ์ผ ์์คํ ์ ๊ทผ | ๋ถ๊ฐ๋ฅ | ์์ ํ ์ ๊ทผ | |
| ์ฝ๋ ์คํ | ์ ํ์ | ์ง์ ์คํ ๊ฐ๋ฅ | |
| ์ง์์ฑ | ๋ํ๋ณ ๋ฆฌ์ | ํ๋ก์ ํธ ์ปจํ ์คํธ ์ ์ง | |
| ๋๊ตฌ ํตํฉ | ์์ | Git, ํ ์คํธ, ๋น๋ ๋๊ตฌ ๋ฑ |
Claude Code๋ง์ ๋ ํนํ ๊ธฐ๋ฅ
1. CLAUDE.md๋ฅผ ํตํ ํ๋ก์ ํธ ๋ง์ถคํ
# ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๊ท์น
- ๋ชจ๋ ์ปดํฌ๋ํธ๋ ํจ์ํ์ผ๋ก ์์ฑ
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 80% ์ด์ ์ ์ง
- ์ปค๋ฐ ๋ฉ์์ง๋ conventional commits ๋ฐ๋ฅด๊ธฐ
2. ๋ฉํฐ๋ชจ๋ฌ ์ ๋ ฅ ์ง์
- ๋์์ธ ์คํฌ๋ฆฐ์ท์ ๋ณด๊ณ UI ๊ตฌํ
- ๋ค์ด์ด๊ทธ๋จ์ ์ฝ๋๋ก ๋ณํ
- ์๋ฌ ์คํฌ๋ฆฐ์ท์ผ๋ก ๋๋ฒ๊น
3. ์ง์ ํ ํ์คํ ์ง์
# ํ๋ก ํธ์๋๋ถํฐ ๋ฐฐํฌ๊น์ง ํ ๋ฒ์
claude "์ฌ์ฉ์ ์ธ์ฆ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ค. React ํ๋ก ํธ์๋, Node.js ๋ฐฑ์๋, PostgreSQL ๋ฐ์ดํฐ๋ฒ ์ด์ค, Docker ์ปจํ
์ด๋ํ๊น์ง"
์ค์ ์ฌ๋ก: 30๋ถ ๋ง์ ๋ง๋ ์ค์๊ฐ ์ฑํ ์ฑ
ํ ์คํํธ์ ๊ฐ๋ฐ์์ ๊ฒฝํ๋ด
"์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ํด์ผ ํ๋๋ฐ, ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ์ด ํต์ฌ์ด์์ต๋๋ค.
๋ณดํต์ด๋ผ๋ฉด ์ํคํ ์ฒ ์ค๊ณ๋ถํฐ ์์ํด์ ์ผ์ฃผ์ผ์ ๊ฑธ๋ ธ์ ํ ๋ฐ,
Claude Code์ ํจ๊ป 30๋ถ ๋ง์ ์๋ํ๋ ํ๋กํ ํ์ ์ ๋ง๋ค์์ต๋๋ค.
๋ ๋๋ผ์ด ๊ฑด, ์ฝ๋ ํ์ง์ด ์ ๊ฐ ์ง์ ์์ฑํ ๊ฒ๋ณด๋ค ๋์๋ค๋ ์ ์ ๋๋ค.
์๋ฌ ํธ๋ค๋ง, ๋ณด์, ํ์ฅ์ฑ๊น์ง ๊ณ ๋ ค๋์ด ์์์ฃ ."
์ด๊ฒ์ด ๊ฐ๋ฅํ๋ ์ด์
- Claude Code๊ฐ ์ค์๊ฐ ํต์ ์ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์๊ณ ์์
- ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์๋์ผ๋ก ํ์ ํ๊ณ ์ ์ ํ ํตํฉ
- ํ ์คํธ ์ฝ๋๊น์ง ํจ๊ป ์์ฑ
- ์ ์ฌ์ ๋ฌธ์ ์ ์ ์ฌ์ ์ ์ง์ ํ๊ณ ํด๊ฒฐ
๋ง์น๋ฉฐ
Claude Code๋ ๋จ์ํ ๋๊ตฌ๊ฐ ์๋๋๋ค. ์ด๋ ๊ฐ๋ฐ ๋ฐฉ์์ ํจ๋ฌ๋ค์ ์ ํ์ ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
flowchart LR
subgraph before ["์ ํต์ ๊ฐ๋ฐ ๋ฐฉ์"]
direction TB
A1["๊ฐ๋ฐ์๊ฐ ๋ชจ๋ ์ธ๋ถ์ฌํญ์<br/>์ง์ ๊ตฌํ"]
A2["๋ฐ๋ณต์ ์ธ ์์
์<br/>์๊ฐ ์๋ชจ"]
A3["์๋ก์ด ๊ธฐ์ ํ์ต์<br/>๋์ ์ง์
์ฅ๋ฒฝ"]
A4["๋๋ฆฐ ํ๋กํ ํ์ดํ<br/>์ฌ์ดํด"]
end
subgraph transition ["์ ํ์ "]
T["Claude Code<br/>๋์
"]
end
subgraph after ["ํ์ ์ ๊ฐ๋ฐ ๋ฌธํ"]
direction TB
B1["๊ฐ๋ฐ์๋ '๋ฌด์์'<br/>๋ง๋ค์ง์ ์ง์ค"]
B2["AI๊ฐ '์ด๋ป๊ฒ'<br/>๊ตฌํํ ์ง๋ฅผ ๋์"]
B3["๋น ๋ฅธ ์คํ๊ณผ<br/>๊ฒ์ฆ ๊ฐ๋ฅ"]
B4["์ง์์ ์ธ ํ์ต๊ณผ<br/>์ฑ์ฅ"]
end
before --> transition
transition --> after
A1 -.->|๋ณํ| B1
A2 -.->|์๋ํ| B2
A3 -.->|๊ฐ์ํ| B3
A4 -.->|์ต์ ํ| B4
classDef beforeStyle fill:#f8fafc,stroke:#64748b,stroke-width:1px,color:#64748b
classDef afterStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef transitionStyle fill:#f1f5f9,stroke:#475569,stroke-width:3px,color:#0f172a
class A1,A2,A3,A4 beforeStyle
class B1,B2,B3,B4 afterStyle
class T transitionStyle
๋ค์ ์ฅ์์๋ Claude Code๋ฅผ ์ค์ ๋ก ์ค์นํ๊ณ ์ฒซ ๋ฒ์งธ ๋ช ๋ น์ ์คํํด๋ณด๊ฒ ์ต๋๋ค. AI์ ํจ๊ปํ๋ ๊ฐ๋ฐ์ ์๋ก์ด ์ฌ์ ์ ์์ํด๋ณด๊ฒ ์ต๋๋ค.
[S1CO2(์น์ 25a)] ๋น๊ฐ๋ฐ์ ๊ฐ์ด๋ โ ๊ฐ๋ ํธ
ํ์ต ๋ชฉํ
์ด ์ฅ์ ์๋ฃํ๋ฉด ๋ค์์ ํ ์ ์์ต๋๋ค.
- ๋ค์ํ ์ง๋ฌด์ ํ์์ Claude Code๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ ์ ์์ต๋๋ค.
- ์์ ์ ์กฐ์ง ์ํฉ์ ๋ง๋ ํ์ฉ ์ ๋ต์ ์๋ฆฝํ ์ ์์ต๋๋ค.
- ํ ๊ฐ ํ์ ๊ณผ ์ง์ ๊ณต์ ๋ฅผ ํตํ ์๋์ง ํจ๊ณผ๋ฅผ ์ฐฝ์ถํ ์ ์์ต๋๋ค.
- ๋น๊ฐ๋ฐ์๋ Claude Code๋ฅผ ํ์ฉํ์ฌ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ฐ์
Claude Code๋ ๋จ์ํ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ๋์ด์ ์กฐ์ง ์ ๋ฐ์ ๋ฌธ์ ํด๊ฒฐ๊ณผ ์ ๋ฌด ์๋ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฉํฐ-์ญํ ์์ด์ ํธ์ ๋๋ค. Anthropic์ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํตํด ๊ฐ ํ์ด ์ด๋ป๊ฒ ์ ๋ฌด ํน์ฑ์ ๋ง์ถฐ Claude Code๋ฅผ ์ต์ ํํ์ฌ ํ์ฉํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ด ์ฅ์์๋ ๊ฐ๋ฐํ๋ฟ๋ง ์๋๋ผ ๋ฐ์ดํฐ ๊ณผํ, ๋ง์ผํ , ๋์์ธ, ๋ฒ๋ฌด ๋ฑ ๋ค์ํ ๋ถ์์ ์ค์ ํ์ฉ ์ฌ๋ก๋ฅผ ๋ถ์ํ์ฌ, ์ฌ๋ฌ๋ถ์ ์กฐ์ง์์ Claude Code๋ฅผ ๋์ ํ๊ณ ํ์ฐํ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
13.10 ๋ฒ๋ฌด ํ - ๋น๊ฐ๋ฐ์์ ๋๊ตฌ ๊ฐ๋ฐ
๋ฒ๋ฌดํ์ ๊ฐ๋ฐ ๊ฒฝํ์ด ์ ํ ์์์๋ ๋ถ๊ตฌํ๊ณ Claude Code๋ฅผ ํตํด ๋ง์ถคํ ๋ฒ๋ฌด ๋๊ตฌ๋ฅผ ์ง์ ๊ฐ๋ฐํ์ฌ ์ ๋ฌด ํจ์จ์ฑ์ ํ์ ์ ์ผ๋ก ๊ฐ์ ํ์ต๋๋ค.
๋ฒ๋ฌด ํนํ ๋๊ตฌ ๊ฐ๋ฐ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
flowchart TD
A[๋ฒ๋ฌดํ ๋์งํธ ํ์ ] --> B[๊ฐ์ธ์ฉ ์ ๊ทผ์ฑ ๋๊ตฌ]
A --> C[์ ํ ํธ๋ฆฌ ์๋ฎฌ๋ ์ด์
]
A --> D[G Suite ์๋ํ]
subgraph personal [๊ฐ์ธ์ฉ ๋๊ตฌ]
B --> E[๋ฒ๋ฅ ๋ฌธ์ ์์ฑ ์ฑ]
E --> F[์๋ ์์ฑ ๊ธฐ๋ฅ]
E --> G[ํ
ํ๋ฆฟ ์ ์]
E --> H[ํ๋ก ์ธ์ฉ ํฌ๋งทํ
]
E --> I[๋ฒ์ ๊ด๋ฆฌ]
end
subgraph routing [๋ผ์ฐํ
์์คํ
]
C --> J[๋ฌธ์ ์ ํ ๋ถ๋ฅ]
C --> K[๊ธด๊ธ๋ ํ๊ฐ]
C --> L[์ ๋ฌธ๋ถ์ผ ๋งค์นญ]
J --> M[๊ณ์ฝ/์ง์ ์ฌ์ฐ/๋
ธ๋/๊ท์ ์ค์]
K --> N[์ฆ์/๋น์ผ/์ฃผ๊ฐ]
L --> O[๋ณํธ์ฌ ์๋ ํ ๋น]
end
subgraph automation [์ํฌํ๋ก์ฐ ์๋ํ]
D --> P[Google Sheets ์ฐ๋]
D --> Q[Google Drive ํตํฉ]
D --> R[Gmail ์๋ํ]
P --> S[๋ฆฌ๋ทฐ ์์ฒญ ๋ฑ๋ก]
P --> T[์งํ ์ํ ์ถ์ ]
Q --> U[๋ฌธ์ ๋ฒ์ ๊ด๋ฆฌ]
Q --> V[์น์ธ ์ํฌํ๋ก์ฐ]
R --> W[์๋ ์๋ฆผ]
R --> X[๋ฆฌํฌํธ ๋ฐ์ก]
end
classDef toolStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef processStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef featureStyle fill:#ecfdf5,stroke:#059669,stroke-width:2px,color:#064e3b
class A,B,C,D toolStyle
class E,J,K,L,P,Q,R processStyle
class F,G,H,I,M,N,O,S,T,U,V,W,X featureStyle
1. ๊ฐ์ธ์ฉ ์ ๊ทผ์ฑ ๋๊ตฌ
# 1์๊ฐ ๋ง์ ํ๋กํ ํ์
์์ฑ
claude "๋ฒ๋ฅ ๋ฌธ์ ์์ฑ์ ๋์์ฃผ๋ ์์ธก ํ
์คํธ ์ฑ์ ๋ง๋ค์ด์ค
๊ธฐ๋ฅ
- ๋ฒ๋ฅ ์ฉ์ด ์๋ ์์ฑ
- ๊ณ์ฝ์ ์กฐํญ ํ
ํ๋ฆฟ ์ ์
- ํ๋ก ์ธ์ฉ ์๋ ํฌ๋งทํ
- ๋ฌธ์ ๋ฒ์ ๊ด๋ฆฌ
- ํ์
๋๊ธ ๊ธฐ๋ฅ
๊ธฐ์ ์คํ
- ๊ฐ๋จํ ์น ์ฑ (HTML, CSS, JavaScript)
- ๋ก์ปฌ ์ ์ฅ์ ํ์ฉ
- ์คํ๋ผ์ธ์์๋ ๋์
1์๊ฐ ๋ด์ ๊ธฐ๋ณธ ๋์ํ๋ ํ๋กํ ํ์
์ผ๋ก ๋ง๋ค์ด์ค"
2. ์ ํ ํธ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์์คํ
# ๋ด๋น ๋ณํธ์ฌ ๋งค์นญ ์๋ํ
claude "๋ฒ๋ฌด ๋ฌธ์๋ฅผ ์ ์ ํ ๋ด๋น ๋ณํธ์ฌ์๊ฒ ๋ผ์ฐํ
ํ๋ ์์คํ
์ ๋ง๋ค์ด์ค
๋ผ์ฐํ
๋ก์ง
- ๋ฌธ์ ์ ํ ๋ถ๋ฅ (๊ณ์ฝ, ์ง์ ์ฌ์ฐ, ๋
ธ๋, ๊ท์ ์ค์)
- ๊ธด๊ธ๋ ํ๊ฐ (์ฆ์, ๋น์ผ, ์ฃผ๊ฐ)
- ๋ณํธ์ฌ ์ ๋ฌธ๋ถ์ผ ๋งค์นญ
- ์
๋ฌด๋ ๊ธฐ๋ฐ ํ ๋น
์ธํฐํ์ด์ค
- ๊ฐ๋จํ ์ง๋ฌธ ํธ๋ฆฌ
- ๋๋๊ทธ ์ค ๋๋กญ ๋ฌธ์ ์
๋ก๋
- ์๋ ์ด๋ฉ์ผ ์๋ฆผ
- ์งํ ์ํ ์ถ์ "
3. G Suite ์๋ํ ๋๊ตฌ
# ๋ฒ๋ฌด ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ์๋ํ
claude "Google Workspace๋ฅผ ํ์ฉํ ๋ฒ๋ฌด ๋ฆฌ๋ทฐ ์ถ์ ์์คํ
์ ๋ง๋ค์ด์ค
Google Sheets ์ฐ๋
- ๋ฆฌ๋ทฐ ์์ฒญ ์๋ ๋ฑ๋ก
- ์งํ ์ํ ์ค์๊ฐ ์
๋ฐ์ดํธ
- ๋ด๋น์๋ณ ์
๋ฌด๋ ์๊ฐํ
- ๋ง๊ฐ์ผ ์๋ฆผ ์๋ํ
Google Drive ํตํฉ
- ๋ฌธ์ ๋ฒ์ ๊ด๋ฆฌ
- ๋๊ธ ๊ธฐ๋ฐ ํผ๋๋ฐฑ ์์ง
- ์ต์ข
์น์ธ ์ํฌํ๋ก์ฐ
- ์์นด์ด๋ธ ์๋ํ
Gmail ์๋ํ
- ๋ฆฌ๋ทฐ ์๋ฃ ์ ์๋ ์๋ฆผ
- ์ง์ฐ ์ ์์ค์ปฌ๋ ์ด์
- ์ฃผ๊ฐ/์๊ฐ ๋ฆฌํฌํธ ์๋ ๋ฐ์ก"
์๊ฐ ์ค์ฌ ํ๋กํ ํ์ดํ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
flowchart LR
A[์๊ทธ๋ฆผ ์ค์ผ์น] --> B[์๊ตฌ์ฌํญ ๋ถ์]
B --> C[๋ ์ด์์ ๊ตฌ์กฐ ์ค๊ณ]
C --> D[๊ธฐ๋ฅ ๋์ ๊ตฌํ]
D --> E[์คํ์ผ๋ง ์ ์ฉ]
E --> F[์ต์ข
๊ฒํ ]
subgraph feedback [ํผ๋๋ฐฑ ๋ฃจํ]
G[ํ์ ํ
์คํธ] --> H[ํผ๋๋ฐฑ ์์ง]
H --> I[๊ฐ์ ์ฌํญ ์๋ณ]
I --> J[๋ฐ๋ณต์ ๊ฐ์ ]
J --> G
end
F --> G
J --> K[์์ฑ๋ ์น์ฑ]
subgraph requirements [ํต์ฌ ์๊ตฌ์ฌํญ]
L[์ค์ ๋์ํ๋ ๋ฒํผ]
M[๋ฐ์ดํฐ ์
๋ ฅ/์ ์ฅ]
N[๋ชจ๋ฐ์ผ ์นํ์ ๋ ์ด์์]
O[๋ฒ๋ฌดํ ๋ธ๋๋ฉ]
end
C --> requirements
classDef processStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef feedbackStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef requirementStyle fill:#ecfdf5,stroke:#059669,stroke-width:2px,color:#064e3b
class A,B,C,D,E,F,K processStyle
class G,H,I,J feedbackStyle
class L,M,N,O requirementStyle
1. ์์ด์ดํ๋ ์ โ ์๋ํ๋ ์ฑ
# ์ค์ผ์น์์ ์ฑ์ผ๋ก
claude "์ด ์๊ทธ๋ฆผ ์์ด์ดํ๋ ์์ ๋ณด๊ณ ์๋ํ๋ ์น์ฑ์ ๋ง๋ค์ด์ค
[์๊ทธ๋ฆผ ์ค์ผ์น ์ฒจ๋ถ]
์๊ตฌ์ฌํญ
- ๋ชจ๋ ๋ฒํผ์ด ์ค์ ๋ก ๋์
- ๋ฐ์ดํฐ ์
๋ ฅ๊ณผ ์ ์ฅ ๊ธฐ๋ฅ
- ๋ชจ๋ฐ์ผ ์นํ์ ๋ ์ด์์
- ๋ฒ๋ฌดํ ๋ธ๋๋ฉ ์ ์ฉ
๋จ๊ณ๋ณ ํ์ธ
1. ๋ ์ด์์ ๊ตฌ์กฐ ํ์ธ
2. ๊ธฐ๋ฅ ๋์ ํ
์คํธ
3. ์คํ์ผ๋ง ๊ฐ์
4. ์ต์ข
๊ฒํ "
2. ๋ฐ๋ณต์ ๊ฐ์ ํ๋ก์ธ์ค
# ์ฌ์ฉ์ ํผ๋๋ฐฑ ๊ธฐ๋ฐ ๊ฐ์
claude "ํ์๋ค์ด ์ฌ์ฉํด๋ณด๊ณ ๋ค์ ํผ๋๋ฐฑ์ ์ฃผ์์ด
- ๋ฒํผ์ด ๋๋ฌด ์์์ ๋ชจ๋ฐ์ผ์์ ํด๋ฆญํ๊ธฐ ์ด๋ ค์
- ๋ฌธ์ ์
๋ก๋ ํ ์งํ์ํฉ์ ์ ์ ์์
- ์ด๋ฉ์ผ ์๋ฆผ์ด ๋๋ฌด ์์ฃผ ์ด
์ด ํผ๋๋ฐฑ์ ๋ฐ์ํด์ ๊ฐ์ ํด์ค"
๋ฒ๋ฌด ์ํฌํ๋ก์ฐ ๋์งํธํ
1. ๊ณ์ฝ์ ๊ฒํ ์๋ํ
# AI ๊ธฐ๋ฐ ๊ณ์ฝ์ ๋ถ์ ๋๊ตฌ
claude "๊ณ์ฝ์ ์ด์์ ์
๋ก๋ํ๋ฉด ์๋์ผ๋ก ๊ฒํ ํ๋ ๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ค
๊ฒํ ํญ๋ชฉ
- ํ์ค ์กฐํญ ๋๋ฝ ์ฌ๋ถ
- ๋ฆฌ์คํฌ ์กฐํญ ์๋ณ
- ๊ธ์ก/๋ ์ง ์ ํฉ์ฑ ํ์ธ
- ๋ฒ์ ์๊ตฌ์ฌํญ ์ค์ ์ฒดํฌ
๊ฒฐ๊ณผ ์ถ๋ ฅ
- ์ํ๋๋ณ ์ด์ ๋ถ๋ฅ
- ์์ ์ ์์ฌํญ
- ์ ์ฌ ๊ณ์ฝ์ ์ฐธ์กฐ
- ๊ฒํ ์ฐ์ ์์ ์ ์"
2. ๊ท์ ์ค์ ๋ชจ๋ํฐ๋ง
# ์ปดํ๋ผ์ด์ธ์ค ๋์๋ณด๋
claude "ํ์ฌ์ ๊ท์ ์ค์ ํํฉ์ ๋ชจ๋ํฐ๋งํ๋ ๋์๋ณด๋๋ฅผ ๋ง๋ค์ด์ค
์ถ์ ์์ญ
- ๋ฐ์ดํฐ ๋ณดํธ (GDPR, CCPA)
- ๊ธ์ต ๊ท์ (SOX, PCI-DSS)
- ๋
ธ๋๋ฒ ์ค์
- ํ๊ฒฝ ๊ท์
์๋ํ ๊ธฐ๋ฅ
- ๊ท์ ๋ณ๊ฒฝ์ฌํญ ๋ชจ๋ํฐ๋ง
- ์ค์ ์ํ ์ค์๊ฐ ์ฒดํฌ
- ๋ฆฌ์คํฌ ๋ ๋ฒจ ์๊ฐํ
- ์ก์
์์ดํ
์๋ ์์ฑ"
ํ ์ฑ๊ณผ
- ๋์งํธ ์ญ๋: ๋น๊ฐ๋ฐ์๋ ์ ๋ฌด ํนํ ๋๊ตฌ ์ง์ ๊ฐ๋ฐ ๊ฐ๋ฅ์ฑ ์ ์ฆ
- ์ ๋ฌด ํจ์จ: ๋ฐ๋ณต ์ ๋ฌด ์๋ํ๋ก ๊ณ ๋ถ๊ฐ๊ฐ์น ์ ๋ฌด์ ์ง์ค
- ํ์ ๋ฌธํ: ํ๋กํ ํ์ดํ์ ํตํ ์์ด๋์ด ๊ฒ์ฆ๊ณผ ๊ณต์ ํ์ฑํ
๋ฒ๋ฌด ํ ์ฑ๊ณต ๋ ธํ์ฐ
# Claude.ai์์ ์ค๊ณ ํ Claude Code๋ก ๊ตฌํ
# 1๋จ๊ณ: Claude.ai์์ ์์ด๋์ด ๊ตฌ์ฒดํ
"๋ฒ๋ฌด ์
๋ฌด์์ ๊ฐ์ฅ ๋ฐ๋ณต์ ์ด๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์์
์ด ๋ญ์ง
๋ถ์ํด์ฃผ๊ณ , ์๋ํ ๊ฐ๋ฅํ ๋ถ๋ถ์ ์ฐพ์์ค"
# 2๋จ๊ณ: Claude Code์์ ๊ตฌํ
"์์ ๋
ผ์ํ ๊ณ์ฝ์ ๊ฒํ ํ๋ก์ธ์ค๋ฅผ ์ค์ ๋ก ๊ตฌํํด์ค"
# ๋จ๊ณ๋ณ ํผ๋๋ฐฑ ๋ฃจํ
claude "์ด ๊ธฐ๋ฅ์ด ์ ๋๋ก ๋์ํ๋์ง ์คํฌ๋ฆฐ์ท์ผ๋ก ํ์ธํด์ค๊ฒ.
๋ค์์ ์ถ๊ฐํ ๊ธฐ๋ฅ์ ๋ญ๊ฐ ์ข์๊น?"
# ์์ฑ๋๋ณด๋ค ๊ณต์ ์ฐ์
claude "์์ง ์๋ฒฝํ์ง ์์ง๋ง ํ์๋ค๊ณผ ๊ณต์ ํ ์ ์๋
๋ฐ๋ชจ ๋ฒ์ ์ ๋ง๋ค์ด์ค. ํผ๋๋ฐฑ์ ๋ฐ์์ ๊ฐ์ ํ๊ณ ์ถ์ด"
๋ง์น๋ฉฐ - ์กฐ์ง ํ์ ์ ์๋ก์ด ํจ๋ฌ๋ค์
Anthropic์ ๋ค์ํ ํ ์ฌ๋ก๋ฅผ ํตํด Claude Code๊ฐ ๋จ์ํ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ๋์ด์ ์กฐ์ง ์ ๋ฐ์ ์ ๋ฌด ๋ฐฉ์์ ํ์ ํ๋ ํ๋ซํผ์์ ํ์ธํ ์ ์์ต๋๋ค. ๊ฐ ํ์ด ์์ ๋ค์ ์ ๋ฌด ํน์ฑ์ ๋ง๊ฒ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ๋ฌ์ฑํ ์ฑ๊ณผ๋ค์ Claude Code์ ๋ฌดํํ ๊ฐ๋ฅ์ฑ์ ๋ณด์ฌ์ค๋๋ค.
ํต์ฌ ์ธ์ฌ์ดํธ
1. ๋๋ฉ์ธ ์ ๋ฌธ์ฑ + AI ๋๊ตฌ = ํ์
- ๊ฐ ํ์ ๋๋ฉ์ธ ์ง์๊ณผ Claude Code์ ๊ธฐ์ ์ ๋ฅ๋ ฅ์ด ๊ฒฐํฉ๋ ๋ ์ต๊ณ ์ ์๋์ง ์ฐฝ์ถ
- ๋น๊ฐ๋ฐ์๋ ์์ ์ ์ ๋ฌธ ์์ญ์์ ๋ง์ถคํ ๋๊ตฌ ๊ฐ๋ฐ ๊ฐ๋ฅ
2. ์ ์ง์ ๋์ ๊ณผ ๋ฌธํ ๋ณํ
- ์์ ์ฑ๊ณต๋ถํฐ ์์ํ์ฌ ์ ์ง์ ์ผ๋ก ํ์ฐํ๋ ์ ๋ต์ด ํจ๊ณผ์
- ๋๊ตฌ ๋์ ์ด ์๋ ์ ๋ฌด ๋ฌธํ์ ๋ณํ๋ก ์ ๊ทผํด์ผ ์ง์ ๊ฐ๋ฅ
3. ํ์ ๊ณผ ์ง์ ๊ณต์ ์ ์ค์์ฑ
- ๊ฐ์ธ์ ๊ฒฝํ์ ํ์ ์์ฐ์ผ๋ก ๋ง๋๋ ์ฒด๊ณ์ ์ธ ์ง์ ๊ด๋ฆฌ
- CLAUDE.md์ ๋ฉ๋ชจ๋ฆฌ ์์คํ ์ ํตํ ์กฐ์ง ์ง์์ ์ถ์
[S1CO3(์น์ 02)] 6๋ ํต์ฌ ์ฒ ํ
2.1 Claude Code์ 6๋ ํต์ฌ ์ฒ ํ
Claude Code๋ 6๊ฐ์ง ํต์ฌ ์ฒ ํ ์์ ์ค๊ณ๋์์ต๋๋ค. ์ด ์ฒ ํ๋ค์ ๋จ์ํ ์ฝ๋ ์์ฑ ๋๊ตฌ๋ฅผ ๋์ด, AI์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ผ๋ก ํ์ ํ๋ ํ๊ฒฝ์ ๋ง๋ค๊ธฐ ์ํ ๊ธฐ๋ฐ์ ๋๋ค.
1. ์ ์ฐ์ฑ (Flexibility)
"์ ํด์ง ๋ฐฉ๋ฒ์ ์๋ค โ ๊ฐ๋ฐ์์ ์ํฌํ๋ก์ฐ์ AI๊ฐ ๋ง์ถ๋ค"
์ด๋ค ์ธ์ด, ํ๋ ์์ํฌ, ํ๋ก์ ํธ ๊ตฌ์กฐ๋ Claude Code๊ฐ ์ ์ํฉ๋๋ค. ๊ฐ๋ฐ์๊ฐ AI์ ๋ง์ถ๋ ๊ฒ์ด ์๋๋ผ, AI๊ฐ ๊ฐ๋ฐ์์ ๊ธฐ์กด ํ๊ฒฝ์ ๋ น์๋๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค.
2. ํฌ๋ช ์ฑ (Transparency)
"AI๊ฐ ๋ฌด์์ ํ๋์ง ํญ์ ๋ณผ ์ ์์ด์ผ ํ๋ค"
๋ชจ๋ ํ์ผ ๋ณ๊ฒฝ, ๋ช ๋ น ์คํ, ์์ฌ๊ฒฐ์ ๊ณผ์ ์ด ๊ฐ๋ฐ์์๊ฒ ์ค์๊ฐ์ผ๋ก ๊ณต๊ฐ๋ฉ๋๋ค. ๋ธ๋๋ฐ์ค๊ฐ ์๋ ์ ๋ฆฌ ์์ ์์์ AI๊ฐ ์์ ํฉ๋๋ค.
3. ํ์ (Collaboration)
"๋์ฒด๊ฐ ์๋ ์ฆ๊ฐ โ AI๋ ํ์์ด๋ค"
์ฝ๋๋ฅผ ๋์ ์ง์ฃผ๋ ๋๊ตฌ๊ฐ ์๋๋ผ, ํจ๊ป ๊ณ ๋ฏผํ๊ณ ๋ฆฌ๋ทฐํ๊ณ ๊ฐ์ ํ๋ ๋๋ฃ ๊ฐ๋ฐ์ ์ญํ ์ ํฉ๋๋ค.
4. ๋งฅ๋ฝ ์ดํด (Context Awareness)
"ํ๋ก์ ํธ ์ ์ฒด๋ฅผ ์ดํดํ๊ณ ์์ ํ๋ค"
๋จ์ผ ํ์ผ์ด ์๋ ํ๋ก์ ํธ ์ ์ฒด ๊ตฌ์กฐ, ์์กด์ฑ, ์ฝ๋ฉ ์ปจ๋ฒค์ ์ ํ์ ํ ํ ์์ ํฉ๋๋ค. CLAUDE.md, .claude/ ์ค์ ์ ํตํด ํ๋ก์ ํธ ๋งฅ๋ฝ์ ๊น์ด ์ดํดํฉ๋๋ค.
5. ์์ ์ฑ (Safety)
"๋๋๋ฆด ์ ์๋ ์์ ์ ๋ฐ๋์ ํ์ธํ๋ค"
ํ์ผ ์ญ์ , ์๊ฒฉ ํธ์, DB ๋ณ๊ฒฝ ๋ฑ ํ๊ดด์ ์์ ์ ์ ํญ์ ์ฌ์ฉ์ ํ์ธ์ ์์ฒญํฉ๋๋ค. ๊ถํ ์ฒด๊ณ(allowedTools, permissions)๋ก ์์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํฉ๋๋ค.
6. ํ์ฅ์ฑ (Extensibility)
"๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ๋์ด ๋ฌดํํ ํ์ฅํ ์ ์๋ค"
MCP ์๋ฒ, Custom Skills, Hooks, Subagents๋ฅผ ํตํด ๊ธฐ๋ฅ์ ์์ ๋กญ๊ฒ ํ์ฅํฉ๋๋ค. ์ปค๋ฎค๋ํฐ๊ฐ ๋ง๋ ์คํฌ์ ์ค์นํ๊ฑฐ๋, ์์ ๋ง์ ์๋ํ๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
[S1CO4(์น์ 18)] ๋ฐ์ด๋ธ ์ฝ๋ฉ ์ ํฉ์ฑ ํ๋จ
๋ฐ์ด๋ธ ์ฝ๋ฉ, ์ธ์ ์ ํฉํ๊ฐ?
๋ชจ๋ ํ๋ก์ ํธ์ ๋ฐ์ด๋ธ ์ฝ๋ฉ์ด ์ ํฉํ ๊ฒ์ ์๋๋๋ค. ํ๋ก์ ํธ์ ์ฑ๊ฒฉ, ํ ๊ตฌ์ฑ, ๊ธฐ์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๋ฐ์ด๋ธ ์ฝ๋ฉ์ ํจ๊ณผ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค.
๋ฐ์ด๋ธ ์ฝ๋ฉ์ด ์ ํฉํ ๊ฒฝ์ฐ
| ์ํฉ | ์ด์ | ํจ๊ณผ | |
|---|---|---|---|
| MVP/ํ๋กํ ํ์ ๊ฐ๋ฐ | ๋น ๋ฅธ ๊ฒ์ฆ์ด ํต์ฌ | ๊ฐ๋ฐ ์๋ 3~5๋ฐฐ ํฅ์ | |
| 1์ธ ๊ฐ๋ฐ ํ๋ก์ ํธ | ํ์คํ ์ญํ ์ AI๊ฐ ๋ณด์ | ๋ถ์กฑํ ์์ญ ์ปค๋ฒ | |
| ๋ฐ๋ณต ์์ ์ด ๋ง์ ํ๋ก์ ํธ | CRUD, ๋ณด์ผ๋ฌํ๋ ์ดํธ ์๋ํ | ๋จ์ ์์ ์๊ฐ 90% ์ ๊ฐ | |
| ํ์ต ๋ชฉ์ ํ๋ก์ ํธ | AI๊ฐ ์ฝ๋ ์ค๋ช ๊ณผ ๋์ ์ ์ | ์ค์๊ฐ ๋ฉํ ๋ง ํจ๊ณผ | |
| ์น ๊ธฐ๋ฐ ์๋น์ค | ํ๋ก ํธ์๋+๋ฐฑ์๋+DB ํตํฉ | ๊ธฐ์ ์คํ ์ ํ ๋น์ฉ ์ต์ํ |
๋ฐ์ด๋ธ ์ฝ๋ฉ์ด ๋ถ์ ํฉํ ๊ฒฝ์ฐ
| ์ํฉ | ์ด์ | ๋์ | |
|---|---|---|---|
| ์ค์๊ฐ ์์คํ (๊ฒ์ ์์ง, ์๋ฒ ๋๋) | ๊ทนํ ์ฑ๋ฅ ์ต์ ํ ํ์ | ์ ํต์ ์๋ ๊ฐ๋ฐ | |
| ๋ณด์ ์ต์ฐ์ ์์คํ (๊ธ์ต ํต์ฌ, ๊ตฐ์ฌ) | AI ์ฝ๋ ๊ฐ์ฌ๊ฐ ์ด๋ ค์ | ์๋ ๊ฐ๋ฐ + ์ ๋ฌธ ๊ฐ์ฌ | |
| ๋ ๊ฑฐ์ ์์คํ ์ ์ง๋ณด์ | ๊ณ ์ ํ ๋๋ฉ์ธ ์ง์ ํ์ | ๋ถ๋ถ์ AI ํ์ฉ๋ง ๊ฐ๋ฅ | |
| ๋๊ท๋ชจ ํ (50๋ช +) | ์ฝ๋ฉ ์ปจ๋ฒค์ ๊ฐ์ ๊ฐ ๋ณต์ก | AI๋ ๋ณด์กฐ ๋๊ตฌ๋ก๋ง ํ์ฉ | |
| ๊ท์ ์ฐ์ (์๋ฃ, ํญ๊ณต) | ์ฝ๋ ์ถ์ฒ ์ถ์ ํ์ | ์๋ ๊ฐ๋ฐ + AI ๊ฒํ ๋ณด์กฐ |
์ ํฉ์ฑ ํ๋จ ์ฒดํฌ๋ฆฌ์คํธ
ํ๋ก์ ํธ ์์ ์ ์๋ ํญ๋ชฉ์ ํ์ธํ์ธ์:
- [ ] ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ค์ํ์ธ๊ฐ? (ํ์ผ 500๊ฐ ์ด๋ด)
- [ ] ํ ๊ท๋ชจ๊ฐ 1~5๋ช ์ธ๊ฐ?
- [ ] ์น ๊ธฐ๋ฐ ๊ธฐ์ ์คํ์ ์ฌ์ฉํ๋๊ฐ?
- [ ] MVP ๋๋ ํ๋กํ ํ์ ๋จ๊ณ์ธ๊ฐ?
- [ ] ์ค์๊ฐ ์ฑ๋ฅ ์๊ตฌ์ฌํญ์ด ์๊ฒฉํ์ง ์์๊ฐ?
- [ ] ๋ณด์ ๊ท์ ๊ฐ ์ต๊ณ ์์ค์ ์๋๊ฐ?
4๊ฐ ์ด์ ์ฒดํฌ: ๋ฐ์ด๋ธ ์ฝ๋ฉ ๊ฐ๋ ฅ ์ถ์ฒ
2~3๊ฐ ์ฒดํฌ: ๋ถ๋ถ์ ๋ฐ์ด๋ธ ์ฝ๋ฉ (ํต์ฌ ๋ก์ง์ ์๋)
1๊ฐ ์ดํ: ์ ํต์ ๊ฐ๋ฐ ๋ฐฉ์ ๊ถ์ฅ, AI๋ ๋ณด์กฐ ๋๊ตฌ๋ก๋ง
[S1CO5(์น์ 15)] ํ๋ก ํ โ ํจ์จ์ฑ ๊ทน๋ํ
ํ๋ก ํ: ํจ์จ์ฑ ๊ทน๋ํ
1. ๋ณ์นญ(Alias) ์ค์
์์ฃผ ์ฌ์ฉํ๋ ๋ช ๋ น์ด์ ๋จ์ถ ๋ณ์นญ์ ์ค์ ํ์ฌ ์์ ํจ์จ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
# ~/.bashrc ๋๋ ~/.zshrc์ ์ถ๊ฐ
alias cc="claude"
alias ccc="claude --clear"
alias ccr="claude 'npm run'"
2. ํ ํ๋ฆฟ ํ์ฉ
๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ช ๋ น์ด ํจํด์ ํ ํ๋ฆฟ์ผ๋ก ์ ์ฅํ์ฌ ์ฌ์ฌ์ฉ์ฑ์ ๋์ ๋๋ค.
ํ ํ๋ฆฟ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
# Claude Code ํ
ํ๋ฆฟ ๋๋ ํ ๋ฆฌ ์์ฑ
mkdir -p ~/.claude-templates/{components,features,tests,docs}
์ค์ฉ์ ์ธ ํ ํ๋ฆฟ ์์๋ค
- React ์ปดํฌ๋ํธ ํ ํ๋ฆฟ
# ์ปดํฌ๋ํธ ์์ฑ ํ
ํ๋ฆฟ
cat > ~/.claude-templates/components/react-component.txt << 'EOF'
์๋ก์ด React ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ค
- ์ปดํฌ๋ํธ ์ด๋ฆ: [COMPONENT_NAME]
- ํจ์ํ ์ปดํฌ๋ํธ๋ก ์์ฑ
- TypeScript ์ฌ์ฉ
- Props ์ธํฐํ์ด์ค ์ ์
- ๊ธฐ๋ณธ ์คํ์ผ ํฌํจ
- ์คํ ๋ฆฌ๋ถ ์คํ ๋ฆฌ ํ์ผ๋ ์์ฑ
- ์ ๋ ํ
์คํธ ํ์ผ ํฌํจ
EOF
# ์ฌ์ฉ ์์
COMPONENT_NAME="UserProfile" envsubst < ~/.claude-templates/components/react-component.txt | claude
- API ์๋ํฌ์ธํธ ํ ํ๋ฆฟ
# API ๋ผ์ฐํธ ์์ฑ ํ
ํ๋ฆฟ
cat > ~/.claude-templates/features/api-endpoint.txt << 'EOF'
์๋ก์ด REST API ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค์ด์ค
- ๋ฆฌ์์ค: [RESOURCE_NAME]
- CRUD ์์
๋ชจ๋ ํฌํจ
- Express.js ๋ผ์ฐํฐ ์ฌ์ฉ
- ์
๋ ฅ ๊ฒ์ฆ ๋ฏธ๋ค์จ์ด
- ์๋ฌ ํธ๋ค๋ง
- Swagger ๋ฌธ์ ์ฃผ์
- ํตํฉ ํ
์คํธ ํฌํจ
EOF
- ๋ฒ๊ทธ ์์ ํ ํ๋ฆฟ
# ๋ฒ๊ทธ ์์ ์ํฌํ๋ก์ฐ ํ
ํ๋ฆฟ
cat > ~/.claude-templates/features/bugfix.txt << 'EOF'
๋ค์ ๋ฒ๊ทธ๋ฅผ ์์ ํด์ค
1. ๋จผ์ ๊ด๋ จ๋ ์ฝ๋๋ฅผ ์ฐพ์์ ๋ถ์ํด์ค
2. ๋ฒ๊ทธ์ ๊ทผ๋ณธ ์์ธ์ ์ค๋ช
ํด์ค
3. ์์ ๋ฐฉ์์ ์ ์ํ๊ณ ๊ตฌํํด์ค
4. ์ฌ๋ฐ ๋ฐฉ์ง๋ฅผ ์ํ ํ
์คํธ๋ฅผ ์ถ๊ฐํด์ค
5. ์์ ์ฌํญ์ ์ปค๋ฐ ๋ฉ์์ง์ ํจ๊ป ์ ๋ฆฌํด์ค
๋ฒ๊ทธ ์ค๋ช
: [BUG_DESCRIPTION]
EOF
3. ์ปจํ ์คํธ ์ ์ง
๋ณต์กํ๊ณ ๊ธด ์์ ์ ์ํํ ๋๋ ๋ํํ ๋ชจ๋๋ฅผ ํ์ฉํ์ฌ ๋ฌธ๋งฅ์ ์ ์งํฉ๋๋ค. ํจ๊ณผ์ ์ธ ์ปจํ ์คํธ ๊ด๋ฆฌ๋ ๋๊ท๋ชจ ์์ ์ ์ฑ๊ณต ์ด์ ์ ๋๋ค.
๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง ์๋๋ฆฌ์ค
# ๋ํํ ๋ชจ๋๋ก ์์
claude
> ์ด์ ๋ถํฐ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์ต์ ์ํคํ
์ฒ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ ๊ฑฐ์ผ
< ์๊ฒ ์ต๋๋ค. ๋จผ์ ํ์ฌ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๊ณ ๋ง์ด๊ทธ๋ ์ด์
๊ณํ์ ์๋ฆฝํ๊ฒ ์ต๋๋ค.
> 1๋จ๊ณ: ํ์ฌ ์ํคํ
์ฒ๋ฅผ ๋ถ์ํ๊ณ ๋ฌธ์ ์ ์ ํ์
ํด์ค
< ๋ถ์ ๊ฒฐ๊ณผ
- ๋ชจ๋๋ฆฌ์ ๊ตฌ์กฐ๋ก ๋ชจ๋ ๊ฐ ๊ฒฐํฉ๋๊ฐ ๋์
- ํด๋์ค ๊ธฐ๋ฐ ์ปดํฌ๋ํธ ์ฌ์ฉ (React 16.2)
- ์ํ ๊ด๋ฆฌ๊ฐ prop drilling์ผ๋ก ๋ณต์กํจ
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 30%
์ฃผ์ ๊ฐ์ ํ์ ์์ญ์ ์๋ณํ์ต๋๋ค. ๊ณ์ ์งํํ ๊น์?
> 2๋จ๊ณ: ๋ง์ด๊ทธ๋ ์ด์
๋ก๋๋งต์ ๋ง๋ค์ด์ค
< ๋จ๊ณ๋ณ ๋ง์ด๊ทธ๋ ์ด์
๋ก๋๋งต
Phase 1: ์ธํ๋ผ ํ๋ํ (1-2์ฃผ)
- ๋น๋ ๋๊ตฌ๋ฅผ Webpack์์ Vite๋ก ๋ง์ด๊ทธ๋ ์ด์
- TypeScript ๋์
Phase 2: ์ปดํฌ๋ํธ ํ๋ํ (3-4์ฃผ)
- ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ํจ์ํ์ผ๋ก ์ ํ
- Custom Hooks๋ก ๋ก์ง ์ถ์ถ
Phase 3: ์ํ ๊ด๋ฆฌ ๊ฐ์ (1์ฃผ)
- Context API ๋๋ Zustand ๋์
Phase 4: ํ
์คํธ ๊ฐํ (1์ฃผ)
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 80% ๋ชฉํ
> ์ข์, Phase 1๋ถํฐ ์์ํ์. ๋จผ์ Vite ๋ง์ด๊ทธ๋ ์ด์
์ ์งํํด์ค
< Phase 1 ์์: Vite ๋ง์ด๊ทธ๋ ์ด์
์ ๋จ๊ณ๋ณ๋ก ์งํํ๊ฒ ์ต๋๋ค...
์ปจํ ์คํธ ์ ์ง ํ
- ์ฒดํฌํฌ์ธํธ ์์ฑ: ๊ฐ ๋จ๊ณ ์๋ฃ ์ ์งํ ์ํฉ ์์ฝ ์์ฒญ
- ๋ช ํํ ๋จ๊ณ ๊ตฌ๋ถ: ๋ฒํธ๋ ๋ผ๋ฒจ๋ก ์์ ๋จ๊ณ ๋ช ์
- ์ ๊ธฐ์ ์ธ ๊ฒ์ฆ: ์ค๊ฐ์ค๊ฐ ๊ฒฐ๊ณผ ํ์ธ ๋ฐ ๋ฐฉํฅ ์กฐ์
- ์ปจํ ์คํธ ์ ์ฅ: ์ค์ํ ๊ฒฐ์ ์ฌํญ์ ๋ณ๋ ๋ฌธ์๋ก ์ ์ฅ
์ํฌํ๋ก์ฐ CLAUDE.md ์์
# Development Workflow
## ๊ธฐ๋ฅ ๊ฐ๋ฐ ํ๋ก์ธ์ค
1. ์ด์ ์์ฑ ๋ฐ ๋ธ๋์น ์์ฑ
2. ํ์: ๊ด๋ จ ์ฝ๋ ๋ถ์ (30๋ถ)
3. ๊ณํ: ๊ตฌํ ์ ๋ต ์๋ฆฝ (30๋ถ)
4. ๊ตฌํ: TDD๋ก ๊ฐ๋ฐ (2-4์๊ฐ)
5. ๋ฆฌ๋ทฐ: ์์ฒด ์ฝ๋ ๋ฆฌ๋ทฐ (30๋ถ)
6. PR ์์ฑ ๋ฐ ๋ฆฌ๋ทฐ ์์ฒญ
## ์ผ์ผ ๋ฃจํด
- 09:00: ์ด์ ํ์ธ ๋ฐ ์ฐ์ ์์ ์ ๋ฆฌ
- 09:30: ์ง์ค ์ฝ๋ฉ (ํฌ๋ชจ๋๋ก ๊ธฐ๋ฒ)
- 14:00: ์ฝ๋ ๋ฆฌ๋ทฐ
- 16:00: ๋ฌธ์ ์
๋ฐ์ดํธ
- 17:00: ๋ค์ ๋ ๊ณํ
## ํ์ง ์ฒดํฌ๋ฆฌ์คํธ
- [ ] ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 80% ์ด์
- [ ] ๋ชจ๋ ํจ์์ JSDoc
- [ ] ์ฑ๋ฅ ํ๋กํ์ผ๋ง ์๋ฃ
- [ ] ์ ๊ทผ์ฑ ๊ฒ์ฌ ํต๊ณผ
- [ ] ๋ณด์ ์ค์บ ํต๊ณผ
๋ง์น๋ฉฐ
ํจ์จ์ ์ธ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ ๊ฐ๋ฐ์์ ํ์ ์์ฐ์ฑ์ ๊ฒฐ์ ํ๋ ํต์ฌ ์์์ ๋๋ค. Claude Code๋ ์ด๋ฌํ ์ํฌํ๋ก์ฐ์ ๊ฐ ๋จ๊ณ์์ ์ง๋ฅ์ ์ธ ์ง์์ ์ ๊ณตํ์ฌ, ๊ฐ๋ฐ์๊ฐ ๋ ๋์ ์์ค์ ๋ฌธ์ ํด๊ฒฐ์ ์ง์คํ ์ ์๋๋ก ๋์์ค๋๋ค.
ํต์ฌ ์์น ์์ฝ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
mindmap
root((ํต์ฌ ์์น))
์ฒด๊ณ์ ์ ๊ทผ
EPCC ์ฌ์ดํด ์ ์ฉ
์์ธก ๊ฐ๋ฅํ ํ๋ก์ธ์ค
๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ๋ฐ
๋ฆฌ์คํฌ ์ต์ํ
ํ์ง ์ฐ์
TDD ์ค์ฒ
์ง์์ ๋ฆฌํฉํ ๋ง
์ฝ๋ ๋ฆฌ๋ทฐ ๋ฌธํ
์๋ํ๋ ํ
์คํธ
์๋ํ ๊ทน๋ํ
๋ฐ๋ณต ์์
์ ๊ฑฐ
๋๊ตฌ ํ์ฉ
์คํฌ๋ฆฝํธ ๊ฐ๋ฐ
ํจ์จ์ฑ ํฅ์
์ง์์ ๊ฐ์
๋ฉํธ๋ฆญ ์์ง
ํ๋ก์ธ์ค ๋ถ์
ํผ๋๋ฐฑ ๋ฐ์
๋ฉํ ๊ฐ์
- ์ฒด๊ณ์ ์ ๊ทผ: EPCC(ํ์-๊ณํ-์ฝ๋ฉ-์ปค๋ฐ) ์ฌ์ดํด์ ํตํ ์์ธก ๊ฐ๋ฅํ๊ณ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ๋ฐ ํ๋ก์ธ์ค
- ํ์ง ์ฐ์ : TDD์ ์ง์์ ์ธ ๋ฆฌํฉํ ๋ง์ ํตํ ์ฝ๋ ํ์ง์ ์ง์์ ํฅ์
- ์๋ํ ๊ทน๋ํ: ๋ฐ๋ณต์ ์ธ ์์ ์ ์๋ํ๋ฅผ ํตํ ๊ฐ๋ฐ์ ์๊ฐ์ ํจ์จ์ ํ์ฉ
- ์ง์์ ๊ฐ์ : ์ํฌํ๋ก์ฐ ์์ฒด๋ ์ง์์ ์ผ๋ก ์ธก์ ํ๊ณ ๊ฐ์ ํ๋ ๋ฉํ ํ๋ก์ธ์ค
์ค๋ฌด ์ ์ฉ ์ ๋ต
- ๊ฐ์ธ ๊ฐ๋ฐ์: ์ผ๊ด๋ ๊ฐ๋ฐ ๋ฆฌ๋ฌ ๊ตฌ์ถ๊ณผ ํ์ง ๊ธฐ์ค ์๋ฆฝ
- ํ ๋ฆฌ๋: ํ ์ ์ฒด์ ์ํฌํ๋ก์ฐ ํ์คํ์ ๋ชจ๋ฒ ์ฌ๋ก ๊ณต์
- ์กฐ์ง: ์ํฌํ๋ก์ฐ ๋ฉํธ๋ฆญ ์์ง๊ณผ ์ง์์ ์ธ ํ๋ก์ธ์ค ๊ฐ์
- ํ๋ก์ ํธ ๊ด๋ฆฌ: ์์ธก ๊ฐ๋ฅํ ๊ฐ๋ฐ ์๋์ ํ์ง ๋ณด์ฅ
๋ค์ ์ฅ์์๋ ์ฌ๋ฌ Claude Code ์ธ์คํด์ค๋ฅผ ํ์ฉํ ๋ฉํฐํ์คํน๊ณผ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ ๋ต์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ณต์กํ ํ๋ก์ ํธ์์ ๊ฐ๋ฐ ์๋๋ฅผ ๊ทน๋ํํ๋ ๊ณ ๊ธ ํ์ฉ๋ฒ์ ํ๊ตฌํด๋ด ์๋ค.
[S1CO6] CLAUDE.md โ ๊ฐ๋ ๊ณผ ๋๋ฉ์ธ ์ง์ ์ ์
- CLAUDE.md์ ํ๋ก์ ํธ์ ๋น์ฆ๋์ค ๋๋ฉ์ธ๊ณผ ํต์ฌ ๊ฐ๋ ์ ๊ธฐ์
- ์: "์ด ํ๋ก์ ํธ๋ SaaS ๊ตฌ๋ ๊ด๋ฆฌ ์๋น์ค์ด๋ฉฐ, ํต์ฌ ์ํฐํฐ๋ User, Subscription, Plan์ด๋ค"
- AI๊ฐ ํ๋ก์ ํธ ๋งฅ๋ฝ์ ์ดํดํ๊ณ ์ ์ ํ ์ฉ์ด์ ํจํด์ ์ฌ์ฉํ๊ฒ ๋จ
- ๋๋ฉ์ธ ํนํ ์ฉ์ด ์ฌ์ (glossary)์ ํฌํจํ๋ฉด AI์ ์ ํ๋ ํฅ์
[S1CO7] Plugin Marketplace โ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ ๊ฐ๋
- Plugin Marketplace: ์ปค๋ฎค๋ํฐ๊ฐ ๋ง๋ ํ๋ฌ๊ทธ์ธ์ ๋ฐ๊ฒฌํ๊ณ ์ค์นํ ์ ์๋ ์ํ๊ณ
- ํ๋ฌ๊ทธ์ธ = MCP ์๋ฒ + ์ปค์คํ ์ฌ๋์ ๋ช ๋ น์ด + ์์ด์ ํธ๋ฅผ ํ๋์ ํจํค์ง๋ก ๋ฌถ์ ๊ฒ
- ๋ง์ผํ๋ ์ด์ค๋ฅผ ํตํด ํ ๊ฐ ๋๊ตฌ ๊ณต์ , ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ํ ํจํด ์ ํต
- ๊ฐ๋ ์ ์ผ๋ก npm/VS Code Extension Marketplace์ ์ ์ฌํ ๋ฐฐํฌ ๊ตฌ์กฐ
[S1CO8] Multi-Agent vs Multi-Role ์์คํ ๊ฐ๋
์ฐธ๊ณ : ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /์ค์ _Tips/๋๊ตฌ_ํ์ฉ/Multi-Role_AI_์์คํ
๊ณผ_Multi-Agent_์์คํ
_๋น๊ต.md
- Multi-Role AI: ํ๋์ AI๊ฐ ์ญํ ์ ์ ํํ๋ฉฐ ์์ (์: Claude๊ฐ ์ฝ๋ ๋ฆฌ๋ทฐ์ด โ ํ ์คํฐ โ ๋ฌธ์ ์์ฑ์)
- Multi-Agent: ์ฌ๋ฌ ๋ ๋ฆฝ AI ์ธ์คํด์ค๊ฐ ๊ฐ์ ์ ๋ฌธ ์ญํ ์ํ (์๋ธ์์ด์ ํธ, Agent Teams)
- ์ค์ผ์คํธ๋ ์ดํฐ ๊ฐ๋ : Main Agent๊ฐ ์๋ธ์์ด์ ํธ๋ค์ ์กฐ์จํ๋ ์งํ ๊ตฌ์กฐ
- ํ์ ํจํด: ๊ณ์ธตํ(Hierarchical), ํ์ดํ๋ผ์ธ(Pipeline), P2P(Peer-to-Peer)
[S1CO9] Books 1๊ถ โ Claude & Code ๊ธฐ์ด
- 1๊ถ 01ํธ: Anthropic ์ฐฝ์ ๊ณผ ์ฒ ํ โ AI ์์ ์ฑ ์ค์ฌ ๊ธฐ์ ์ฒ ํ
- 1๊ถ 02ํธ: Claude์ ํ์๊ณผ ์งํ โ ๋ชจ๋ธ ๋ฐ์ ๊ณผ์ ๊ณผ ์ธ๋๋ณ ํน์ง
- 1๊ถ 03ํธ: Claude ๋ชจ๋ธ๊ณผ ์ ๊ทผ๋ฐฉ์ ๊ฐ์ โ Opus/Sonnet/Haiku ๋ชจ๋ธ ์ฒด๊ณ
- 1๊ถ 04ํธ: Claude์ ํน์ฅ์ ๊ณผ ์์ฅ ์์น โ ๊ฒฝ์ AI ๋๋น ์ฐจ๋ณ์
- 1๊ถ 05ํธ: ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ์น โ Claude.ai ์น/iOS ์ฑ ๊ฐ์
- 1๊ถ 06ํธ: ๋ฐ์คํฌํฑ ์ฑ โ Desktop ์ฑ ๊ฐ์
- 1๊ถ 07ํธ: Claude Code โ ํฐ๋ฏธ๋ ๊ธฐ๋ฐ ์์ด์ ํธ ์ฝ๋ฉ ๋๊ตฌ์ ํต์ฌ ๊ฐ๋
- 1๊ถ 09ํธ: Claude ์ํ๊ณ ์ ์ฒด ๊ตฌ์กฐ โ ์น/์ฑ/API/Code ํตํฉ ์ํ๊ณ
- 1๊ถ 10ํธ: Claude ๋ด๋ถ ๊ธฐ๋ฅ โ Artifacts, Projects, Vision ๋ฑ ๋ด์ฅ ๊ธฐ๋ฅ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S1CO10] Books 2๊ถ โ ์น๊ฐ๋ฐ ๊ธฐ์ด์ง์
- 2๊ถ 01ํธ: ์น์ฌ์ดํธ ๊ฐ๋ฐ ํต์ฌ ๊ฐ๋ โ ์น ๊ฐ๋ฐ์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์ฉ์ด
- 2๊ถ 02ํธ: ์น์ฌ์ดํธ ์๋ ์๋ฆฌ์ ๊ตฌ์กฐ โ ํด๋ผ์ด์ธํธ-์๋ฒ, HTTP, DOM
- 2๊ถ 06ํธ: ๋ถ๋ฅ์ฒด๊ณ(1) โ ๊ธฐ์ ์คํ ๋ถ๋ฅ ๊ธฐ์ด
- 2๊ถ 07ํธ: ๋ถ๋ฅ์ฒด๊ณ(2) โ ๊ฐ๋ฐ์์ญ ๋ถ๋ฅ ๊ธฐ์ด
- 2๊ถ 15ํธ: Frontend ๊ฐ๋ฐ์์ญ โ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ๊ฐ์
- 2๊ถ 16ํธ: Backend ๊ฐ๋ฐ์์ญ โ ๋ฐฑ์๋ ๊ฐ๋ฐ ๊ฐ์
- 2๊ถ 17ํธ: Database ๊ฐ๋ฐ์์ญ โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ๋ฐ ๊ฐ์
- 2๊ถ 18ํธ: Security ๊ฐ๋ฐ์์ญ โ ๋ณด์ ๊ฐ๋ฐ ๊ฐ์
- 2๊ถ 19ํธ: Testing ๊ฐ๋ฐ์์ญ โ ํ ์คํธ ๊ฐ๋ฐ ๊ฐ์
- 2๊ถ 20ํธ: DevOps ๊ฐ๋ฐ์์ญ โ ๋ฐฐํฌ/์ด์ ๊ฐ์
- 2๊ถ 21ํธ: External Service ๊ฐ๋ฐ์์ญ โ ์ธ๋ถ ์๋น์ค ์ฐ๋ ๊ฐ์
- 2๊ถ ๋ถ๋ก: ์ฉ์ด์ฌ์ โ ํ์คํ ๊ฐ๋ฐ ํต์ฌ ์ฉ์ด ์ด์ ๋ฆฌ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/2๊ถ_ํ์คํ_์น์ฌ์ดํธ_๊ฐ๋ฐ_๊ธฐ์ด์ง์/
[S1CO11] Books 3๊ถ โ ํ๋ก์ ํธ ๊ด๋ฆฌ ์ ๋ฌธ
- 3๊ถ 01ํธ: SAL Grid ๊ฐ์์ ํต์ฌ ๊ฐ๋ โ SAL Grid ์ ์ฒด ๊ตฌ์กฐ์ ์ฒ ํ ์ดํด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/3๊ถ_ํ๋ก์ ํธ_๊ด๋ฆฌ_๋ฐฉ๋ฒ/
[S1CO12] ์ค์ Tips โ ์น๊ฐ๋ฐ ๊ธฐ์ด๊ฐ๋
์น๊ฐ๋ฐ_๊ธฐ์ด๊ฐ๋ /โ CLI๋ ๋ฌด์์ธ๊ฐ, ํ์คํ ์น์ฌ์ดํธ, ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ (3๊ฐ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/์น๊ฐ๋ฐ_๊ธฐ์ด๊ฐ๋
/
S1ST โ ์คํธ๋ญ์ฒ (Structure)
[S1ST1(์น์ 04)] CLAUDE.md ์์ ๊ฐ์ด๋
์ 4์ฅ: CLAUDE.md๋ก ํ๋ก์ ํธ ๋ง์ถค ์ค์
"์ข์ ๋๊ตฌ๋ ์ฌ์ฉ์์๊ฒ ๋ง์ถฐ์ง๋ค" - ๋๋๋ ๋ ธ๋จผ
์ด ์ฅ์์๋ CLAUDE.md ํ์ผ์ ํตํ ํ๋ก์ ํธ ๋ง์ถค ์ค์ ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ๊ฐ ํ๋ก์ ํธ์ ๊ณ ์ ํ ํน์ฑ๊ณผ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ Claude Code๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ์ ์ฒด๊ณ์ ์ผ๋ก ํ์ตํ๊ฒ ์ต๋๋ค.
CLAUDE.md๋ Claude Code๊ฐ ํ๋ก์ ํธ์ ์ปจํ ์คํธ๋ฅผ ์ดํดํ๊ณ , ํ์ ์ฝ๋ฉ ๊ท์น์ ์ค์ํ๋ฉฐ, ์ผ๊ด๋ ํ์ง์ ์ฝ๋๋ฅผ ์์ฑํ๋๋ก ๋๋ ํต์ฌ ๋๊ตฌ์ ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
flowchart TD
A["CLAUDE.md์ ์ญํ ๊ณผ ์ค์์ฑ"] --> B["ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฐ ์ํคํ
์ฒ ๋ฌธ์ํ"]
B --> C["์ฝ๋ฉ ์คํ์ผ ๊ฐ์ด๋ ์ ์"]
C --> D["๊ฐ๋ฐ ํ๊ฒฝ ์๋ํ ์ค์ "]
D --> E["ํ ํ์
์ ์ํ ๊ท์น ์๋ฆฝ"]
E --> F["์ค์ ํ๋ก์ ํธ ์์ ์ ์ต์ ํ ์ ๋ต"]
classDef chapterStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C,D,E,F chapterStyle
์ด ์ฅ์์ ๋ค๋ฃฐ ๋ด์ฉ
4.1 CLAUDE.md์ ์ญํ ๊ณผ ์ค์์ฑ
CLAUDE.md๋?
CLAUDE.md๋ ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์์นํ๋ ํน๋ณํ ๋งํฌ๋ค์ด ํ์ผ์ ๋๋ค. ์ด ํ์ผ์ Claude Code์๊ฒ ํ๋ก์ ํธ๋ณ ์ง์นจ๊ณผ ๊ท์น์ ์ ๊ณตํ์ฌ, ๋ณด๋ค ์ ํํ๊ณ ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ๋์ถํ ์ ์๊ฒ ํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
mindmap
root((CLAUDE.md ํต์ฌ ๊ฐ๋
))
ํ๋ก์ ํธ ์ปจํ
์คํธ
๊ณ ์ ํ ํน์ฑ ์ดํด
๋น์ฆ๋์ค ๋๋ฉ์ธ ํ์
์ํคํ
์ฒ ๊ตฌ์กฐ ์ธ์
์ง์์ ๊ท์น ์ ์ฉ
์ธ์
๊ฐ ์ผ๊ด์ฑ ์ ์ง
์คํ์ผ ๊ฐ์ด๋ ์ค์
์๋ ๊ท์น ๊ฒ์ฆ
ํ ์ง์ ์ ์ฅ์
์๋ฌต์ ์ง์ ๋ช
์ํ
๊ฐ๋ฐ ๊ฒฝํ ์ถ์
๋ฒ ์คํธ ํ๋ํฐ์ค ๊ณต์
CLAUDE.md์ ํต์ฌ ๊ฐ๋
ํ๋ก์ ํธ ๊ตฌ์กฐ ์์
ํ๋ก์ ํธ ๋ฃจํธ/
โโโ CLAUDE.md # Claude Code ์ค์ ํ์ผ
โโโ README.md # ์ผ๋ฐ ํ๋ก์ ํธ ๋ฌธ์
โโโ package.json
โโโ src/
์ ์ค์ํ๊ฐ?
CLAUDE.md๋ฅผ ํตํด ์ป์ ์ ์๋ ์ฃผ์ ์ด์ ๋ค์ ๊ตฌ์ฒด์ ์ธ ์์์ ํจ๊ป ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ์ผ๊ด์ฑ ๋ณด์ฅ
CLAUDE.md๊ฐ ์์ ๋์ ์์ ๋์ ์ฐจ์ด๋ฅผ ๋น๊ตํด๋ณด๊ฒ ์ต๋๋ค.
# CLAUDE.md
## ์ฝ๋ ์คํ์ผ
- ๋ชจ๋ ํจ์๋ ํ์ดํ ํจ์๋ก ์์ฑ
- ์ธ๋ฏธ์ฝ๋ก ํญ์ ์ฌ์ฉ
- ๋ค์ฌ์ฐ๊ธฐ๋ 2์นธ
2. ํ ๊ท์น ์๋ ์ ์ฉ
ํ์ Git ์ปค๋ฐ ๊ท์น์ CLAUDE.md์ ์ ์ํ๋ฉด, Claude Code๊ฐ ์๋์ผ๋ก ๊ท์น์ ๋ง๋ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค.
## Git ์ปค๋ฐ ๊ท์น
- feat: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
- fix: ๋ฒ๊ทธ ์์
- docs: ๋ฌธ์ ์์
- style: ์ฝ๋ ํฌ๋งคํ
(๊ธฐ๋ฅ ๋ณ๊ฒฝ ์์)
- refactor: ์ฝ๋ ๋ฆฌํฉํ ๋ง (๊ธฐ๋ฅ ๋ณ๊ฒฝ ์์)
- test: ํ
์คํธ ์ถ๊ฐ ๋๋ ์์
- chore: ๋น๋ ํ๋ก์ธ์ค ๋๋ ๋ณด์กฐ ๋๊ตฌ ๋ณ๊ฒฝ
## ์ปค๋ฐ ๋ฉ์์ง ํ์
<type>(<scope>): <subject>
์์
feat(auth): ์์
๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์ถ๊ฐ
fix(api): ์ฌ์ฉ์ ์กฐํ ์ null ์ฐธ์กฐ ์ค๋ฅ ์์
์ด๋ ๊ฒ ์ ์ํ๋ฉด Claude Code๊ฐ ์๋์ผ๋ก ์ฌ๋ฐ๋ฅธ ํ์์ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํฉ๋๋ค.
3. ํ๋ก์ ํธ ํนํ ์ง์
ํ๋ก์ ํธ์ ๋๋ฉ์ธ ์ง์์ ๋ช ์ํ๋ฉด Claude Code๊ฐ ๋น์ฆ๋์ค ๋งฅ๋ฝ์ ์ดํดํ๊ณ ๋ ์ ํํ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
## ๋๋ฉ์ธ ์ฉ์ด
- SKU (Stock Keeping Unit): ์ฌ๊ณ ๊ด๋ฆฌ ๋จ์
- ์: "SHOE-NIKE-AF1-WHT-42" (๋์ดํค ์์ดํฌ์ค1 ํฐ์ 42์ฌ์ด์ฆ)
- PDP (Product Detail Page): ์ํ ์์ธ ํ์ด์ง
- ์ฃผ์ ์ปดํฌ๋ํธ: ์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ, ๊ฐ๊ฒฉ ์ ๋ณด, ์ฌ๊ณ ์ํ, ๋ฆฌ๋ทฐ
- CAC (Customer Acquisition Cost): ๊ณ ๊ฐ ํ๋ ๋น์ฉ
- ๊ณ์ฐ์: ์ด ๋ง์ผํ
๋น์ฉ / ์ ๊ท ๊ณ ๊ฐ ์
## ๋น์ฆ๋์ค ๊ท์น
- ์ฌ๊ณ ๊ฐ 5๊ฐ ์ดํ์ผ ๋ "ํ์ ์๋ฐ" ํ์
- ์ ๊ท ํ์์ ์ฒซ ๊ตฌ๋งค ์ 10% ํ ์ธ ์๋ ์ ์ฉ
- 50,000์ ์ด์ ๊ตฌ๋งค ์ ๋ฌด๋ฃ ๋ฐฐ์ก
CLAUDE.md vs README.md
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph LR
subgraph readme ["README.md"]
A1["๋์: ์ฌ๋<br/>๊ฐ๋ฐ์, ์ฌ์ฉ์"]
A2["๋ชฉ์ : ํ๋ก์ ํธ ์๊ฐ<br/>์ฌ์ฉ ๊ฐ์ด๋"]
A3["๋ด์ฉ: ์ค์น ๋ฐฉ๋ฒ<br/>API ๋ฌธ์, ์์ "]
A4["ํ์: ์ฌ์ฉ์ ์นํ์ <br/>์ค๋ช
์ค์ฌ"]
end
subgraph claude ["CLAUDE.md"]
B1["๋์: Claude Code<br/>AI ์ด์์คํดํธ"]
B2["๋ชฉ์ : ์์
์ง์นจ<br/>์ปจํ
์คํธ ์ ๊ณต"]
B3["๋ด์ฉ: ์ฝ๋ฉ ๊ท์น<br/>์ํคํ
์ฒ, ํ ์ปจ๋ฒค์
"]
B4["ํ์: ๊ตฌ์กฐํ๋<br/>AI ์ดํด ์ต์ ํ"]
end
A1 -.->|vs| B1
A2 -.->|vs| B2
A3 -.->|vs| B3
A4 -.->|vs| B4
classDef readmeStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef claudeStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
class A1,A2,A3,A4 readmeStyle
class B1,B2,B3,B4 claudeStyle
๋ ํ์ผ์ ์ฐจ์ด์ ๊ณผ ๊ฐ๊ฐ์ ์ญํ ์ ๋ช ํํ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ค์ ํ์ฉ ์์
# README.md (์ฌ๋์ ์ํ ๋ฌธ์)
## ํ๋ก์ ํธ ์๊ฐ
์ด ํ๋ก์ ํธ๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์
๋๋ค.
## ์ค์น ๋ฐฉ๋ฒ
1. ์ ์ฅ์๋ฅผ ํด๋ก ํฉ๋๋ค.
2. `npm install` ์คํ
3. `npm start`๋ก ์๋ฒ ์์
---
# CLAUDE.md (Claude Code๋ฅผ ์ํ ๋ฌธ์)
## ํ๋ก์ ํธ ์ํคํ
์ฒ
- ํจํด: MVC + Repository Pattern
- ํ๋ก ํธ์๋: React 18 + TypeScript
- ๋ฐฑ์๋: Node.js + Express
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: PostgreSQL + Redis
## ์ฝ๋ ์์ฑ ๊ท์น
- ๋ชจ๋ API ์๋ต์ ResponseDto๋ก ๋ํ
- ์๋ฌ๋ CustomError ํด๋์ค ์ฌ์ฉ
- ๋น๋๊ธฐ ํจ์๋ ๋ฐ๋์ try-catch ํฌํจ
4.2 ํ๋ก์ ํธ ๊ตฌ์กฐ ๋ฌธ์ํ
๊ธฐ๋ณธ ๊ตฌ์กฐ ์ค๋ช
ํ๋ก์ ํธ์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ์ ๊ฐ ํ์ผ์ ์ญํ ์ ๋ช ํํ ์ ์ํ๋ฉด Claude Code๊ฐ ๋ ์ ํํ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๋จ์ํ ๊ตฌ์กฐ ๋์ด์ ๋์ด์ ๊ฐ ๋๋ ํ ๋ฆฌ์ ์ฑ ์๊ณผ ํ์ผ ๋ช ๋ช ๊ท์น๊น์ง ํฌํจํด์ผ ํฉ๋๋ค.
# CLAUDE.md
## ํ๋ก์ ํธ ๊ตฌ์กฐ
### ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
src/
โโโ components/ # React ์ปดํฌ๋ํธ
โ โโโ common/ # ๊ณตํต ์ปดํฌ๋ํธ
โ โโโ features/ # ๊ธฐ๋ฅ๋ณ ์ปดํฌ๋ํธ
โ โโโ layouts/ # ๋ ์ด์์ ์ปดํฌ๋ํธ
โโโ hooks/ # ์ปค์คํ React ํ
โโโ services/ # API ํต์ ๋ก์ง
โโโ store/ # Redux ์คํ ์ด
โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โโโ types/ # TypeScript ํ์ ์ ์
### ์ฃผ์ ํ์ผ ์์น
- ํ๊ฒฝ ์ค์ : `.env`, `.env.example`
- API ์๋ํฌ์ธํธ: `src/services/api.ts`
- ๋ผ์ฐํ
์ค์ : `src/routes/index.tsx`
- ์ ์ญ ์คํ์ผ: `src/styles/global.css`
### ํ์ผ ๋ช
๋ช
๊ท์น
- ์ปดํฌ๋ํธ: PascalCase (์: UserProfile.tsx)
- ์ ํธ๋ฆฌํฐ: camelCase (์: formatDate.ts)
- ์์: UPPER_SNAKE_CASE (์: API_ENDPOINTS.ts)
- ์คํ์ผ: kebab-case (์: user-profile.module.css)
์ํคํ ์ฒ ํจํด ๋ช ์
ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ์ฃผ์ ์ํคํ ์ฒ ํจํด๊ณผ ๋์์ธ ์์น์ ๋ช ์ํ๋ฉด ์ผ๊ด์ฑ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
## ์ํคํ
์ฒ ํจํด
### ์ํ ๊ด๋ฆฌ
- Redux Toolkit ์ฌ์ฉ
- ๊ฐ ๊ธฐ๋ฅ๋ณ๋ก slice ํ์ผ ์์ฑ
- RTK Query๋ก API ์ํ ๊ด๋ฆฌ
### ์ปดํฌ๋ํธ ๊ตฌ์กฐ
```typescript
// ๋ชจ๋ ์ปดํฌ๋ํธ๋ ๋ค์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ
interface ComponentProps {
// props ์ ์
}
export const ComponentName: React.FC<ComponentProps> = (props) => {
// ํ
์ ์ต์๋จ์
// ๋ก์ง
// JSX ๋ฐํ
}
๋ฐ์ดํฐ ํ๋ฆ
- ์ฌ์ฉ์ ์ก์ โ 2. Action dispatch โ 3. Reducer ์ฒ๋ฆฌ โ 4. State ์ ๋ฐ์ดํธ โ 5. UI ๋ฆฌ๋ ๋๋ง
4.3 ์ฝ๋ฉ ์คํ์ผ ๊ฐ์ด๋ ์ ์
์ธ์ด๋ณ ์คํ์ผ ๊ฐ์ด๋
ํ๋ก์ ํธ์์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ณ๋ก ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ด๋ ๋จ์ํ ํฌ๋งคํ ๊ท์น์ ๋์ด์ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ ํต์ฌ ์์์ ๋๋ค.
## ์ฝ๋ฉ ์คํ์ผ
### TypeScript/JavaScript
- ํจ์๋ช
: camelCase
- ์ปดํฌ๋ํธ๋ช
: PascalCase
- ์์: UPPER_SNAKE_CASE
- ํ์ผ๋ช
: kebab-case.ts
### ๋ช
๋ช
๊ท์น ์์
```typescript
// ์ข์ ์
const getUserData = async (userId: string) => { }
const MAX_RETRY_COUNT = 3;
export const UserProfile: React.FC = () => { }
// ํผํด์ผ ํ ์
const get_user_data = async (userid) => { }
const maxretrycount = 3;
export const userprofile = () => { }
```
```mermaid
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
flowchart TD
A["Import ์์"] --> B["1. React ๊ด๋ จ<br/>React, useState, useEffect"]
B --> C["2. ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ<br/>axios, lodash, moment"]
C --> D["3. ๋ด๋ถ ๋ชจ๋<br/>@/constants, @/services"]
D --> E["4. ์๋ ๊ฒฝ๋ก import<br/>../components, ./utils"]
E --> F["5. ์คํ์ผ ํ์ผ<br/>CSS, SCSS ํ์ผ"]
classDef importStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef rootStyle fill:#e2e8f0,stroke:#334155,stroke-width:3px,color:#1e293b
class A rootStyle
class B,C,D,E,F importStyle
```
### Import ์์
```typescript
import React, { useState, useEffect } from 'react';
import { useSelector } from 'react-redux';
import axios from 'axios';
import { API_ENDPOINTS } from '@/constants';
import { UserService } from '@/services';
import { Button } from '../components';
import './styles.css';
```
์ฝ๋ ํ์ง ๊ธฐ์ค
๋์ ํ์ง์ ์ฝ๋๋ฅผ ์ ์งํ๊ธฐ ์ํ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ค๊ณผ ๊ท์น์ ์ค์ ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ค์ ์ฝ๋ ๋ฆฌ๋ทฐ ์ ์ฒดํฌ๋ฆฌ์คํธ๋ก๋ ํ์ฉ๋ฉ๋๋ค.
## ์ฝ๋ ํ์ง ๊ธฐ์ค
```mermaid
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph TB
subgraph rules ["ํจ์ ์์ฑ ๊ท์น"]
A["ํ ๊ฐ์ง ์ผ๋ง ์ํ<br/>Single Responsibility"]
B["ํจ์ ๊ธธ์ด 50์ค ์ดํ<br/>๊ฐ๋
์ฑ ํฅ์"]
C["๋งค๊ฐ๋ณ์ 3๊ฐ ์ดํ<br/>๋ณต์ก์ฑ ๊ฐ์"]
D["๋ณต์ก๋ 10 ์ดํ<br/>Cyclomatic Complexity"]
end
classDef ruleStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
class A,B,C,D ruleStyle
ํจ์ ์์ฑ ๊ท์น
์๋ฌ ์ฒ๋ฆฌ
// ๋ชจ๋ ๋น๋๊ธฐ ํจ์๋ try-catch ์ฌ์ฉ
try {
const data = await fetchData();
return { success: true, data };
} catch (error) {
console.error('Error fetching data:', error);
return { success: false, error: error.message };
}
์ฃผ์ ์์ฑ
- ์ฝ๋๊ฐ '๋ฌด์์' ํ๋์ง๊ฐ ์๋ '์' ํ๋์ง ์ค๋ช
- JSDoc ํ์์ผ๋ก ํจ์ ๋ฌธ์ํ
- TODO ์ฃผ์์ ์ด์ ๋ฒํธ์ ํจ๊ป
/**
* ์ฌ์ฉ์ ์ธ์ฆ ํ ํฐ์ ๊ฒ์ฆํฉ๋๋ค.
* @param token - JWT ํ ํฐ
* @returns ํ ํฐ์ด ์ ํจํ์ง ์ฌ๋ถ
*/
const validateToken = (token: string): boolean => {
// TODO(#123): ํ ํฐ ๋ง๋ฃ ์๊ฐ ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐ
return jwt.verify(token, SECRET_KEY);
}
- claude-md-management ํ๋ฌ๊ทธ์ธ: CLAUDE.md ์๋ ๊ด๋ฆฌ/๊ฐ์ โ ๊ตฌ์กฐ ๋ถ์ ๋ฐ ์ต์ ํ ์ ์
[S1ST14] CLAUDE.md โ ์ค์ ํ์ฉ, ํ ํ์ , ์ต์ ํ
4.4 ๊ฐ๋ฐ ํ๊ฒฝ ์๋ํ
๊ฐ๋ฐ ํ๊ฒฝ ์ค์
์ผ๊ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ํ ํ์ ๋๊ตฌ์ ์ค์ ์ ๋ช ์ํฉ๋๋ค. ์๋ก์ด ํ์์ด ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์๋๋ก ๋จ๊ณ๋ณ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
## ๊ฐ๋ฐ ํ๊ฒฝ
### ํ์ ๋๊ตฌ
- Node.js 18.0 ์ด์
- pnpm 8.0 ์ด์ (npm ๋์ ์ฌ์ฉ)
- VS Code + ์ถ์ฒ ํ์ฅ ํ๋ก๊ทธ๋จ
### ์ด๊ธฐ ์ค์ ์คํฌ๋ฆฝํธ
# ์์กด์ฑ ์ค์น
pnpm install
# ํ๊ฒฝ ๋ณ์ ์ค์
cp .env.example .env
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
pnpm db:migrate
# ๊ฐ๋ฐ ์๋ฒ ์์
pnpm dev
VS Code ์ค์
.vscode/settings.json ํ์ผ์ด ์๋์ผ๋ก ์ ์ฉ๋ฉ๋๋ค.
- ์๋ ํฌ๋งคํ (์ ์ฅ ์)
- ESLint ์๋ ์์
- ์ถ์ฒ ํ์ฅ ํ๋ก๊ทธ๋จ ์ค์น ์๋ฆผ
์ฝ๋ ์์ฑ ํ ํ๋ฆฟ
pnpm generate:component ์คํ ์
- ์ปดํฌ๋ํธ ์ด๋ฆ ์ ๋ ฅ
- ์ปดํฌ๋ํธ ํ์ ์ ํ (์ผ๋ฐ/ํ์ด์ง/๋ ์ด์์)
- ์๋์ผ๋ก ํ์ผ ์์ฑ
- ComponentName.tsx
- ComponentName.test.tsx
- ComponentName.stories.tsx
- index.ts
Git Hooks
- pre-commit: ๋ฆฐํธ ๋ฐ ํฌ๋งคํ ๊ฒ์ฌ
- commit-msg: ์ปค๋ฐ ๋ฉ์์ง ํ์ ๊ฒ์ฆ
- pre-push: ํ ์คํธ ์คํ
4.5 ํ ํ์ ์ ์ํ ๊ท์น ์ค์
์ฝ๋ ๋ฆฌ๋ทฐ ๊ฐ์ด๋๋ผ์ธ
ํจ๊ณผ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ์ํ ์ฒด๊ณ์ ์ธ ๊ฐ์ด๋๋ผ์ธ์ ์๋ฆฝํฉ๋๋ค. ๋จ์ํ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋์ด์ ๋ฆฌ๋ทฐ์ด์ ์์ฑ์ ๋ชจ๋๋ฅผ ์ํ ์ค์ง์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
## ์ฝ๋ ๋ฆฌ๋ทฐ ๊ฐ์ด๋๋ผ์ธ
### PR ์์ฑ ๊ท์น
1. ์ ๋ชฉ: `[ํ์
] ๊ฐ๋จํ ์ค๋ช
`
2. ๋ณธ๋ฌธ ํ์ ํฌํจ ์ฌํญ
- ๋ณ๊ฒฝ ์ฌํญ ์์ฝ
- ๊ด๋ จ ์ด์ ๋ฒํธ
- ํ
์คํธ ๋ฐฉ๋ฒ
- ์คํฌ๋ฆฐ์ท (UI ๋ณ๊ฒฝ ์)
### ๋ฆฌ๋ทฐ ์ฒดํฌ๋ฆฌ์คํธ
- [ ] ์ฝ๋๊ฐ ํ๋ก์ ํธ ์ปจ๋ฒค์
์ ๋ฐ๋ฅด๋๊ฐ?
- [ ] ํ
์คํธ๊ฐ ์ถฉ๋ถํ ์์ฑ๋์๋๊ฐ?
- [ ] ์ฑ๋ฅ ์ํฅ์ ๊ณ ๋ ค๋์๋๊ฐ?
- [ ] ๋ณด์ ์ทจ์ฝ์ ์ ์๋๊ฐ?
- [ ] ๋ฌธ์๋ ์
๋ฐ์ดํธ๋์๋๊ฐ?
### ๋จธ์ง ๊ธฐ์ค
- ์ต์ 1๋ช
์ ์น์ธ ํ์
- ๋ชจ๋ CI ์ฒดํฌ ํต๊ณผ
- ์ถฉ๋ ํด๊ฒฐ ์๋ฃ
### ๋ธ๋์น ์ ๋ต
์ฒด๊ณ์ ์ธ Git ๋ธ๋์น ๊ด๋ฆฌ๋ฅผ ์ํ ์ ๋ต๊ณผ ๊ท์น์ ์ ์ํฉ๋๋ค. Git Flow๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ค์ฉ์ ์ธ ๋ธ๋์น ์ ๋ต์ ์๊ฐํฉ๋๋ค.
## Git ๋ธ๋์น ์ ๋ต
### ๋ธ๋์น ๋ช
๋ช
๊ท์น
- feature/๊ธฐ๋ฅ๋ช
: ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ
- fix/์ด์๋ฒํธ: ๋ฒ๊ทธ ์์
- hotfix/์ค๋ช
: ๊ธด๊ธ ์์
- refactor/๋์: ๋ฆฌํฉํ ๋ง
### ๋ธ๋์น ํ๋ก์ฐ
main
โโโ develop
โ โโโ feature/user-auth
โ โโโ feature/payment
โ โโโ fix/123
โโโ hotfix/critical-bug
### ๋จธ์ง ์ ๋ต
- feature โ develop: Squash merge
- develop โ main: Merge commit
- hotfix โ main: Cherry-pick
ํ ์ปค๋ฎค๋์ผ์ด์
์ด์ ํ ํ๋ฆฟ
๋ฒ๊ทธ ๋ฆฌํฌํธ
- ์ฌํ ๋จ๊ณ
- ์์ ๋์
- ์ค์ ๋์
- ํ๊ฒฝ ์ ๋ณด
๊ธฐ๋ฅ ์์ฒญ
- ์ฌ์ฉ์ ์คํ ๋ฆฌ
- ์๋ฝ ๊ธฐ์ค
- ๊ธฐ์ ์ ๊ณ ๋ ค์ฌํญ
์ผ์ผ ์คํ ๋์
๋งค์ผ ์ค์ 10์, ๋ค์ ๋ด์ฉ ๊ณต์
- ์ด์ ํ ์ผ
- ์ค๋ ํ ์ผ
- ๋ธ๋ก์ปค
๊ธฐ์ ๊ฒฐ์ ๊ธฐ๋ก
docs/adr/ ๋๋ ํ ๋ฆฌ์ Architecture Decision Records ์์ฑ
- ๋ฐฐ๊ฒฝ
- ๊ณ ๋ คํ ์ต์ ๋ค
- ๊ฒฐ์ ์ฌํญ
- ๊ฒฐ๊ณผ
์ค์ ์์ : ๋๊ท๋ชจ ์ ์์๊ฑฐ๋ ํ๋ก์ ํธ
์ค์ ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ์ฒด๊ณ์ ์ด๊ณ ํฌ๊ด์ ์ธ CLAUDE.md ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
# E-Commerce Project Guidelines for Claude Code
## ํ๋ก์ ํธ ๊ฐ์
๋๊ท๋ชจ ์ ์์๊ฑฐ๋ ํ๋ซํผ (์ผ 100๋ง MAU)
## ํต์ฌ ๊ธฐ์ ์คํ
- Frontend: Next.js 14, TypeScript, Tailwind CSS
- State: Zustand + React Query
- Backend: Node.js, Express, PostgreSQL
- Infrastructure: AWS, Docker, K8s
## ๋๋ฉ์ธ ์ง์
### ๋น์ฆ๋์ค ์ฉ์ด
- SKU: Stock Keeping Unit (์ฌ๊ณ ๊ด๋ฆฌ ์ฝ๋)
- GMV: Gross Merchandise Volume (์ด ๊ฑฐ๋์ก)
- AOV: Average Order Value (ํ๊ท ์ฃผ๋ฌธ ๊ธ์ก)
- Cart Abandonment: ์ฅ๋ฐ๊ตฌ๋ ์ดํ
### ํต์ฌ ๋๋ฉ์ธ ๋ชจ๋ธ
```typescript
interface Product {
id: string;
sku: string;
name: string;
price: Money;
inventory: Inventory;
category: Category;
}
interface Order {
id: string;
userId: string;
items: OrderItem[];
status: OrderStatus;
payment: Payment;
shipping: Shipping;
}
```
## ์ฑ๋ฅ ์๊ตฌ์ฌํญ
- ํ์ด์ง ๋ก๋: 3์ด ์ด๋ด
- API ์๋ต: 200ms ์ด๋ด
- 99.9% ๊ฐ์ฉ์ฑ
## ๋ณด์ ๊ท์น
- ๋ชจ๋ ์ฌ์ฉ์ ์
๋ ฅ ๊ฒ์ฆ
- SQL Injection ๋ฐฉ์ง
- XSS ๋ฐฉ์ง
- ๋ฏผ๊ฐ ์ ๋ณด ์ํธํ
## ํ
์คํธ ์ ๋ต
- ๋จ์ ํ
์คํธ: 80% ์ปค๋ฒ๋ฆฌ์ง
- ํตํฉ ํ
์คํธ: ํต์ฌ ํ๋ก์ฐ
- E2E ํ
์คํธ: ๊ตฌ๋งค ํ๋ก์ฐ
## ๋ฐฐํฌ ํ๋ก์ธ์ค
1. feature ๋ธ๋์น์์ ๊ฐ๋ฐ
2. PR ์์ฑ ๋ฐ ๋ฆฌ๋ทฐ
3. develop ๋ธ๋์น ๋จธ์ง
4. ์คํ
์ด์ง ์๋ ๋ฐฐํฌ
5. QA ๊ฒ์ฆ
6. ํ๋ก๋์
๋ฐฐํฌ (์น์ธ ํ์)
## Claude Code ํน๋ณ ์ง์นจ
- ์ฑ๋ฅ์ ํญ์ ๊ณ ๋ คํ์ฌ ์ฝ๋ ์์ฑ
- ํ์ฅ ๊ฐ๋ฅํ ์ํคํ
์ฒ ์ ์ง
- ๋ง์ดํฌ๋ก์๋น์ค ๊ฒฝ๊ณ ์ค์
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ฐ์
- ์๋ฌ ๋ก๊น
ํ์
ํ๋ก ํ: CLAUDE.md ์ต์ ํ
1. ์น์ ๋ณ ์ฐ์ ์์
์ค์๋์ ๋ฐ๋ผ CLAUDE.md์ ๋ด์ฉ์ ๊ตฌ์กฐํํ๋ฉด Claude Code๊ฐ ๋ ํจ๊ณผ์ ์ผ๋ก ๊ท์น์ ์ธ์ํ ์ ์์ต๋๋ค.
# CLAUDE.md
## ๐จ ์ค์ ๊ท์น (ํญ์ ์ค์)
- ์ ๋ main ๋ธ๋์น์ ์ง์ ํธ์ ๊ธ์ง
- ๋ชจ๋ API ํค๋ ํ๊ฒฝ ๋ณ์๋ก
- ํ
์คํธ ์๋ ์ฝ๋ ์ปค๋ฐ ๊ธ์ง
## ๐ ์ผ๋ฐ ๊ฐ์ด๋๋ผ์ธ
- ๊ฐ๋ฅํ๋ฉด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ์ฃผ์์ ์ต์ํ, ์ฝ๋๋ก ์ค๋ช
## ๐ก ๊ถ์ฅ์ฌํญ
- ์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์
์ ํ ๋
ผ์
- ์ฑ๋ฅ ์ต์ ํ๋ ์ธก์ ํ ์งํ
2. ๋์ ์ ๋ฐ์ดํธ
CLAUDE.md๋ฅผ ์ ๋ฐ์ดํธํ์ ๋ Claude Code๊ฐ ์๋ก์ด ๊ท์น์ ์ธ์ํ๋๋ก ํ ์ ์์ต๋๋ค.
# CLAUDE.md ์
๋ฐ์ดํธ ์ Claude Code์๊ฒ ์๋ฆฌ๊ธฐ
claude "CLAUDE.md ํ์ผ์ด ์
๋ฐ์ดํธ๋์์ด.
์๋ก์ด ๊ท์น๋ค์ ํ์ธํ๊ณ ์์ฝํด์ค"
3. ํ๊ฒฝ๋ณ ์ค์ ๊ด๋ฆฌ
๋ค์ํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ฐ๋ฅธ ๋ค๋ฅธ ์ค์ ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
ํ๊ฒฝ๋ณ ์ค์
๊ฐ๋ฐ ํ๊ฒฝ
- ๋ก๊ทธ ๋ ๋ฒจ: DEBUG
- ๋๋ฏธ ๋ฐ์ดํฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ์๋ฌ ์์ธ ์ ๋ณด ํ์
ํ๋ก๋์ ํ๊ฒฝ
- ๋ก๊ทธ ๋ ๋ฒจ: ERROR
- ์ค์ ๋ฐ์ดํฐ๋ง ์ฌ์ฉ
- ์๋ฌ ๋ฉ์์ง ์ผ๋ฐํ
4. ์ง์์ ๊ฐ์ ๊ณผ ๋ฒ์ ๊ด๋ฆฌ
CLAUDE.md ์์ฒด๋ ์ํํธ์จ์ด์ฒ๋ผ ๋ฒ์ ๊ด๋ฆฌํ๊ณ ์ง์์ ์ผ๋ก ๊ฐ์ ํด์ผ ํฉ๋๋ค.
CLAUDE.md ๋ฒ์ ๊ด๋ฆฌ
v2.1.0 (2024-03-15)
์ถ๊ฐ
- ์๋ก์ด ๋ณด์ ๊ท์น (SQL Injection ๋ฐฉ์ง)
- React 18 ํ ์ฌ์ฉ ๊ฐ์ด๋๋ผ์ธ
๋ณ๊ฒฝ
- TypeScript ์ค์ ์ strict ๋ชจ๋๋ก ์ ๊ทธ๋ ์ด๋
- API ์๋ต ์๊ฐ ๊ธฐ์ค์ 200ms๋ก ๊ฐํ
์ ๊ฑฐ
- ๊ตฌํ Internet Explorer ์ง์ ์ค๋จ
v2.0.0 (2024-02-01)
์ฃผ์ ๋ณ๊ฒฝ
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ก ์ ํ
- ์๋ก์ด ๋ธ๋์น ์ ๋ต (Git Flow โ GitHub Flow)
๊ฐ์ ์ฌ์ดํด ์์
# ์๊ฐ CLAUDE.md ๋ฆฌ๋ทฐ
claude "์ง๋ ํ ๋ฌ๊ฐ ์ฐ๋ฆฌ ํ์ ๊ฐ๋ฐ ํจํด์ ๋ถ์ํด์
CLAUDE.md์์ ๊ฐ์ ์ด ํ์ํ ๋ถ๋ถ์ ์ฐพ์์ค"
# ๊ท์น ํจ๊ณผ์ฑ ๋ถ์
claude "ํ์ฌ CLAUDE.md ๊ท์น๋ค์ด ์ค์ ๋ก ์ ์ง์ผ์ง๊ณ ์๋์ง
์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ถ์ํด์ ์ค์์จ์ ๋ณด๊ณ ํด์ค"
# ์๋ก์ด ๊ท์น ์ ์
claude "์ต๊ทผ ๋ฐ์ํ ๋ฒ๊ทธ๋ค์ ๋ถ์ํด์
์๋ฐฉํ ์ ์๋ ์๋ก์ด ๊ท์น์ ์ ์ํด์ค"
๋ง์น๋ฉฐ
์ด ์ฅ์์๋ CLAUDE.md๋ฅผ ํตํ ํ๋ก์ ํธ ๋ง์ถค ์ค์ ๋ฐฉ๋ฒ์ ์ฒด๊ณ์ ์ผ๋ก ํ์ตํ์ต๋๋ค.
ํต์ฌ ํ์ต ๋ด์ฉ
1. ์ ๋ต์ ์ค์ ๊ตฌ์ฑ
- ์ฐ์ ์์ ๊ธฐ๋ฐ ๊ท์น ๊ตฌ์กฐ: ์ค์๋์ ๋ฐ๋ฅธ ๋จ๊ณ์ ๊ท์น ์ ์ฉ
- ์ปจํ ์คํธ ์ธ์: ํ๋ก์ ํธ ํน์ฑ๊ณผ ํ ๋ฌธํ๋ฅผ ๋ฐ์ํ ๋ง์ถค ์ค์
- ํ๊ฒฝ๋ณ ์ต์ ํ: ๊ฐ๋ฐ/์คํ ์ด์ง/ํ๋ก๋์ ํ๊ฒฝ์ ๋ง๋ ์ฐจ๋ณํ๋ ์ ๊ทผ
2. ์ค์ฉ์ ์ด์ ๋ฐฉ๋ฒ
- ๋์ ์ ๋ฐ์ดํธ: ๊ท์น ๋ณ๊ฒฝ ์ ์ํฅ๋ ๋ถ์๊ณผ ์ ์ง์ ์ ์ฉ
- ์ง์์ ๊ฐ์ : ๋ฐ์ดํฐ ๊ธฐ๋ฐ์ ๊ท์น ํจ๊ณผ์ฑ ์ธก์ ๊ณผ ๊ฐ์
- ํ ํ์ ๊ฐํ: ๋ช ํํ ๊ฐ์ด๋๋ผ์ธ์ ํตํ ์ผ๊ด๋ ์ฝ๋ ํ์ง ์ ์ง
์ค๋ฌด ์ ์ฉ ๋ก๋๋งต
1๋จ๊ณ: ๊ธฐ๋ณธ CLAUDE.md ์์ฑ (1์ฃผ)
- ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๊ธฐ๋ณธ ์ฝ๋ฉ ์คํ์ผ ์ ์
- ํ์ ๋ณด์ ๊ท์น๊ณผ ํ์ง ๊ธฐ์ค ์ค์
- ํ ์ปค๋ฐ ๋ฉ์์ง ๊ท์น ํต์ผ
2๋จ๊ณ: ํ๊ฒฝ๋ณ ์ค์ ๋ถ๋ฆฌ (2์ฃผ)
- ๊ฐ๋ฐ/์คํ ์ด์ง/ํ๋ก๋์ ํ๊ฒฝ๋ณ ๊ท์น ์ธ๋ถํ
- ์๋ํ ์คํฌ๋ฆฝํธ์ CI/CD ์ค์ ํตํฉ
- ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ํ์คํ
3๋จ๊ณ: ๊ณ ๋ํ์ ์ต์ ํ (์ง์์ )
- ํ ํผ๋๋ฐฑ์ ๋ฐํ์ผ๋ก ํ ๊ท์น ๊ฐ์
- ์ฑ๋ฅ ๋ฉํธ๋ฆญ ๊ธฐ๋ฐ์ ํ์ง ๊ธฐ์ค ์กฐ์
- ์๋ก์ด ๊ธฐ์ ๋์ ์ ๊ฐ์ด๋๋ผ์ธ ์ ๋ฐ์ดํธ
CLAUDE.md์ ์ ๋ต์ ๊ฐ์น
- ์ผ๊ด์ฑ ๋ณด์ฅ: ๋ชจ๋ ํ์์ด ๋์ผํ ํ์ง ๊ธฐ์ค์ผ๋ก ์ฝ๋ ์์ฑ
- ํ์ต ๊ฐ์ํ: ์๋ก์ด ํ์์ ๋น ๋ฅธ ์จ๋ณด๋ฉ๊ณผ ์์ฐ์ฑ ํฅ์
- ์ง์ ์ฒด๊ณํ: ํ์ ์๋ฌต์ ์ง์์ ๋ช ์์ ๊ท์น์ผ๋ก ์ ํ
- ํ์ง ์๋ํ: ์๋ ๊ฒํ ์์ด๋ ์ผ์ ํ์ง ์ด์ ๋ณด์ฅ
- ๋ฌธํ ์ ํ: ํ์ ๊ฐ๋ฐ ์ฒ ํ๊ณผ ๊ฐ์น๊ด์ ์ฝ๋์ ๋ฐ์
์ค์ํ ๊ฒ์ CLAUDE.md๊ฐ ๋จ์ํ ๊ท์น ๋ฌธ์๊ฐ ์๋๋ผ, ํ์ ๊ฐ๋ฐ ๋ฌธํ์ ์ฒ ํ์ ๋ด์ ์ด์์๋ ๊ฐ์ด๋๋ถ์ด๋ผ๋ ์ ์ ๋๋ค. ์ ๊ธฐ์ ์ธ ์ ๋ฐ์ดํธ์ ์ง์์ ์ธ ๊ฐ์ ์ ํตํด ํ์ ์ฑ์ฅ๊ณผ ํจ๊ป ์งํํ๋ ๋๊ตฌ๋ก ํ์ฉํด์ผ ํฉ๋๋ค.
๋ค์ ์ฅ์์๋ ์ด๋ฌํ ์ค์ ์ ๋ฐํ์ผ๋ก ๋ค์ํ ํ๋ ์์ํฌ๋ณ๋ก Claude Code๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๊ตฌ์ฒด์ ์ธ ์ ๋ต๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค.
[S1ST2] Skills ์ค์น ๋ฐ ๊ตฌ์กฐ
- Skills ์ ์ฅ ์์น:
.claude/skills/๋๋ ํ ๋ฆฌ - ์คํฌ ์ค์น:
npx skills add - ์คํฌ ํ์ผ ๊ตฌ์กฐ: ๊ฐ ์คํฌ์ ๋ ๋ฆฝ ๋๋ ํ ๋ฆฌ์ prompt + ์ค์ ํ์ผ๋ก ๊ตฌ์ฑ
- ์ฌ์ฉ์ ์คํฌ:
~/.claude/skills/(์ ์ญ) ๋๋ ํ๋ก์ ํธ.claude/skills/(๋ก์ปฌ)
[S1ST3] Remote Control (์๊ฒฉ ์ฌ์ฉ) ์ค์ ๊ตฌ์กฐ
- SSH ๊ธฐ๋ฐ ์๊ฒฉ ์ ์:
claude --remoteํํ๋ก ์๊ฒฉ ๋จธ์ ์์ Claude Code ์คํ - ์๋ฒ ์ธก ์ค์ : Node.js + Claude Code ์ค์น, SSH ์ ์ ํ์ฉ ๊ตฌ์ฑ
- ํฌํธ ํฌ์๋ฉ: ๋ก์ปฌ โ ์๊ฒฉ ๊ฐ ํต์ ์ฑ๋ ๊ตฌ์ฑ
- ์๊ฒฉ ์ํฌ์คํ์ด์ค ์ง์ : ์๊ฒฉ ์๋ฒ์ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก ์ค์
[S1ST4] Memory (๋ฉ๋ชจ๋ฆฌ) ์ค์ ๊ตฌ์กฐ
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ ์์น:
~/.claude/projects/๋๋ ํ ๋ฆฌ/memory/ MEMORY.md: ํญ์ ์ปจํ ์คํธ์ ๋ก๋๋๋ ํต์ฌ ๋ฉ๋ชจ๋ฆฌ ํ์ผ (200์ค ์ ํ)- ํ ํฝ๋ณ ๋ถ๋ฆฌ:
debugging.md,patterns.md๋ฑ ์ธ๋ถ ์ฃผ์ ํ์ผ๋ก ๋ถ์ฐ ์ ์ฅ - MEMORY.md์์ ์ธ๋ถ ํ์ผ๋ก ๋งํฌํ์ฌ ์ฐธ์กฐ ๊ตฌ์กฐ ํ์ฑ
[S1ST5] .claudeignore โ ํ์ผ ์ ์ธ ๊ตฌ์กฐ
- ํ์ผ ์์น: ํ๋ก์ ํธ ๋ฃจํธ์
.claudeignoreํ์ผ ์์ฑ - ๋ฌธ๋ฒ: .gitignore์ ๋์ผ (glob ํจํด ์ฌ์ฉ)
- ์ฉ๋: ๋์ฉ๋ ๋ฐ์ด๋๋ฆฌ, ๋น๋ ์ฐ์ถ๋ฌผ, ๋ฏผ๊ฐ ์ ๋ณด ํ์ผ ๋ฑ์ AI ์ปจํ ์คํธ์์ ์ ์ธ
- ์:
node_modules/,.env,dist/,.log๋ฑ ํจํด ์ง์
[S1ST6] Doctor Command โ ํ๊ฒฝ ์ง๋จ ๋๊ตฌ
- ์ฌ์ฉ๋ฒ:
claude doctor๋ช ๋ น์ผ๋ก ํ์ฌ ํ๊ฒฝ ์ํ ์ง๋จ - ์ ๊ฒ ํญ๋ชฉ: Node.js ๋ฒ์ , API ํค ์ ํจ์ฑ, ๋คํธ์ํฌ ์ฐ๊ฒฐ, ์ค์ ํ์ผ ๋ฌด๊ฒฐ์ฑ
- ๋ฌธ์ ๋ฐ๊ฒฌ ์ ์๋์ผ๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ ์๋ด
- ์ค์น ์งํ ๋๋ ์ค๋ฅ ๋ฐ์ ์ ๊ฐ์ฅ ๋จผ์ ์คํํ ๋ช ๋ น์ด
[S1ST7] Status Line โ ์ํ ํ์์ค ์ปค์คํฐ๋ง์ด์ง
- Claude Code ํ๋จ ์ํ ํ์์ค์ ์ฌ์ฉ์ ์ ์ ๊ฐ๋ฅ
- ํ์ฌ ๋ชจ๋ธ, ํ ํฐ ์ฌ์ฉ๋, ์ธ์ ๋น์ฉ ๋ฑ ์ค์๊ฐ ํ์
- ์ค์ :
~/.claude/settings.json์์statusLineํ๋ ๊ตฌ์ฑ
[S1ST8] Keybindings โ ๋จ์ถํค ์ค์
- ํค๋ณด๋ ๋จ์ถํค๋ฅผ ์ฌ์ฉ์ ํ๊ฒฝ์ ๋ง๊ฒ ์ฌ๋งคํ ๊ฐ๋ฅ
- VS Code/JetBrains ํตํฉ ์ IDE ๋จ์ถํค์ ์ถฉ๋ ๋ฐฉ์ง ์ค์
- ์ค์ ํ์ผ์์ ํค ๋ฐ์ธ๋ฉ ์ปค์คํฐ๋ง์ด์ง
[S1ST9] Output Styles โ ์ถ๋ ฅ ์คํ์ผ ์ค์
- Claude Code ์๋ต์ ์ถ๋ ฅ ํ์์ ์ค์ :
--output-formatํ๋๊ทธ - ์ง์ ํ์: text, json, stream-json ๋ฑ
- ํ์ดํ๋ผ์ธ ์ฐ๋ ์ JSON ์ถ๋ ฅ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
[S1ST10] DevContainer โ ๊ฐ๋ฐ ์ปจํ ์ด๋ ํ๊ฒฝ
- Docker ๊ธฐ๋ฐ ๊ฐ๋ฐ ์ปจํ ์ด๋์์ Claude Code ์คํ ํ๊ฒฝ ๊ตฌ์ฑ
.devcontainer/devcontainer.json์์ Claude Code ํฌํจ ์ค์ - GitHub Codespaces, VS Code Dev Containers์ ํตํฉ
- ํ ์ ์ฒด๊ฐ ๋์ผํ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ณต์ ํ ์ ์๋ ๊ตฌ์กฐ
[S1ST11] LLM Gateway โ ์ํฐํ๋ผ์ด์ฆ LLM ๋ผ์ฐํ
- ๊ธฐ์ ํ๊ฒฝ์์ LLM ์์ฒญ์ ํ๋ก์/๊ฒ์ดํธ์จ์ด๋ฅผ ํตํด ๋ผ์ฐํ
- API ํค ์ค์ ๊ด๋ฆฌ, ์์ฒญ ๋ก๊น , ๋น์ฉ ํ ๋น ๋ฑ ์ํฐํ๋ผ์ด์ฆ ๊ธฐ๋ฅ
- ์ง์: AWS Bedrock, Google Vertex AI, Microsoft Foundry, ์ปค์คํ ๊ฒ์ดํธ์จ์ด
[S1ST12] Server Managed Settings โ ์๋ฒ ๊ด๋ฆฌ ์ค์
- ์กฐ์ง ๊ด๋ฆฌ์๊ฐ ์๋ฒ ์ธก์์ Claude Code ์ค์ ์ ์ค์ ๊ด๋ฆฌ (ํผ๋ธ๋ฆญ ๋ฒ ํ)
- ํ์ฉ ๋ชจ๋ธ, ๊ถํ ์ ์ฑ , MCP ์๋ฒ ๋ชฉ๋ก ๋ฑ์ ์๋ฒ์์ ์ผ๊ด ๋ฐฐํฌ
- ๊ฐ๋ณ ์ฌ์ฉ์์ ์ค์ ์ ์กฐ์ง ์ ์ฑ ์ผ๋ก ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅ
[S1ST13] Network Config โ ์ํฐํ๋ผ์ด์ฆ ๋คํธ์ํฌ ์ค์
- ๊ธฐ์ ํ๋ก์, ๋ฐฉํ๋ฒฝ ํ๊ฒฝ์์ Claude Code ๋คํธ์ํฌ ๊ตฌ์ฑ
- HTTP/HTTPS ํ๋ก์ ์ค์ , SSL ์ธ์ฆ์, ์ปค์คํ CA ๋ฒ๋ค ์ง์
- ์์ด๊ฐญ(air-gapped) ํ๊ฒฝ์์์ ์คํ๋ผ์ธ ์ค์ ๊ฐ์ด๋
[S1ST15] Output Styles ํ์ฅ โ ์ค๋ช ํ/ํ์ตํ
- explanatory ์คํ์ผ: ์ฝ๋์ ํจ๊ป ์์ธ ์ค๋ช ์ ์ ๊ณตํ๋ ์ถ๋ ฅ ๋ชจ๋
- learning ์คํ์ผ: ํ์ต ๋ชฉ์ ์ ์ต์ ํ๋ ๋จ๊ณ๋ณ ๊ต์กํ ์ถ๋ ฅ ๋ชจ๋
npx skills add anthropics/explanatory-output๋ฑ์ผ๋ก ์คํ์ผ ํ์ฅ ๊ฐ๋ฅ
[S1ST16] Books 1๊ถ โ ์์ ํ๊ฒฝ๊ณผ ํ์ฅ ๊ตฌ์กฐ
- 1๊ถ 06ํธ: ๋ฐ์คํฌํฑ ์ฑ โ Desktop ์ฑ ์ค์น ๋ฐ ๊ตฌ์กฐ
- 1๊ถ 08ํธ: IDE ๊ฒฐํฉ๊ณผ API ์ฐ๊ฒฐ โ VS Code, JetBrains ํตํฉ ๊ตฌ์กฐ
- 1๊ถ 13ํธ: ์์ ํ๊ฒฝ๊ณผ ํ์ฅ ์ํ๊ณ โ MCP, Skills, Plugins ์ ์ฒด ๊ตฌ์กฐ
- 1๊ถ 18ํธ: Commands โ ์ฌ๋์ ๋ช ๋ น์ด ๊ตฌ์กฐ ๋ฐ ์ฒด๊ณ
- 1๊ถ 19ํธ: Skills โ ์คํฌ ๊ตฌ์กฐ ๋ฐ ์ค์น ์ฒด๊ณ
- 1๊ถ 21ํธ: Hooks โ Hook ์์คํ ๊ตฌ์กฐ ๋ฐ ์ค์
- 1๊ถ 22ํธ: MCP โ MCP ํ๋กํ ์ฝ ๊ตฌ์กฐ ๋ฐ ์๋ฒ ์ฒด๊ณ
- 1๊ถ 23ํธ: Plugins โ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ ๊ตฌ์กฐ
- 1๊ถ 24ํธ: Memory์ ์ปจํ ์คํธ ๊ด๋ฆฌ โ MEMORY.md, auto memory, ์ปจํ ์คํธ ๊ตฌ์กฐ
- 1๊ถ 25ํธ: Mode์ Output Style โ ์คํ ๋ชจ๋, ์ถ๋ ฅ ํ์ ์ค์ ๊ตฌ์กฐ
- 1๊ถ 26ํธ: Settings โ settings.json, ๊ถํ ์ฒด๊ณ, ํ๊ฒฝ๋ณ์ ๊ตฌ์ฑ
- 1๊ถ 31ํธ: ๋ฌผ๋ฆฌ์ ์์ ํ๊ฒฝ ์ต์ ํ โ ๋์ผ ๋ชจ๋ํฐ, ํค๋ณด๋, ์์ ๊ณต๊ฐ ๊ตฌ์ฑ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S1ST17] Books 2๊ถ โ ๊ธฐ์ ์คํ ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 03ํธ: CLI ๋ช ๋ น์ค โ CLI ๊ธฐ์ด ๋ฐ ํฐ๋ฏธ๋ ์ฌ์ฉ๋ฒ
- 2๊ถ 04ํธ: ์ฝ๋ ์๋ํฐ์ IDE โ ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ ๊ธฐ์ด
- 2๊ถ 05ํธ: Git๊ณผ GitHub โ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ๊ตฌ์กฐ ์ดํด
- 2๊ถ 08ํธ: Language โ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 09ํธ: Framework โ ํ๋ ์์ํฌ ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 10ํธ: Styling โ CSS/๋์์ธ ์์คํ ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 11ํธ: State Management โ ์ํ ๊ด๋ฆฌ ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 12ํธ: Database โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 13ํธ: Hosting โ ํธ์คํ /๋ฐฐํฌ ํ๊ฒฝ ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 14ํธ: External Service โ ์ธ๋ถ ์๋น์ค ์ฐ๋ ๊ธฐ์ด ๊ตฌ์กฐ
- 2๊ถ 25ํธ: HTML ์ฌํ โ HTML ๊ตฌ์กฐ ์ค๊ณ ๊ธฐ์ด
- 2๊ถ 26ํธ: CSS ์ฌํ โ CSS ์ํคํ ์ฒ ๊ธฐ์ด
- 2๊ถ 27ํธ: JavaScript ์ฌํ โ JS ํจํด ๊ธฐ์ด
- 2๊ถ 28ํธ: Node.js โ ์๋ฒ์ฌ์ด๋ ํ๊ฒฝ ๊ธฐ์ด
- 2๊ถ 29ํธ: Git ์ฌํ โ Git ๊ณ ๊ธ ๊ฐ๋ ๊ธฐ์ด
- 2๊ถ 30ํธ: Supabase ์ฌํ โ Supabase ๊ธฐ์ด ๊ตฌ์กฐ (ํ ์ด๋ธ, RLS)
- 2๊ถ 31ํธ: ๋๋ฉ์ธ ์ฌํ โ ๋๋ฉ์ธ ๊ตฌ์ฑ ๊ธฐ์ด
- 2๊ถ 32ํธ: Vercel ์ฌํ โ Vercel ๋ฐฐํฌ ๊ธฐ์ด
- 2๊ถ 33ํธ: Resend ์ฌํ โ ์ด๋ฉ์ผ ์์คํ ๊ธฐ์ด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/2๊ถ_ํ์คํ_์น์ฌ์ดํธ_๊ฐ๋ฐ_๊ธฐ์ด์ง์/
[S1ST18] Books 3๊ถ โ SAL Grid ๊ตฌ์กฐ ์ดํด
- 3๊ถ 02ํธ: 22๊ฐ ์์ฑ ์ ์ โ SAL Grid 22๊ฐ ์์ฑ ๊ตฌ์กฐ ์ดํด
- 3๊ถ 03ํธ: 5x11 Matrix โ Stage ร Area ๋งคํธ๋ฆญ์ค ๊ตฌ์กฐ ์ดํด
- 3๊ถ 08ํธ: Supabase HTML Viewer โ Viewer ๊ตฌ์กฐ ์ดํด
- 3๊ถ 12ํธ: Orders Reports JSON ์์คํ โ JSON ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ดํด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/3๊ถ_ํ๋ก์ ํธ_๊ด๋ฆฌ_๋ฐฉ๋ฒ/
[S1ST19] ์ค์ Tips โ ์ค์น/์์/๊ฐ๋ฐ/DB
Claude_Code_์ค์น_์คํ/โ ์ค์น ๋ฐฉ๋ฒ, Node.js/Git ์ฌ์ ์ค์น, ํฐ๋ฏธ๋ ์คํ, ์ญ์ /์ด๊ธฐํ (4๊ฐ)ํ๋ก์ ํธ_์์/โ CLAUDE.md ์ ๋ฆฌ, Dev Package, ๋๋ ํฐ๋ฆฌ ๊ตฌ์กฐ, ์์ ๋๋ ํ ๋ฆฌ, ์งํ์ํฉ ๋ฌธ์ (5๊ฐ)๊ฐ๋ฐ_์ค๋ฌด/โ ํ์ผ ์์น, ํ์ผ ์ ์ฅ, ํ์ผ๋ช ๊ท์น ๊ด๋ จ (14๊ฐ ์ค ๊ด๋ จ)๋ฐ์ดํฐ๋ฒ ์ด์ค/โ Supabase CRUD, SQL ์ฃผ์, RLS, ์ฟผ๋ฆฌ ์ต์ ํ (4๊ฐ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S1ST20] ์ธ๋ถ ์ฐ๋ Guide โ 5๋ ์๋น์ค ์ค์ ๊ธฐ์ด
- 01. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ โ Supabase ํ๋ก์ ํธ ์์ฑ ๋ฐ ์ฐ๊ฒฐ ๊ธฐ์ด
- 02. ํ์์ธ์ฆ ์ค์ โ OAuth Provider ์ค์ ๊ธฐ์ด
- 03. ์ด๋ฉ์ผ ์์คํ ์ค์ โ Resend ์ฐ๋ ๊ธฐ์ด
- 04. ๋ฐฐํฌ ๋๋ฉ์ธ ์ค์ โ Vercel ๋ฐฐํฌ ๋ฐ ๋๋ฉ์ธ ์ฐ๊ฒฐ ๊ธฐ์ด
- 05. ๊ฒฐ์ ์์คํ ์ค์ โ Toss Payments ์ฐ๋ ๊ธฐ์ด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /์ธ๋ถ_์ฐ๋_์ค์ _Guide/
[S1ST21] .claude ์ฐธ๊ณ โ Commands/Rules/References
- commands: 15๊ฐ ๋ช
๋ น์ด ๋ชฉ๋ก ๋ฐ ์ฉ๋ ๊ฐ์ โ
api-design,build-web,commit,debug,deploy,deploy-check,docs-gen,evaluate,optimize,perf-test,refactor,review,security-audit,test,test-gen - references:
MOAI_ADK_Hooks_์ฐธ๊ณ .md,MOAI_ADK_Skills_์ฐธ๊ณ .mdโ ADK ํ์ผ ๊ตฌ์กฐ์ ์ญํ ์๊ฐ - rules: 7๊ฐ ๊ท์น ํ์ผ์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ํ์ โ ํ์ผ๋ช ๋ช , ์ ์ฅ์์น, Area/Stage, Grid์์ฑ, ์คํํ๋ก์ธ์ค, ๊ฒ์ฆ, Task CRUD
๐ ๊ฒฝ๋ก:.claude/commands/,.claude/references/,.claude/rules/
S1WF โ ์ํฌํ๋ก์ฐ (Workflow)
[S1WF1(์น์ 25b)] ํ๊ฒฝ ์ค์ & ์ฒซ ํ๋ก์ ํธ
์ 2์ฅ: ์ค์น์ ์ด๊ธฐ ์ค์
"์์์ด ๋ฐ์ด๋ค" - ํ๊ตญ ์๋ด
์ด์ Claude Code๋ฅผ ์ค์นํด๋ณด๊ฒ ์ต๋๋ค. ์ด ์ฅ์์๋ ๊ฐ ์ด์์ฒด์ ๋ณ๋ก ๋จ๊ณ๋ณ ์ค์น ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ค์น ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ ํจ๊ป ๋ค๋ฃน๋๋ค.
2.1 ์์คํ ์๊ตฌ์ฌํญ
์ต์ ์๊ตฌ์ฌํญ
๋จผ์ ์์คํ ์ด Claude Code๋ฅผ ์คํํ ์ ์๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. ์ต์ ์๊ตฌ์ฌํญ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ์ ์ฌํ๋ฉฐ, ๋๋ถ๋ถ์ ํ๋์ ์ธ ์์คํ ์์ ์คํ ๊ฐ๋ฅํฉ๋๋ค.
| ๊ตฌ์ฑ ์์ | ์ต์ ์๊ตฌ์ฌํญ | ๊ถ์ฅ ์ฌํญ | |
|---|---|---|---|
| ์ด์์ฒด์ | macOS 12+, Windows 10+, Ubuntu 20.04+ | ์ต์ ๋ฒ์ | |
| RAM | 8GB | 16GB ์ด์ | |
| ์ ์ฅ๊ณต๊ฐ | 2GB ์ฌ์ ๊ณต๊ฐ | 10GB ์ด์ | |
| ์ธํฐ๋ท | ์์ ์ ์ธ ์ฐ๊ฒฐ ํ์ | ๊ณ ์ ์ธํฐ๋ท | |
| Node.js | 18.0 ์ด์ | 20.0 ์ด์ |
์ฌ์ ์ค๋น์ฌํญ
์ค์น ์ ์์คํ ํ๊ฒฝ์ ํ์ธํ๊ฒ ์ต๋๋ค. ํฐ๋ฏธ๋์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ด๋ค์ ์คํํ์ฌ ํ์ํ ๋๊ตฌ๋ค์ด ์ค์น๋์ด ์๋์ง ํ์ธํ์ธ์.
ํฐ๋ฏธ๋ ์คํ ๋ฐฉ๋ฒ
- Mac:
Cmd + Spaceโ "ํฐ๋ฏธ๋" ๊ฒ์ - Windows:
Win + Rโ "cmd" ์ ๋ ฅ - Linux:
Ctrl + Alt + T
# Node.js ๋ฒ์ ํ์ธ
node --version
# npm ๋ฒ์ ํ์ธ
npm --version
# Git ์ค์น ํ์ธ (์ ํ์ฌํญ์ด์ง๋ง ๊ถ์ฅ)
git --version
Node.js๊ฐ ์ค์น๋์ด ์์ง ์๊ฑฐ๋ ๋ฒ์ ์ด ๋ฎ๋ค๋ฉด
- Node.js ๊ณต์ ์ฌ์ดํธ์์ LTS ๋ฒ์ ์ ๋ค์ด๋ก๋ํ์ธ์
- ๋๋ ํจํค์ง ๋งค๋์ ๋ฅผ ์ฌ์ฉํ์ธ์
- Mac:
brew install node(Homebrew ํ์) - Windows:
choco install nodejs(Chocolatey ํ์) - Linux:
sudo apt install nodejs npm(Ubuntu/Debian)
๊ถ์ฅ์ฌํญ: LTS(Long Term Support) ๋ฒ์ ์ ์ฌ์ฉํ๋ฉด ์์ ์ฑ๊ณผ ํธํ์ฑ์ ๋ณด์ฅ๋ฐ์ ์ ์์ต๋๋ค.
2.2 ์ค์น ๊ฐ์ด๋ (OS๋ณ)
์ด์ ์ด์์ฒด์ ๋ณ๋ก Claude Code๋ฅผ ์ค์นํ๊ฒ ์ต๋๋ค. ๊ฐ OS์ ์ต์ ํ๋ ์ค์น ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
macOS์์ ์ค์นํ๊ธฐ
macOS์์๋ ๋ ๊ฐ์ง ์ค์น ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๋ฐฉ๋ฒ 1: npm์ ํตํ ์ค์น (๊ถ์ฅ)
๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์์ ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
# Claude Code ์ค์น
npm install -g @anthropic-ai/claude-code
# ์ค์น ํ์ธ
claude --version
๋ฐฉ๋ฒ 2: Homebrew๋ฅผ ํตํ ์ค์น
# Homebrew tap ์ถ๊ฐ
brew tap anthropic-ai/claude-code
# Claude Code ์ค์น
brew install claude-code
# ์ค์น ํ์ธ
claude --version
macOS ํนํ ์ค์
# ํฐ๋ฏธ๋ ๊ถํ ์ค์ (ํ์ํ ๊ฒฝ์ฐ)
# ์์คํ
ํ๊ฒฝ์ค์ > ๋ณด์ ๋ฐ ๊ฐ์ธ์ ๋ณด > ๊ฐ์ธ์ ๋ณด > ์ ์ฒด ๋์คํฌ ์ ๊ทผ ๊ถํ
# Terminal.app ๋๋ ์ฌ์ฉ ์ค์ธ ํฐ๋ฏธ๋ ์ฑ ์ถ๊ฐ
# Spotlight ๊ฒ์ ์ ์ธ (์ ํ์ฌํญ)
# .claude-code ๋๋ ํ ๋ฆฌ๋ฅผ Spotlight ๊ฒ์์์ ์ ์ธํ์ฌ ์ฑ๋ฅ ํฅ์
Windows์์ ์ค์นํ๊ธฐ
Windows์์๋ WSL 2(Windows Subsystem for Linux)๋ฅผ ํตํด Claude Code๋ฅผ ์ค์นํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค. ํ์ฌ Claude Code๋ Windows ๋ค์ดํฐ๋ธ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก, Linux ํ๊ฒฝ์ด ํ์ํฉ๋๋ค.
์์คํ ์๊ตฌ์ฌํญ
| ํญ๋ชฉ | ์ต์ ์กฐ๊ฑด | |
|---|---|---|
| OS | Windows 10 (21H2) ๋๋ Windows 11 + WSL 2 | |
| RAM | 4GB ์ด์ | |
| ๋คํธ์ํฌ | ์ธํฐ๋ท ์ฐ๊ฒฐ (OAuth ์ธ์ฆ ๋ฐ API ํธ์ถ) | |
| ์ํํธ์จ์ด | WSL 2, Node.js 18+, Git(์ ํ์ฌํญ) |
1๋จ๊ณ: WSL 2 ์ค์น
PowerShell์ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํํ๊ณ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ธ์.
# WSL ์ค์น (Ubuntu 22.04 LTS ๊ธฐ๋ณธ ํฌํจ)
wsl --install
# ์ค์น ํ ์์คํ
์ฌ๋ถํ
๊ธฐ์กด์ WSL 1์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทธ๋ ์ด๋ํ์ธ์.
# WSL 2๋ก ์
๊ทธ๋ ์ด๋
wsl --set-version Ubuntu 2
# ์ค์น ์ํ ํ์ธ
wsl --status
wsl --list --verbose
2๋จ๊ณ: Node.js ์ค์น (WSL ๋ด๋ถ)
WSL ํฐ๋ฏธ๋(Ubuntu)์ ์ด๊ณ NVM์ ํตํด Node.js๋ฅผ ์ค์นํ์ธ์.
# NVM ์ค์น
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# ๋ณ๊ฒฝ์ฌํญ ์ ์ฉ
source ~/.bashrc
# Node.js 18 LTS ์ค์น ๋ฐ ์ฌ์ฉ
nvm install 18
nvm use 18
# ์ค์น ํ์ธ
node --version
npm --version
์ค์:which node๋ช ๋ น ์คํ ์ ๊ฒฝ๋ก๊ฐ/home/์ผ๋ก ํ์๋์ด์ผ ํฉ๋๋ค./.nvm/... /mnt/c/...๊ฒฝ๋ก๊ฐ ๋ํ๋๋ฉด Windows์ ๊ฒฝ๋ก๊ฐ ์ถฉ๋ํ๋ ์ํฉ์ด๋ฏ๋ก ์ ๊ณผ์ ์ ๋ค์ ์งํํ์ธ์.
3๋จ๊ณ: Claude Code ์ค์น
# Claude Code ์ค์น
npm install -g @anthropic-ai/claude-code
# ์ค์น ํ์ธ
claude --version
์ค์น ์ค๋ฅ ํด๊ฒฐ
| ์ค๋ฅ | ํด๊ฒฐ๋ฐฉ๋ฒ | |
|---|---|---|
OS detection failed | npm config set os linux ์คํ ํ npm install -g @anthropic-ai/claude-code --force --no-os-check | |
exec: node: not found | Node.js ์ค์น ์ฌํ์ธ, which node ๊ฒฝ๋ก ์ ๊ฒ | |
| ๊ถํ ์ค๋ฅ | npm config set prefix '~/.npm-global' ์คํ ํ ์ฌ์ค์น |
Linux (Ubuntu/Debian)์์ ์ค์นํ๊ธฐ
# ์์คํ
ํจํค์ง ์
๋ฐ์ดํธ
sudo apt update && sudo apt upgrade
# Node.js ์ค์น (์์ง ์๋ ๊ฒฝ์ฐ)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs
# Claude Code ์ค์น
sudo npm install -g @anthropic-ai/claude-code
# ์ค์น ํ์ธ
claude --version
# ๊ถํ ์ค์ (ํ์ํ ๊ฒฝ์ฐ)
sudo chmod +x /usr/local/bin/claude
2.3 ์ฒซ ๋ฒ์งธ ๋ช ๋ น์ด ์คํํ๊ธฐ
์ค์น๊ฐ ์๋ฃ๋์์ต๋๋ค. ์ด์ Claude Code์ ๊ธฐ๋ณธ ์ค์ ์ ์งํํ๊ฒ ์ต๋๋ค.
API ํค ์ค์
Claude Code๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด API ํค ์ค์ ์ด ํ์ํฉ๋๋ค. ๋ฌด๋ฃ ์ฌ์ฉ๋์ผ๋ก ์์ํ ์ ์์ต๋๋ค.
1๋จ๊ณ: API ํค ๋ฐ๊ธ๋ฐ๊ธฐ
- Anthropic Console์ ์ ์ํ์ธ์
- ๊ณ์ ์ ๋ง๋ค๊ฑฐ๋ ๋ก๊ทธ์ธํ์ธ์
- "API Keys" ์น์ ์์ ์ ํค๋ฅผ ์์ฑํ์ธ์
2๋จ๊ณ: API ํค ์ค์ ํ๊ธฐ
# API ํค ์ค์ ๋ช
๋ น์ด ์คํ
claude login
# ํ๋กฌํํธ๊ฐ ๋ํ๋๋ฉด ๋ณต์ฌํ API ํค๋ฅผ ๋ถ์ฌ๋ฃ๊ธฐ
# (ํค๋ฅผ ์
๋ ฅํ ๋๋ ํ๋ฉด์ ํ์๋์ง ์๋ ๊ฒ์ด ์ ์์
๋๋ค)
๋ณด์ ์ฃผ์์ฌํญ: API ํค๋ ๊ฐ์ธ ๊ณ์ ๊ณผ ์ฐ๊ฒฐ๋๋ฏ๋ก ํ์ธ๊ณผ ๊ณต์ ํ์ง ์๋๋ก ์ฃผ์ํ์ธ์.
์ฒซ ๋ฒ์งธ ๋ํ
์ด์ Claude Code์ ์ฒซ ๋ํ๋ฅผ ์์ํด๋ณด๊ฒ ์ต๋๋ค.
# ์ฒซ ์ธ์ฌ (Claude๊ฐ ๋ต๋ณํ๋ฉด ์ฑ๊ณต!)
claude "์๋
ํ์ธ์, Claude! ์ฒ์ ๋ต๊ฒ ์ต๋๋ค."
# ๊ฐ๋จํ ์์
์์ฒญํด๋ณด๊ธฐ
claude "ํ์ฌ ์์คํ
์ ๋ณด๋ฅผ ์๋ ค์ฃผ์ธ์"
# ๋๋ ํ ๋ฆฌ ํ์ํด๋ณด๊ธฐ
claude "ํ์ฌ ํด๋์ ์ด๋ค ํ์ผ๋ค์ด ์๋์ง ๋ณด์ฌ์ฃผ์ธ์"
์๋ต์ด ์ ์์ ์ผ๋ก ์ถ๋ ฅ๋๋ฉด ์ค์น์ ๊ธฐ๋ณธ ์ค์ ์ด ์๋ฃ๋ ๊ฒ์ ๋๋ค. Claude Code ์ฌ์ฉ ์ค๋น๊ฐ ์๋ฃ๋์์ต๋๋ค.
๋ํํ ๋ชจ๋ vs ๋ช ๋ น ๋ชจ๋
๋ช ๋ น ๋ชจ๋ (์ผํ์ฑ ์์ )
claude "package.json ํ์ผ์ ์ฝ๊ณ ์์ฝํด์ค"
๋ํํ ๋ชจ๋ (์ง์์ ์ธ ์์ )
๋ช ๋ น ๋ชจ๋๋ ๋จ๋ฐ์ฑ ์์ ์ ์ ํฉํ์ง๋ง, ๋ณต์กํ ํ๋ก์ ํธ๋ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ ์์ ์๋ ๋ํํ ๋ชจ๋๊ฐ ๋ ํจ์จ์ ์ ๋๋ค.
# ๋ํํ ๋ชจ๋ ์์
claude
# ์ด์ ์ง์์ ์ผ๋ก ๋ํ ๊ฐ๋ฅ
> ์๋ก์ด React ํ๋ก์ ํธ๋ฅผ ์์ํ๊ณ ์ถ์ด
> TypeScript๋ฅผ ์ฌ์ฉํ๊ณ , ํ
์คํธ ํ๊ฒฝ๋ ์ค์ ํด์ค
> Material-UI๋ ์ถ๊ฐํด์ค
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph LR
subgraph interactive ["๋ํํ ๋ชจ๋์ ์ฅ์ "]
A["์ปจํ
์คํธ ์ ์ง<br/>์ด์ ๋ํ ๋ด์ฉ ๊ธฐ์ต"]
B["๋จ๊ณ์ ๊ฐ์ <br/>์ ์ง์ ์๊ตฌ์ฌํญ ์กฐ์ "]
C["ํจ์จ์ ํ์
<br/>๋ํ๋ฅผ ํตํ ๊ตฌ์ฒดํ"]
A --> B
B --> C
C --> A
end
classDef advantageStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
class A,B,C advantageStyle
๋ํํ ๋ชจ๋์ ์ฅ์
- claude-code-setup ํ๋ฌ๊ทธ์ธ: ์ ์ ์๋ํ + ์ต์ ์ค์ ์ถ์ฒ
[S1WF22] ํ๊ฒฝ ์ค์ โ ๊ธฐ๋ณธ ์ค์ ์ต์ ํ & ๋ฌธ์ ํด๊ฒฐ
2.4 ๊ธฐ๋ณธ ์ค์ ์ต์ ํ
Claude Code๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ฐ์ธ์ ์์ ํ๊ฒฝ๊ณผ ์ ํธ๋์ ๋ง๊ฒ ์ค์ ์ ์กฐ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ์น์ ์์๋ ์ฃผ์ ์ค์ ์ต์ ๋ค๊ณผ ์ต์ ํ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ ์ญ ์ค์ ํ์ผ
Claude Code์ ๋ชจ๋ ์ค์ ์ ํ ๋๋ ํ ๋ฆฌ์ ์ค์ ํ์ผ์์ ๊ด๋ฆฌ๋ฉ๋๋ค. ์ด ํ์ผ์ ํตํด ๊ฐ์ธํ๋ ์์ ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์ค์ ํ์ผ ์์น: ~/.claude/settings.json
{
"api_key": "sk-ant-...", // API ์ธ์ฆ ํค
"default_model": "claude-3-opus-20240229", // ๊ธฐ๋ณธ ์ฌ์ฉ ๋ชจ๋ธ
"theme": "dark", // ์ธํฐํ์ด์ค ํ
๋ง (dark/light)
"editor": "vscode", // ์ ํธ ์๋ํฐ
"auto_commit": false, // ์๋ ์ปค๋ฐ ์ฌ๋ถ
"language": "ko", // ๊ธฐ๋ณธ ์ธ์ด ์ค์
"permissions": {
"file_write": true, // ํ์ผ ์ฐ๊ธฐ ๊ถํ
"file_read": true, // ํ์ผ ์ฝ๊ธฐ ๊ถํ
"command_execution": true // ๋ช
๋ น ์คํ ๊ถํ
}
}
์ฃผ์ ์ค์ ์ต์ ์ค๋ช
default_model: ์์ ์ ํ์ ๋ฐ๋ผ ์ ์ ํ ๋ชจ๋ธ ์ ํ (opus: ๋ณต์กํ ์์ , sonnet: ์ผ๋ฐ ์์ , haiku: ๋น ๋ฅธ ์๋ต)auto_commit: ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก Git ์ปค๋ฐํ ์ง ๊ฒฐ์ permissions: ๋ณด์์ ์ํด ํ์ํ ๊ถํ๋ง ํ์ฑํํ๋ ๊ฒ์ ๊ถ์ฅ
๊ถํ ์ค์
Claude Code๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๋ฏ๋ก ์ ์ ํ ๊ถํ ๊ด๋ฆฌ๊ฐ ์ค์ํฉ๋๋ค. ์์ ํ๊ฒฝ๊ณผ ๋ณด์ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๊ถํ์ ์กฐ์ ํ ์ ์์ต๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph TB
subgraph permissions ["๊ถํ ์ ํ๋ณ ์ค๋ช
"]
direction TB
A["file_read<br/>ํ๋ก์ ํธ ํ์ผ ์ฝ๊ธฐ<br/>์ฝ๋ ๋ถ์, ๋ฆฌ๋ทฐ์ ํ์"]
B["file_write<br/>ํ์ผ ์์ฑ ๋ฐ ์์ <br/>๊ฐ๋ฐ ์์
์ ํ์"]
C["command_execution<br/>์์คํ
๋ช
๋ น ์คํ<br/>๋น๋, ํ
์คํธ ๋ฑ์ ํ์"]
A --> B
B --> C
end
classDef permissionStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C permissionStyle
๊ถํ ์ ํ๋ณ ์ค๋ช
๋ณด์๊ณผ ํธ์์ฑ์ ๊ท ํ์ ์ํ ๊ถํ ์ค์ ์ ๋ต
# ๋ชจ๋ ๊ถํ ํ์ฉ (๊ฐ๋ฐ ํ๊ฒฝ, ์ฃผ์ ํ์)
claude --dangerously-skip-permissions
# ํน์ ๋๊ตฌ๋ง ํ์ฉ (settings.json์์ ์ค์ )
# allowedTools / disallowedTools ํ๋ ์ฌ์ฉ
# ๊ถํ ํ์ธ ๋ชจ๋ (๊ธฐ๋ณธ๊ฐ โ ์ํ ์์
์ ์ฌ์ฉ์ ํ์ธ)
claude
์๋ํฐ ํตํฉ
๊ฐ๋ฐ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด Claude Code๋ฅผ ๊ธฐ์กด ์๋ํฐ์ ํตํฉํ ์ ์์ต๋๋ค. ์๋ํฐ ํตํฉ์ ํตํด ์ฝ๋ ํธ์ง๊ณผ AI ์ง์์ ์ํํ๊ฒ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph LR
subgraph editors ["์ง์๋๋ ์๋ํฐ"]
A["Visual Studio Code<br/>๊ฐ์ฅ ์์ ํ ํตํฉ ์ง์"]
B["Vim/Neovim<br/>ํฐ๋ฏธ๋ ๊ธฐ๋ฐ ์ํฌํ๋ก์ฐ"]
C["JetBrains IDEs<br/>IntelliJ, PyCharm ๋ฑ"]
D["Sublime Text<br/>๊ฒฝ๋ ์๋ํฐ"]
end
classDef editorStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
class A,B,C,D editorStyle
์ง์๋๋ ์๋ํฐ
์ ํธํ๋ ์๋ํฐ์ ํตํฉ ์ค์
# VSCode ํตํฉ
claude config set editor vscode
# Vim ํตํฉ
claude config set editor vim
# ์๋ํฐ์์ ์ง์ Claude Code ํธ์ถ
# VSCode: Cmd+Shift+P > "Claude: Ask"
ํ๋ก์ ์ค์ (๊ธฐ์ ํ๊ฒฝ)
๋ง์ ๊ธฐ์ ์์๋ ๋ณด์์์ ์ด์ ๋ก ํ๋ก์ ์๋ฒ๋ฅผ ํตํด ์ธ๋ถ ์ธํฐ๋ท์ ์ ์ํฉ๋๋ค. Claude Code๋ ์ด๋ฐ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ก์ ์ค์ ์ ์ง์ํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
flowchart TD
A["ํ๋ก์ ์ค์ ์ด ํ์ํ ๊ฒฝ์ฐ"]
A --> B["ํ์ฌ ๋ฐฉํ๋ฒฝ ๋ค์์<br/>์์
ํ๋ ๊ฒฝ์ฐ"]
A --> C["VPN์ ํตํด ํ์ฌ ๋คํธ์ํฌ์<br/>์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ"]
A --> D["ํน์ ๋ณด์ ์ ์ฑ
์ด ์ ์ฉ๋<br/>๋คํธ์ํฌ ํ๊ฒฝ"]
classDef caseStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef rootStyle fill:#e2e8f0,stroke:#334155,stroke-width:3px,color:#1e293b
class A rootStyle
class B,C,D caseStyle
ํ๋ก์ ์ค์ ์ด ํ์ํ ๊ฒฝ์ฐ
๊ธฐ์ ํ๊ฒฝ์์ ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ์ค์ ๋ฐฉ๋ฒ
# HTTP ํ๋ก์ ์ค์
export HTTP_PROXY=http://proxy.company.com:8080
export HTTPS_PROXY=http://proxy.company.com:8080
# Claude Code ์ ์ฉ ํ๋ก์ ์ค์
claude config set proxy http://proxy.company.com:8080
2.5 ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋
Claude Code ์ค์น ๋ฐ ์ด๊ธฐ ์ฌ์ฉ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ์ต๋๋ค. ๋ฌธ์ ์ํฉ๋ณ๋ก ๋จ๊ณ์ ์ธ ํด๊ฒฐ ๋ฐฉ์์ ์ ์ํ๋ฏ๋ก, ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐ๋ผํ๋ฉด ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ค์์ Claude Code ์ฌ์ฉ์๋ค์ด ๊ฐ์ฅ ์์ฃผ ๊ฒฝํํ๋ ๋ฌธ์ ๋ค๊ณผ ๊ฒ์ฆ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ๋ค์ ๋๋ค.
1. "command not found: claude"
์ด ์ค๋ฅ๋ Claude Code๊ฐ ์ค์น๋์์ง๋ง ์์คํ PATH์ ๋ฑ๋ก๋์ง ์์์ ๋ ๋ฐ์ํฉ๋๋ค.
์์ธ ๋ถ์
- npm ์ ์ญ ์ค์น ๊ฒฝ๋ก๊ฐ PATH์ ํฌํจ๋์ง ์์
- ์๋ชป๋ ์ค์น ๊ฒฝ๋ก
- Shell ํ๊ฒฝ ๋ณ์ ์ค์ ๋ฌธ์
ํด๊ฒฐ ๋ฐฉ๋ฒ
# 1๋จ๊ณ: npm ์ ์ญ ๊ฒฝ๋ก ํ์ธ
npm config get prefix
# 2๋จ๊ณ: PATH์ ์ถ๊ฐ (bash/zsh)
echo 'export PATH="$PATH:$(npm config get prefix)/bin"' >> ~/.bashrc
source ~/.bashrc
# 3๋จ๊ณ: ์ค์น ํ์ธ
claude --version
์ถ๊ฐ ํด๊ฒฐ์ฑ
- macOS์์
.zshrcํ์ผ ์์ ํ์ํ ์ ์์ - Windows์์๋ ์์คํ ํ๊ฒฝ ๋ณ์์์ PATH ์์
2. "EACCES: permission denied"
์ด ์ค๋ฅ๋ npm ์ ์ญ ์ค์น ์ ๊ถํ ๋ฌธ์ ๋ก ๋ฐ์ํฉ๋๋ค. ํนํ Linux๋ macOS์์ ์์ฃผ ๋ํ๋ฉ๋๋ค.
์์ธ ๋ถ์
- npm ์ ์ญ ๋๋ ํ ๋ฆฌ์ ๋ํ ์ฐ๊ธฐ ๊ถํ ๋ถ์กฑ
- sudo๋ก ์ค์นํ์ ๋ ์์ ๊ถ ๋ฌธ์
- ์์คํ ๋ณดํธ๋ ๋๋ ํ ๋ฆฌ์ ์ค์น ์๋
ํด๊ฒฐ ๋ฐฉ๋ฒ
# ๋ฐฉ๋ฒ 1: ๊ถํ ์์ (๊ถ์ฅ)
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
# ๋ฐฉ๋ฒ 2: npx๋ฅผ ํตํ ์คํ (์์ ํด๊ฒฐ)
npx @anthropic-ai/claude-code
# ๋ฐฉ๋ฒ 3: npm ์ ์ญ ๋๋ ํ ๋ฆฌ ๋ณ๊ฒฝ
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
3. "API rate limit exceeded"
API ์ฌ์ฉ๋ ์ ํ์ ๋๋ฌํ์ ๋ ๋ฐ์ํ๋ ์ค๋ฅ์ ๋๋ค. Anthropic์ API ์ ์ฑ ์ ๋ฐ๋ผ ์๊ฐ๋น ์์ฒญ ํ์๊ฐ ์ ํ๋ฉ๋๋ค.
์์ธ ๋ถ์
- ๋จ์๊ฐ ๋ด ๋๋ฌด ๋ง์ ์์ฒญ
- API ํ๋์ ์ฌ์ฉ๋ ํ๊ณ ๋๋ฌ
- ๋คํธ์ํฌ ๋ฌธ์ ๋ก ์ธํ ์ค๋ณต ์์ฒญ
ํด๊ฒฐ ๋ฐฉ๋ฒ
# 1๋จ๊ณ: ํ์ฌ ์ํ ํ์ธ
claude status
# 2๋จ๊ณ: ์๋ ์ฌ์๋ ๊ฐ๊ฒฉ ์ค์ (๋ฐ๋ฆฌ์ด)
claude config set retry_delay 5000
# 3๋จ๊ณ: ์ต๋ ์ฌ์๋ ํ์ ์ค์
claude config set max_retries 3
์๋ฐฉ ๋ฐฉ๋ฒ
- ๋์ฉ๋ ์์ ์ ์์ ๋จ์๋ก ๋ถํ ํ์ฌ ์คํ
--rate-limit์ต์ ์ฌ์ฉํ์ฌ ์์ฒญ ์๋ ์กฐ์ - API ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง์ผ๋ก ์ ํ ์ฌ์ ํ์
4. "SSL certificate problem"
๊ธฐ์ ํ๊ฒฝ์์ ์์ฒด ์ธ์ฆ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋คํธ์ํฌ ๋ณด์ ์ ์ฑ ์ผ๋ก ์ธํด SSL ์ธ์ฆ์ ๊ฒ์ฆ์ ์คํจํ ๋ ๋ฐ์ํฉ๋๋ค.
์์ธ ๋ถ์
- ํ์ฌ ๋ฐฉํ๋ฒฝ์ SSL ๊ฒ์ฌ
- ์์ฒด ์๋ช ๋ ์ธ์ฆ์ ์ฌ์ฉ
- ์ค๋๋ ์์คํ ์ ์ธ์ฆ์ ์ ์ฅ์ ๋ฌธ์
ํด๊ฒฐ ๋ฐฉ๋ฒ
# โ ๏ธ ์์ ํด๊ฒฐ์ฑ
(๋ณด์ ์ํ ์์)
export NODE_TLS_REJECT_UNAUTHORIZED=0
# โ
๊ถ์ฅ ํด๊ฒฐ์ฑ
: ํ์ฌ ์ธ์ฆ์ ์ค์น
# 1๋จ๊ณ: IT ๋ถ์์์ ์ธ์ฆ์ ํ์ผ ๋ฐ๊ธฐ
# 2๋จ๊ณ: npm์ ์ธ์ฆ์ ๋ฑ๋ก
npm config set cafile /path/to/company-cert.pem
# 3๋จ๊ณ: Claude Code ์ ์ฉ ์ค์
claude config set tls_verify true
claude config set ca_bundle /path/to/company-cert.pem
๋ณด์ ๊ณ ๋ ค์ฌํญ
NODE_TLS_REJECT_UNAUTHORIZED=0์ ๋ณด์ ์ํ์ด ์์ผ๋ฏ๋ก ์์๋ก๋ง ์ฌ์ฉ- ๊ฐ๋ฅํ๋ฉด IT ๋ถ์์ ํ๋ ฅํ์ฌ ์ ์ ํ ์ธ์ฆ์ ์ค์
์ฑ๋ฅ ์ต์ ํ ํ
Claude Code์ ์๋ต ์๋์ ํจ์จ์ฑ์ ํฅ์์ํค๊ธฐ ์ํ ์ค์ ๋ค์ ๋๋ค. ํ๋ก์ ํธ ๊ท๋ชจ์ ์์ ํจํด์ ๋ฐ๋ผ ์ ์ ํ ์กฐ์ ํ์ฌ ์ฌ์ฉํ์ธ์.
1. ์บ์ ํ์ฑํ
๋ฐ๋ณต์ ์ธ ์์ฒญ์ ๋ํ ์๋ต์ ์บ์ํ์ฌ ์๋๋ฅผ ํฅ์์ํต๋๋ค.
# ์๋ต ์บ์ฑ ํ์ฑํ
claude config set cache_enabled true
# ์บ์ ์ ์ง ์๊ฐ ์ค์ (์ด ๋จ์, ๊ธฐ๋ณธ: 3600์ด = 1์๊ฐ)
claude config set cache_ttl 3600
# ์บ์ ํฌ๊ธฐ ์ ํ ์ค์ (MB ๋จ์)
claude config set cache_max_size 100
์บ์ ํ์ฉ ํ
- ๋์ผํ ์ฝ๋๋ฅผ ๋ฐ๋ณต ๋ถ์ํ ๋ ์ ์ฉ
- ํฐ ํ๋ก์ ํธ์์ ์ ์ง์ ์์ ์ ํจ๊ณผ์
- ์บ์ ๋ฌดํจํ:
claude cache clear
Junior Developer - ๊ฐ์ ํ์ต์
# ํ์ต ๊ฐ์ํ
claude "์ฃผ๋์ด ๊ฐ๋ฐ์์ ๋น ๋ฅธ ์ฑ์ฅ์ ์ํด ์ด ์์
์ ํ์ต ๊ธฐํ๋ก ํ์ฉํด์ค
- ๋จ๊ณ๋ณ ๊ตฌํ ๊ฐ์ด๋
- ๊ฐ ๋จ๊ณ์์ ๋ฐฐ์ธ ์ ์๋ ํต์ฌ ๊ฐ๋
- ํํ ํ๋ ์ค์์ ์๋ฐฉ๋ฒ
- ์๋์ด์๊ฒ ์ง๋ฌธํ ํ์ด๋ฐ๊ณผ ๋ฐฉ๋ฒ
- ์์ ์ ์ง์ ์ ์ธก์ ํ๋ ๋ฐฉ๋ฒ
๋จ์ํ ์ ๋ต์ ์ฃผ๊ธฐ๋ณด๋ค๋ ์ฌ๊ณ ๊ณผ์ ์ ๊ธฐ๋ฅผ ์ ์๋๋ก ์๋ดํด์ค"
[S1WF2(์น์ 03)] 4๋จ๊ณ ํฉ๊ธ ์ํฌํ๋ก์ฐ
7.1 ํ์-๊ณํ-์ฝ๋ฉ-์ปค๋ฐ ์ฌ์ดํด
EPCC(Explore-Plan-Code-Commit) ์ํฌํ๋ก์ฐ๋ ์ฒด๊ณ์ ์ด๊ณ ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ์ํฌํ๋ก์ฐ๋ ๋ฌด์์ ์ฝ๋ฉ์ ์์ํ๋ ๋์ , ์ถฉ๋ถํ ์ดํด์ ๊ณํ์ ๋ฐํ์ผ๋ก ํ ์ ์คํ ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
EPCC (Explore-Plan-Code-Commit) ์ํฌํ๋ก์ฐ
๊ฐ ๋จ๊ณ๋ ๊ณ ์ ํ ๋ชฉ์ ๊ณผ ์ฐ์ถ๋ฌผ์ ๊ฐ์ง๋ฉฐ, ์ํ์ ์ผ๋ก ๋ฐ๋ณต๋์ด ์ง์์ ์ธ ํ์ง ํฅ์์ ๋ฌ์ฑํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
flowchart TD
A[Explore<br/>์ฝ๋๋ฒ ์ด์ค ์ดํด] --> B[Plan<br/>์ ๊ทผ ๋ฐฉ๋ฒ ์ค๊ณ]
B --> C[Code<br/>๊ตฌํ ๋ฐ ํ
์คํธ]
C --> D[Commit<br/>๊ฒ์ฆ ๋ฐ ์ปค๋ฐ]
D --> A
E[์ฒด๊ณ์ ๋ถ์<br/>์ํคํ
์ฒ ํ์
<br/>๊ธฐ์ ๋ถ์ฑ ์๋ณ] -.-> A
F[๊ตฌํ ์ ๋ต ์๋ฆฝ<br/>์์
๋ถํด<br/>๋ฆฌ์คํฌ ํ๊ฐ] -.-> B
G[์ ์ง์ ๊ตฌํ<br/>TDD ์ ์ฉ<br/>ํตํฉ ํ
์คํธ] -.-> C
H[์ฝ๋ ๊ฒ์ฆ<br/>์ปค๋ฐ ๋ฉ์์ง<br/>ํ์ง ํ์ธ] -.-> D
classDef primaryStyle fill:#e2e8f0,stroke:#334155,stroke-width:3px,color:#1e293b
classDef detailStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C,D primaryStyle
class E,F,G,H detailStyle
1๋จ๊ณ: Explore (ํ์) - ์ฒด๊ณ์ ์ฝ๋๋ฒ ์ด์ค ์ดํด
ํ์ ๋จ๊ณ๋ ์ฑ๊ณต์ ์ธ ๊ฐ๋ฐ์ ์ํ ๊ธฐ๋ฐ์ ๋ง๋ จํ๋ ์ค์ํ ๊ณผ์ ์ ๋๋ค. ์ถฉ๋ถํ ์ดํด ์์ด ์ฝ๋ฉ์ ์์ํ๋ ๊ฒ์ ์๋ชป๋ ์ค๊ณ์ ๊ธฐ์ ๋ถ์ฑ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. Claude Code๋ ๋ณต์กํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๋ถ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋น ๋ฅด๊ฒ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ํ์ ํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
ํ๋ก์ ํธ ์ํคํ ์ฒ ๋ถ์
# ๊ณ ์์ค ์ํคํ
์ฒ ์ดํด
claude "์ด ํ๋ก์ ํธ์ ์ ์ฒด ์ํคํ
์ฒ๋ฅผ ๋ถ์ํด์ค.
- ๋ง์ดํฌ๋ก์๋น์ค vs ๋ชจ๋๋ฆฌ์ ๊ตฌ์กฐ
- ์ฃผ์ ๋๋ฉ์ธ๊ณผ ๊ฒฝ๊ณ
- ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์์กด์ฑ ๋ฐฉํฅ
- ์ธ๋ถ ์์คํ
๊ณผ์ ํตํฉ ์ง์
- ๋ณด์ ๊ฒฝ๊ณ์ ์ธ์ฆ ๋ฐฉ์"
# ๊ธฐ์ ์คํ ์ฌ์ธต ๋ถ์
claude "์ฌ์ฉ๋ ๊ธฐ์ ์คํ์ ์ข
ํฉ์ ์ผ๋ก ๋ถ์ํด์ค.
- ํ๋ก ํธ์๋: ํ๋ ์์ํฌ, ์ํ ๊ด๋ฆฌ, ๋น๋ ๋๊ตฌ
- ๋ฐฑ์๋: ์ธ์ด, ํ๋ ์์ํฌ, ORM, ๋ฏธ๋ค์จ์ด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: ํ์
, ๋ฒ์ , ์คํค๋ง ์ค๊ณ ํจํด
- ์ธํ๋ผ: ์ปจํ
์ด๋ํ, ์ค์ผ์คํธ๋ ์ด์
, ๋ชจ๋ํฐ๋ง
- ๊ฐ ๊ธฐ์ ์ ํ์ ์ด์ ์ ์ฅ๋จ์ ๋ถ์"
# ์ฝ๋ ํ์ง๊ณผ ์ปจ๋ฒค์
ํ๊ฐ
claude "ํ๋ก์ ํธ์ ์ฝ๋ ํ์ง๊ณผ ๊ฐ๋ฐ ๊ดํ์ ํ๊ฐํด์ค.
- ๋ค์ด๋ฐ ๊ท์น๊ณผ ์ผ๊ด์ฑ ํ์ธ
- ํ์ผ/ํด๋ ๊ตฌ์กฐ ํจํด
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ์ ๋ต
- ๋ฌธ์ํ ์์ค๊ณผ ํ์ง
- CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
- ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ํ์ "
๊ธฐ๋ฅ๋ณ ์ฌ์ธต ์ถ์ ๊ณผ ๋ถ์
# ๋น์ฆ๋์ค ํฌ๋ฆฌํฐ์ปฌ ๊ธฐ๋ฅ ๋ถ์
claude "์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ๊ถํ ๊ด๋ฆฌ ์์คํ
์ ์ข
ํฉ ๋ถ์ํด์ค.
- ์ธ์ฆ ํ๋ก์ฐ (๋ก๊ทธ์ธ, ํ ํฐ ๊ด๋ฆฌ, ์ธ์
)
- ๊ถํ ๋ถ์ฌ ๋ฉ์ปค๋์ฆ (RBAC, ABAC)
- ๋ณด์ ๊ณ ๋ ค์ฌํญ (์ํธํ, ๊ฒ์ฆ)
- ํ๋ก ํธ์๋-๋ฐฑ์๋ ์ฐ๋ ๋ฐฉ์
- ์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์ฉ์ ๊ฒฝํ
- ํ์ฅ ๊ฐ๋ฅ์ฑ๊ณผ ๊ฐ์ ์ "
# ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์ํ ๊ด๋ฆฌ
claude "์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ ํ๋ฆ์ ์ถ์ ํ๊ณ ๋ถ์ํด์ค.
- ์ฌ์ฉ์ ์
๋ ฅ๋ถํฐ ๋ฐ์ดํฐ ์ ์ฅ๊น์ง์ ์ ์ฒด ๊ฒฝ๋ก
- ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ์ํ ๊ด๋ฆฌ ํจํด
- ์๋ฒ ์ฌ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง
- ์บ์ฑ ์ ๋ต๊ณผ ์ฑ๋ฅ ์ต์ ํ
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ๊ณผ ๋์์ฑ ์ฒ๋ฆฌ"
# ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ ๋ถ์
claude "์์คํ
์ ์ฑ๋ฅ ํน์ฑ๊ณผ ํ์ฅ์ฑ์ ๋ถ์ํด์ค.
- ํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์๋ณ
- ํธ๋ํฝ ์ฒ๋ฆฌ ๋ฅ๋ ฅ๊ณผ ํ๊ณ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ํจํด๊ณผ ์ต์ ํ ๊ธฐํ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด๊ณผ ๊ฐ๋น์ง ์ปฌ๋ ์
- ํ์ฅ ์ ๋ต (์ํ์ vs ์์ง์ )"
๊ธฐ์ ์ ๋ถ์ฑ์ ๊ฐ์ ๊ธฐํ ์๋ณ
ํจ๊ณผ์ ์ธ ํ์์ ๋จ์ํ ํ์ฌ ์ํ๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋์ด์ ์ ์ฌ์ ๋ฌธ์ ์ ๊ฐ์ ๊ธฐํ๋ฅผ ์ฌ์ ์ ์๋ณํ๋ ๊ฒ์ ๋๋ค.
# ๊ธฐ์ ๋ถ์ฑ ํ๊ฐ
claude "์ฝ๋๋ฒ ์ด์ค์ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ข
ํฉ ํ๊ฐํด์ค.
- ๊ตฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ณด์ ์ทจ์ฝ์
- ์ค๋ณต ์ฝ๋์ ๋ฆฌํฉํ ๋ง ํ์ ์์ญ
- ๋ณต์ก๋๊ฐ ๋์ ๋ชจ๋๊ณผ ํจ์
- ํ
์คํธ๊ฐ ๋ถ์กฑํ ํฌ๋ฆฌํฐ์ปฌ ์์ญ
- ๋ฌธ์ํ ๋ถ์กฑ์ผ๋ก ์ธํ ์ ์ง๋ณด์ ์ด๋ ค์
- ์ฐ์ ์์๋ณ ๊ฐ์ ๋ก๋๋งต ์ ์"
# ์ํคํ
์ฒ ์งํ ๊ฐ๋ฅ์ฑ
claude "ํ์ฌ ์ํคํ
์ฒ์ ๋ฐ์ ๋ฐฉํฅ์ ์ ์ํด์ค.
- ๋ง์ดํฌ๋ก์๋น์ค ๋ถํด ๊ฐ๋ฅ์ฑ
- ์๋ก์ด ๊ธฐ์ ์คํ ๋์
๊ธฐํ
- ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ์ํคํ
์ฒ ๋ณ๊ฒฝ
- ํ์ฅ์ฑ ํฅ์ ๋ฐฉ์
- ๋น์ฉ ์ต์ ํ ๊ธฐํ"
### 2๋จ๊ณ: Plan (๊ณํ)
**๊ตฌํ ์ ๋ต ์๋ฆฝ**
```bash
claude "์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๊ณ ํด.
ํ์ฌ ์ํคํ
์ฒ๋ฅผ ๊ณ ๋ คํด์ ๊ตฌํ ๊ณํ์ ์ธ์์ค.
ํ์ํ ์ปดํฌ๋ํธ, API ์๋ํฌ์ธํธ, ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํฌํจํด์ค"
์์ ๋ถํด
claude "์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํ ์์
์ ๋จ๊ณ๋ณ๋ก ๋๋ ์ค.
๊ฐ ๋จ๊ณ๋ ๋
๋ฆฝ์ ์ผ๋ก ํ
์คํธ ๊ฐ๋ฅํด์ผ ํ๊ณ ,
์์ ์์ ์๊ฐ๋ ์ถ์ ํด์ค"
๋ฆฌ์คํฌ ํ๊ฐ
claude "์ด ๋ณ๊ฒฝ์ฌํญ์ด ๊ธฐ์กด ์ฝ๋์ ๋ฏธ์น ์ํฅ์ ๋ถ์ํด์ค.
์ ์ฌ์ ์ธ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ์์ ์ ์ํด์ค"
3๋จ๊ณ: Code (์ฝ๋ฉ)
์ ์ง์ ๊ตฌํ
# ์ค์ผ๋ ํค ์ฝ๋ ์์ฑ
claude "๊ณํ์ ๋ฐ๋ผ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ๋ง๋ค์ด์ค.
์ธํฐํ์ด์ค์ ๋น ๋ฉ์๋๋ก ์์ํด์ ๋จ๊ณ์ ์ผ๋ก ๊ตฌํํ ์ ์๋๋ก"
# ํต์ฌ ๋ก์ง ๊ตฌํ
claude "์ด์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํด์ค.
๋จ์ ํ
์คํธ๋ ํจ๊ป ์์ฑํด์ ๋์์ ๊ฒ์ฆํด์ค"
# ํตํฉ ๋ฐ ์ฐ๊ฒฐ
claude "๊ตฌํํ ๊ธฐ๋ฅ์ ๊ธฐ์กด ์์คํ
๊ณผ ํตํฉํด์ค.
ํ์ํ ์ด๋ํฐ๋ ๋ฏธ๋ค์จ์ด๋ ์์ฑํด์ค"
[S1WF3(์น์ 06a)] ํ๋กฌํํ ๊ธฐ๋ณธ ๊ธฐ๋ฒ
3.2 ํ์ผ ํ์๊ณผ ์ฝ๊ธฐ
ํ๋ก์ ํธ ๊ตฌ์กฐ ํ์ ํ๊ธฐ
์๋ก์ด ํ๋ก์ ํธ์ ํฌ์ ๋์์ ๋ ๋น ๋ฅด๊ฒ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ํ์ ํ๋ ๊ฒ์ ์ค์ํฉ๋๋ค. Claude Code๋ฅผ ํ์ฉํ๋ฉด ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
flowchart TD
A["์ ์ฒด ๊ตฌ์กฐ ํ์
์ ๋ต"]
A --> B["ํ๋ก์ ํธ ๊ฐ์ ํ์
<br/>โข ๊ตฌ์กฐ ํธ๋ฆฌ ์๊ฐํ<br/>โข ๊ธฐ์ ์คํ ๋ถ์"]
A --> C["ํต์ฌ ๋๋ ํ ๋ฆฌ ํ์<br/>โข src ํด๋ ์์ธ ๋ถ์<br/>โข ์ค์ ํ์ผ ๋ถ๋ฅ"]
A --> D["ํ์ผ ํจํด ๋ถ์<br/>โข ํ์ผ ํ์
๋ณ ๊ทธ๋ฃนํ<br/>โข ํ
์คํธ ๊ตฌ์กฐ ํ์
"]
A --> E["์ต๊ทผ ํ๋ ์ถ์ <br/>โข ๋ณ๊ฒฝ์ฌํญ ๋ถ์<br/>โข ํต์ฌ ๋ก์ง ์์น ํ์
"]
classDef strategyStyle fill:#e2e8f0,stroke:#334155,stroke-width:3px,color:#1e293b
classDef stepStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A strategyStyle
class B,C,D,E stepStyle
์ ์ฒด ๊ตฌ์กฐ ํ์ ์ ๋ต
ํจ์จ์ ์ธ ํ์ผ ์ฝ๊ธฐ
๋จ์ํ ํ์ผ์ ์ด์ด๋ณด๋ ๊ฒ์ด ์๋๋ผ, ๋ชฉ์ ์ ๋ง๋ ์ ๋ณด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ถ์ถํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
# ๋จ์ผ ํ์ผ ์ฝ๊ธฐ
claude "package.json ํ์ผ์ ์ฝ์ด์ค"
# ์ฌ๋ฌ ํ์ผ ๋์์ ์ฝ๊ธฐ
claude "๋ชจ๋ ์ค์ ํ์ผ๋ค(config๋ก ์์ํ๋)์ ์ฝ๊ณ ์์ฝํด์ค"
# ํน์ ๋ถ๋ถ๋ง ์ฝ๊ธฐ
claude "app.js ํ์ผ์์ ๋ผ์ฐํฐ ์ค์ ๋ถ๋ถ๋ง ๋ณด์ฌ์ค"
# ํ์ผ ๋น๊ต
claude "๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ํ๋ก๋์
ํ๊ฒฝ ์ค์ ํ์ผ์ ๋น๊ตํด์ค"
์ฝ๋ ๋ถ์ ์์ฒญ
๊ธฐ์กด ์ฝ๋์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ฑฐ๋ ์ ์ฌ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ ๋ฐ ์ ์ฉํ ๋ถ์ ์์ฒญ๋ค์ ๋๋ค.
# ํจ์ ๋ถ์
claude "calculateTotalPrice ํจ์๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ์ค๋ช
ํด์ค"
# ์์กด์ฑ ๋ถ์
claude "์ด ํ๋ก์ ํธ๊ฐ ์ฌ์ฉํ๋ ์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ์ฉ๋๋ฅผ ์ค๋ช
ํด์ค"
# ์ํคํ
์ฒ ๋ถ์
claude "์ด ํ๋ก์ ํธ์ ์ ์ฒด์ ์ธ ์ํคํ
์ฒ๋ฅผ ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ์ค๋ช
ํด์ค"
# ๋ณด์ ์ทจ์ฝ์ ๊ฒ์ฌ
claude "๋ณด์์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ์ฝ๋๊ฐ ์๋์ง ๊ฒ์ฌํด์ค"
3.3 ์ฝ๋ ์์ฑ๊ณผ ์์
์ ํ์ผ ์์ฑ
ํ๋ก์ ํธ์ ์ปจ๋ฒค์ ๊ณผ ๊ตฌ์กฐ์ ๋ง๋ ์ ํ์ผ์ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
# ๊ธฐ๋ณธ์ ์ธ ํ์ผ ์์ฑ
claude "utils ํด๋์ ๋ ์ง ๊ด๋ จ ์ ํธ๋ฆฌํฐ ํจ์๋ค์ ๋ง๋ค์ด์ค"
# ํ
ํ๋ฆฟ ๊ธฐ๋ฐ ์์ฑ
claude "Express ๋ผ์ฐํฐ ํ
ํ๋ฆฟ์ผ๋ก user ๋ผ์ฐํฐ๋ฅผ ๋ง๋ค์ด์ค"
# ํ
์คํธ ํ์ผ ์๋ ์์ฑ
claude "UserService์ ๋ํ Jest ํ
์คํธ ํ์ผ์ ๋ง๋ค์ด์ค"
# ๋ฌธ์ ์์ฑ
claude "API ์๋ํฌ์ธํธ ๋ฌธ์๋ฅผ Swagger ํ์์ผ๋ก ๋ง๋ค์ด์ค"
์ฝ๋ ์์ ํจํด
๋ค์ํ ์์ ์์ ์ ์ฒด๊ณ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ๋ค์ ๋๋ค. ๊ฐ ํจํด๋ณ๋ก ์ค์ ์ฌ์ฉ ์๋๋ฆฌ์ค์ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ํจ๊ป ์๊ฐํฉ๋๋ค.
1. ๋จ์ ์์ - ์ฝ๋ ํ๋ํ
# ES5๋ฅผ ES6+ ๋ฌธ๋ฒ์ผ๋ก ์
๊ทธ๋ ์ด๋
claude "๋ชจ๋ var๋ฅผ const๋ let์ผ๋ก ๋ฐ๊ฟ์ค. ์ฌํ ๋น๋๋ ๋ณ์๋ง let์ ์ฌ์ฉํด"
# ์ฝ๋ฐฑ์ async/await๋ก ๋ณํ
claude "์ฝ๋ฐฑ ๊ธฐ๋ฐ ์ฝ๋๋ฅผ async/await ํจํด์ผ๋ก ๋ณ๊ฒฝํด์ค"
# ๋ฌธ์์ด ์ฐ๊ฒฐ์ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด๋ก
claude "๋ฌธ์์ด ์ฐ๊ฒฐ ์ฐ์ฐ์(+)๋ฅผ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด๋ก ๋ฐ๊ฟ์ค"
2. ๋ฆฌํฉํ ๋ง - ์ฝ๋ ๊ตฌ์กฐ ๊ฐ์
# ๊ธด ํจ์ ๋ถ๋ฆฌ
claude "์ด ํจ์๊ฐ 50์ค์ด ๋๋๋ฐ, ๋
ผ๋ฆฌ์ ๋จ์๋ก ๋ถ๋ฆฌํด์ ๊ฐ๋
์ฑ์ ๋์ฌ์ค"
# ์ค๋ณต ์ฝ๋ ์ ๊ฑฐ
claude "์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์ฐพ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ์ถ์ถํด์ค"
# ์กฐ๊ฑด๋ฌธ ๋จ์ํ
claude "๋ณต์กํ if-else ์ฒด์ธ์ early return ํจํด์ด๋ switch๋ฌธ์ผ๋ก ๊ฐ์ ํด์ค"
3. ๊ธฐ๋ฅ ์ถ๊ฐ - ์ ์ง์ ๊ฐ์
# ์๋ฌ ์ฒ๋ฆฌ ์ถ๊ฐ
claude "์ด API ํธ์ถ ํจ์์ ์ ์ ํ ์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์๋ ๋ก์ง์ ์ถ๊ฐํด์ค"
# ๋ก๋ฉ ์ํ ๊ด๋ฆฌ
claude "์ด ์ปดํฌ๋ํธ์ ๋ก๋ฉ, ์ฑ๊ณต, ์๋ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ก์ง์ ์ถ๊ฐํด์ค"
# ์ ํจ์ฑ ๊ฒ์ฌ ์ถ๊ฐ
claude "์ฌ์ฉ์ ์
๋ ฅ ํผ์ ์ค์๊ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํด์ค"
4. ๋ฒ๊ทธ ์์ - ์์ ์ฑ ํฅ์
# ์ ์ฌ์ ์ค๋ฅ ์ฐพ๊ธฐ
claude "null/undefined ์ฐธ์กฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ์ ์ฐพ์์ ์ต์
๋ ์ฒด์ด๋์ผ๋ก ์์ ํด์ค"
# ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง
claude "์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํ์ด๋จธ๊ฐ ์ ๋๋ก ์ ๋ฆฌ๋์ง ์๋ ๋ถ๋ถ์ ์ฐพ์์ ์์ ํด์ค"
# ๊ฒฝ์ ์กฐ๊ฑด ํด๊ฒฐ
claude "๋น๋๊ธฐ ์์
์์ ๊ฒฝ์ ์กฐ๊ฑด์ด ๋ฐ์ํ ์ ์๋ ๋ถ๋ถ์ ์ฐพ์์ ์์ ํด์ค"
์ฝ๋ ์คํ์ผ ํต์ผ
ํ๋ก์ ํธ ์ ๋ฐ์ ์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ์ ์ ์ฉํ๋ ์์ ์ ๋๋ค.
# ํฌ๋งคํ
claude "ํ๋ก์ ํธ ์ ์ฒด๋ฅผ Prettier ๊ท์น์ ๋ง๊ฒ ํฌ๋งคํ
ํด์ค"
# ๋ค์ด๋ฐ ์ปจ๋ฒค์
claude "camelCase๋ฅผ snake_case๋ก ๋ณ๊ฒฝํด์ค"
# ์ฃผ์ ์ถ๊ฐ
claude "๋ณต์กํ ๋ก์ง์ ์ค๋ช
์ฃผ์์ ์ถ๊ฐํด์ค"
# ํ์
์ถ๊ฐ
claude "JavaScript ํ์ผ์ TypeScript ํ์
์ ์ถ๊ฐํด์ค"
[S1WF5] MCP ๋๊ตฌ ์ค์ ํ์ฉ (๋น-AI ๋๊ตฌ/์๋น์ค)
- MCP ๋๊ตฌ ํธ์ถ:
mcp__์๋ฒ๋ช __๊ธฐ๋ฅ๋ชํ์์ผ๋ก ์์ ์ค ์ง์ ํธ์ถ - ์:
mcp__supabase__query,mcp__filesystem__read - ๋น-AI ์๋น์ค(DB, ํ์ผ์์คํ , GitHub ๋ฑ) ์ฐ๋์ ์ํฌํ๋ก์ฐ ๋๊ตฌ๋ก ๋ถ๋ฅ
allowed_tools๋ก ์ฌ์ฉํ MCP ๋๊ตฌ ๋ฒ์๋ฅผ ์ ํ ๊ฐ๋ฅ
[S1WF4(์น์ 14)] ํ์ ๋จ์ถํค & ๋ช ๋ น์ด
3.1 ๊ธฐ๋ณธ ๋ช ๋ น์ด ๊ตฌ์กฐ
๋ช ๋ น์ด ํด๋ถํ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph LR
subgraph structure ["Claude Code ๋ช
๋ น์ด ๊ตฌ์กฐ"]
A["claude<br/>๊ธฐ๋ณธ ๋ช
๋ น์ด"] --> B["[์ต์
]<br/>๋์ ๋ฐฉ์ ์ ์ด ํ๋๊ทธ"]
B --> C["[๋ช
๋ น/์ง๋ฌธ]<br/>์์ฐ์ด๋ก ์์ฑํ๋ ์์ฒญ"]
end
classDef commandStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef optionStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A commandStyle
class B,C optionStyle
Claude Code ๋ช ๋ น์ด์ ๊ตฌ์กฐ๋ ์ง๊ด์ ์ด๋ฉด์๋ ๊ฐ๋ ฅํฉ๋๋ค.
์ฃผ์ ์ต์ ๋ค
Claude Code๋ ๋ค์ํ ์ต์ ์ ํตํด ๋์์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค. ๊ฐ ์ต์ ์ ์ฉ๋์ ํ์ฉ ์๋๋ฆฌ์ค๋ฅผ ์ดํดํ๋ฉด ๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ต์ ๋ค
# ๋์๋ง ๋ณด๊ธฐ - ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๋ช
๋ น์ด์ ์ต์
ํ์ธ
claude --help
claude -h
# ๋ฒ์ ํ์ธ - ํ์ฌ ์ค์น๋ Claude Code ๋ฒ์ ํ์ธ
claude --version
claude -v
# ๋ํ ๊ธฐ๋ก ์ง์ฐ๊ธฐ - ์๋ก์ด ์ปจํ
์คํธ๋ก ์์ํ๊ณ ์ถ์ ๋
claude --clear
claude -c
๋ชจ๋ธ ์ ํ ์ต์
# ๋ณต์กํ ์์
์ ์ํ ๊ณ ์ฑ๋ฅ ๋ชจ๋ธ ์ฌ์ฉ
claude --model claude-3-opus "๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํํด์ค"
# ๋น ๋ฅธ ์๋ต์ด ํ์ํ ๊ฐ๋จํ ์์
claude -m claude-3-haiku "๊ฐ๋จํ ์ค๋ช
๋ง ํด์ค"
# ๊ท ํ์กํ ์ฑ๋ฅ๊ณผ ์๋
claude -m claude-3-sonnet "์ฝ๋ ๋ฆฌ๋ทฐํด์ค"
์ถ๋ ฅ ํ์ ์ ์ด
# JSON ํ์์ผ๋ก ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ๋ฐ๊ธฐ
claude --json "ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ JSON์ผ๋ก ์ถ๋ ฅํด์ค"
# ๋งํฌ๋ค์ด ํ์์ผ๋ก ๋ฌธ์ ์์ฑ
claude --markdown "README ํ์ผ ๋ด์ฉ์ ๋งํฌ๋ค์ด์ผ๋ก ๋ณด์ฌ์ค"
# ์ผ๋ฐ ํ
์คํธ ์ถ๋ ฅ (๊ธฐ๋ณธ๊ฐ)
claude --plain "๊ฐ๋จํ ์ค๋ช
์ ํ
์คํธ๋ก ๋ณด์ฌ์ค"
์์ฐ์ด ๋ช ๋ น์ ํ
Claude Code์ ํต์ฌ ํน์ง์ ๋ณต์กํ ๋ช ๋ น์ด ๋ฌธ๋ฒ ๋์ ์์ฐ์ค๋ฌ์ด ์ธ์ด๋ก ์๋๋ฅผ ์ ๋ฌํ ์ ์๋ค๋ ์ ์ ๋๋ค.
# ๊ธฐ์ ์ ์ธ ์์ฒญ
claude "UserService ํด๋์ค์ ์ด๋ฉ์ผ ๊ฒ์ฆ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ค"
# ํ์์ ์ธ ์ง๋ฌธ
claude "์ด ํ๋ก์ ํธ์์ ์ธ์ฆ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋๊ณ ์์ด?"
# ์ฐฝ์์ ์ธ ์์ฒญ
claude "์ด ํจ์๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น?"
# ๋ณตํฉ์ ์ธ ์์
claude "๋ฒ๊ทธ๋ฅผ ์ฐพ์์ ์์ ํ๊ณ , ํ
์คํธ๋ ์์ฑํ ๋ค์, ์ปค๋ฐ ๋ฉ์์ง๊น์ง ๋ง๋ค์ด์ค"
[S1WF6] CLAUDE.md โ ๊ฐ๋ฐ ํ๋ก์ธ์ค ๋ฐ ์คํ ์์ ์ ์
- CLAUDE.md์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ์คํ ํ๋ก์ธ์ค๋ฅผ ๋ช ์
- ์: "ํ์ผ ์ ์ฅ ์ Stage ํด๋์ ๋จผ์ ์ ์ฅ โ Pre-commit Hook์ผ๋ก ๋ฃจํธ์ ์๋ ๋ณต์ฌ"
- ์ปค๋ฐ ๋ฉ์์ง ๊ท์น, ๋ธ๋์น ์ ๋ต, ๋ฐฐํฌ ํ๋ก์ธ์ค ๋ฑ ์์ ํ๋ฆ ์ ์
- AI๊ฐ ํ๋ก์ธ์ค๋ฅผ ์ค์ํ๋ฉฐ ์์ ํ๋๋ก ๊ฐ์ ํ๋ ํต์ฌ ์๋จ
[S1WF7] Headless ๋ชจ๋ โ CI/CD ์๋ํ ์ํฌํ๋ก์ฐ
- Headless ๋ชจ๋: ๋ํํ ํฐ๋ฏธ๋ ์์ด Claude Code๋ฅผ ์๋์ผ๋ก ์คํํ๋ ๋ฐฉ์
- ๊ธฐ๋ณธ ์ฌ์ฉ:
claude --headless -p "์์ ์ง์"(๋น๋ํํ ์คํ) - CI/CD ํ์ดํ๋ผ์ธ์์ ์ฝ๋ ๋ฆฌ๋ทฐ, ํ ์คํธ, ๋น๋ ์๋ํ์ ํ์ฉ
- GitHub Actions, Jenkins ๋ฑ ์๋ํ ๋๊ตฌ์ ์ฐ๋ํ์ฌ ๋ฌด์ธ ์คํ ๊ฐ๋ฅ
[S1WF8] Extended Thinking โ ํ์ฅ ์ฌ๊ณ ๋ชจ๋
- Extended Thinking: AI๊ฐ ๋ต๋ณ ์ ์ ๋ ๊น์ด ์ฌ๊ณ ํ๋ ๋ชจ๋
- ๋ณต์กํ ์ฝ๋ ์ํคํ ์ฒ ์ค๊ณ, ๋ฒ๊ทธ ๋ถ์, ๋ฆฌํฉํ ๋ง ์ ๋ต ์๋ฆฝ ์ ํ์ฉ
- ํ ํฐ ์๋น๊ฐ ์ฆ๊ฐํ๋ฏ๋ก ๋ณต์กํ ์์ ์๋ง ์ ํ์ ์ฌ์ฉ ๊ถ์ฅ
[S1WF9] Vision โ ์ด๋ฏธ์ง ๋ถ์ ๊ธฐ๋ฅ
- ์คํฌ๋ฆฐ์ท ๋ถ์: UI ๋ฒ๊ทธ ํ์ธ, ๋์์ธ ์์ ๊ฒํ ์ ํ์ฉ
- ์ด๋ฏธ์ง ํ์ผ ์ฝ๊ธฐ: PNG, JPG ๋ฑ ์ด๋ฏธ์ง๋ฅผ Read ๋๊ตฌ๋ก ์ง์ ์ด์ด ์๊ฐ์ ๋ถ์
- ํ์ฉ ์: "์ด ์คํฌ๋ฆฐ์ท์์ ๋ ์ด์์ ๋ฌธ์ ๋ฅผ ์ฐพ์์ค", "์์ด์ดํ๋ ์์ ๋ณด๊ณ HTML ๊ตฌํํด์ค"
- ๋ฉํฐ๋ชจ๋ฌ ์ ๋ ฅ์ผ๋ก ํ ์คํธ + ์ด๋ฏธ์ง๋ฅผ ํจ๊ป ์ ๋ฌํ์ฌ ์ ํํ ์์ ์ง์ ๊ฐ๋ฅ
[S1WF10] Checkpointing โ ์์ ๋ณต์ ์ง์
- Checkpointing: ์์ ์ค ์๋์ผ๋ก ๋ณต์ ์ง์ (์ฒดํฌํฌ์ธํธ)์ ์์ฑ
- ๋ฌธ์ ๋ฐ์ ์ ์ด์ ์ฒดํฌํฌ์ธํธ๋ก ๋กค๋ฐฑํ์ฌ ์์ ํ๊ฒ ๋ณต๊ตฌ
- ๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง์ด๋ ์ํํ ๋ณ๊ฒฝ ์ ์์ ๋ง ์ญํ
- Git ์ปค๋ฐ๊ณผ ๋ณ๋๋ก Claude Code ์์ฒด์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ณต์ ๋ฉ์ปค๋์ฆ
[S1WF11] Chrome ์ฐ๋ โ ๋ธ๋ผ์ฐ์ ๋๋ฒ๊น
- Chrome ๋ธ๋ผ์ฐ์ ์ ์ฐ๋ํ์ฌ ๋ผ์ด๋ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋๋ฒ๊น
- ๋ธ๋ผ์ฐ์ ์ฝ์ ์ค๋ฅ๋ฅผ Claude Code๋ก ์ ๋ฌํ์ฌ ์ค์๊ฐ ๋ถ์
- DOM ์ํ, ๋คํธ์ํฌ ์์ฒญ, ์ฝ์ ๋ก๊ทธ ๊ธฐ๋ฐ ๋ฌธ์ ํด๊ฒฐ
[S1WF12] Teleport / Desktop ํธ๋์คํ โ ์ธ์ ์ด๋
/teleport: ์น/iOS์์ ์์ํ ์ธ์ ์ ๋ก์ปฌ ํฐ๋ฏธ๋๋ก ๊ฐ์ ธ์ค๊ธฐ/desktop: ํฐ๋ฏธ๋ ์ธ์ ์ Desktop ์ฑ์ผ๋ก ํธ๋์คํํ์ฌ ์๊ฐ์ diff ๋ฆฌ๋ทฐ- ์ธ์ ๊ฐ ์ปจํ ์คํธ๊ฐ ์ ์ง๋์ด ์ด๋์๋ ์ด์ด์ ์์ ๊ฐ๋ฅ
[S1WF13] GitHub Actions / GitLab CI โ CI/CD ์๋ํ
- GitHub Actions: PR ๋ฆฌ๋ทฐ ์๋ํ, ์ด์ ๋ถ๋ฅ, ์ฝ๋ ํ์ง ์ฒดํฌ
- GitLab CI/CD: ํ์ดํ๋ผ์ธ ๋จ๊ณ์ Claude Code ํตํฉ
@claude๋ฉ์ ์ผ๋ก GitHub/GitLab์์ ์ง์ AI ํธ์ถ ๊ฐ๋ฅ- ์๋ PR ์์ฑ, ํ ์คํธ ์คํ, ๋ฆด๋ฆฌ์ค ๋ ธํธ ์์ฑ ๋ฑ
[S1WF14] Interactive Mode โ ๋ํํ ๋ชจ๋
- Interactive Mode: ๊ธฐ๋ณธ ์คํ ๋ชจ๋, ํฐ๋ฏธ๋์์ ๋ํํ๋ฉฐ ์์ ์งํ
- Headless์ ๋๋น๋๋ ๊ฐ๋ โ ์ฌ์ฉ์์ ์ค์๊ฐ์ผ๋ก ๋ํํ๋ฉฐ ํ์ธ/์์
- ๋๊ตฌ ์คํ ์ ์ฌ์ฉ์ ์น์ธ ์์ฒญ, ์ค๊ฐ ๊ฒฐ๊ณผ ํ์ธ, ๋ฐฉํฅ ์์ ๊ฐ๋ฅ
[S1WF15] /status ๋ช ๋ น์ด โ ์ ์ฒด ์ํ ํ์ธ
์ฐธ๊ณ : ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /์ค์ _Tips/Claude_Code_์ฌ์ฉ๋ฒ/status_๋ช
๋ น์ด๋ก_๋ชจ๋ _๊ฒ_ํ์ธํ๊ธฐ.md
/status: ํ์ฌ ์ธ์ ์ ๋ชจ๋ ์ํ๋ฅผ ํ๋์ ํ์ธํ๋ ๋ช ๋ น์ด- Status ํญ: ๋ฒ์ , ์ธ์ ID, ํ์ฌ ๋๋ ํ ๋ฆฌ, ๋ก๊ทธ์ธ ๋ฐฉ๋ฒ
- Config ํญ: ์ค์ ๊ฐ ํ์ธ
- Usage ํญ: ํ ํฐ ์ฌ์ฉ๋, ๋น์ฉ ํต๊ณ
[S1WF16] ๋์ผ ๋ชจ๋ ํ์ฉ๋ฒ
์ฐธ๊ณ : ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /์ค์ _Tips/Claude_Code_์ฌ์ฉ๋ฒ/๋์ผ_๋ชจ๋๋ก_Claude_Code_ํ์ฉํ๊ธฐ.md
- ๋์ผ ๋ชจ๋: Claude.ai(์น)์ Claude Code(ํฐ๋ฏธ๋)๋ฅผ ๋์์ ํ์ฉํ๋ ์ ๋ต
- ์น์์ ์ค๊ณ/๊ธฐํ โ ํฐ๋ฏธ๋์์ ๊ตฌํ/์คํ์ผ๋ก ์ญํ ๋ถ๋ด
- ๋ณต์กํ ์์ ์ ํจ์จ์ ์ผ๋ก ๋ถ์ฐ ์ฒ๋ฆฌํ๋ ์ค์ ๊ธฐ๋ฒ
[S1WF17] 5ํ ๋ฐ๋ณต ๋๋ฒ๊น ๊ธฐ๋ฒ
์ฐธ๊ณ : ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /์ค์ _Tips/Claude_Code_์ฌ์ฉ๋ฒ/5ํ_๋ฐ๋ณต_๋๋ฒ๊น
_๊ธฐ๋ฒ.md
- ๋์ผ ๋ฒ๊ทธ์ ๋ํด ์ต๋ 5ํ๊น์ง ๋ค๋ฅธ ์ ๊ทผ๋ฒ์ผ๋ก ๋ฐ๋ณต ์๋ํ๋ ๋๋ฒ๊น ์ ๋ต
- 1~2ํ์ฐจ: ์ง์ ์์ , 3ํ์ฐจ: ์ ๊ทผ๋ฒ ๋ณ๊ฒฝ, 4~5ํ์ฐจ: ๊ทผ๋ณธ ์์ธ ์ฌ๋ถ์
- 5ํ ๋ด ํด๊ฒฐ ์ ๋๋ฉด ์ฌ์ฉ์์๊ฒ ์ํฉ ๋ณด๊ณ ํ ๋ฐฉํฅ ์ ํ
[S1WF18] Session Resume / Continue โ ์ธ์ ์ด์ด์ ์์
claude -c: ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๊ฐ์ฅ ์ต๊ทผ ๋ํ๋ฅผ ์ด์ด์ ๊ณ์claude -r "์ธ์ ๋ช ": ํน์ ์ธ์ ID ๋๋ ์ด๋ฆ์ผ๋ก ์ธ์ ์ฌ๊ฐ- ์ธ์ ์ด๋ฆ ์ง์ ์ผ๋ก ํ๋ก์ ํธ๋ณ ๋ํ ๊ด๋ฆฌ ๊ฐ๋ฅ
--fork-session: ๊ธฐ์กด ์ธ์ ์ ๋ถ๊ธฐํ์ฌ ์ ์ธ์ ์ผ๋ก ์ด์ด๊ฐ๊ธฐ
[S1WF19] Piping & Composability โ ํ์ดํ ์ฐ๊ฒฐ๊ณผ ์กฐํฉ
- Unix ํ์ดํ๋ก ๋ค๋ฅธ ๋๊ตฌ์ ์ฐ๊ฒฐ:
cat logs.txt | claude -p "๋ถ์ํด์ค" - ๋ก๊ทธ ๋ชจ๋ํฐ๋ง:
tail -f app.log | claude -p "์ด์ ์งํ ์๋ ค์ค" - ํ์ผ ๋ชฉ๋ก ์ ๋ฌ:
git diff main --name-only | claude -p "๋ณด์ ์ด์ ๊ฒํ " - CI/CD ์คํฌ๋ฆฝํธ์์ ์๋ํ ๋๊ตฌ๋ก ํ์ฉ
[S1WF20] Plan Mode โ ๊ณํ ๋ชจ๋
--permission-mode plan: ์ฝ๋ ์์ฑ ์ ๊ณํ์ ๋จผ์ ์ธ์ฐ๊ณ ์ฌ์ฉ์ ์น์ธ ํ ์คํ- ๋๊ท๋ชจ ๋ณ๊ฒฝ ์์ ์ ๊ณํ ๋จ๊ณ์์ ๋ฐฉํฅ ํ์ธ ๊ฐ๋ฅ
- EnterPlanMode / ExitPlanMode ๋๊ตฌ๋ก ๊ณํ ๋ชจ๋ ์ง์ /ํด์ฅ
[S1WF21] /compact โ ์ปจํ ์คํธ ์์ถ
/compact: ํ์ฌ ๋ํ ์ปจํ ์คํธ๋ฅผ ์์ฝยท์์ถํ์ฌ ํ ํฐ ์ ์ฝ- ๊ธด ์ธ์ ์์ ์ปจํ ์คํธ ์ฐฝ์ด ๊ฐ๋ ์ฐจ๊ธฐ ์ ์ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํ
- ์์ถ ํ์๋ ํต์ฌ ์ ๋ณด๋ ์ ์ง๋์ด ์์ ์ฐ์์ฑ ๋ณด์ฅ
[S1WF23] Playground โ ์คํ ํ๊ฒฝ
- playground ํ๋ฌ๊ทธ์ธ์ผ๋ก ์์ ํ ์ฝ๋ ์คํ ํ๊ฒฝ ๊ตฌ์ฑ
- ํ๋ก๋์ ์ฝ๋์ ์ํฅ ์์ด ์๋ก์ด ์์ด๋์ด๋ฅผ ๋น ๋ฅด๊ฒ ํ๋กํ ํ์ดํ
[S1WF24] Books 1๊ถ โ ๋๊ตฌ ํ์ฉ ์ํฌํ๋ก์ฐ
- 1๊ถ 05ํธ: ๋ชจ๋ฐ์ผ ์ฑ๊ณผ ์น โ Claude.ai ์น/iOS ์ฑ ํ์ฉ ์ํฌํ๋ก์ฐ
- 1๊ถ 10ํธ: Claude ๋ด๋ถ ๊ธฐ๋ฅ โ Artifacts, Projects, Vision ๋ฑ ์ํฌํ๋ก์ฐ ํ์ฉ
- 1๊ถ 11ํธ: Claude ๋ด๋ถ ๋๊ตฌ 1 โ ๋ํ, ๊ฒ์, ๋ถ์ ๊ธฐ๋ฅ ํ์ฉ
- 1๊ถ 12ํธ: Claude ๋ด๋ถ ๋๊ตฌ 2 โ ์ฝ๋ ์์ฑ, ํ์ผ ํธ์ง, ๋๋ฒ๊น ๋๊ตฌ ํ์ฉ
- 1๊ถ 15ํธ: ํ์ผ ๋ค๋ฃจ๊ธฐ โ Read, Write, Edit, Glob, Grep ๋๊ตฌ ์ค์ ํ์ฉ
- 1๊ถ 16ํธ: ๋ช ๋ น ์คํ โ Bash ๋๊ตฌ, ํฐ๋ฏธ๋ ๋ช ๋ น ์คํ ์ํฌํ๋ก์ฐ
- 1๊ถ 17ํธ: ์น ์ ๋ณด์ ์ฌ์ฉ์ ์ํธ์์ฉ โ WebSearch, WebFetch, AskUserQuestion ํ์ฉ
- 1๊ถ 18ํธ: Commands โ ์ฌ๋์ ๋ช ๋ น์ด ์ฒด๊ณ, ์ฌ์ฉ์ ์ ์ ๋ช ๋ น์ด
- 1๊ถ 19ํธ: Skills โ ์คํฌ ํ์ฉ, ์๋ ๊ฐ์ง, ์คํ ์ํฌํ๋ก์ฐ
- 1๊ถ 21ํธ: Hooks โ Pre-commit Hook, ์๋ํ ํธ๋ฆฌ๊ฑฐ ๊ธฐ์ด ํ์ฉ
- 1๊ถ 25ํธ: Mode์ Output Style โ ์คํ ๋ชจ๋, ์ถ๋ ฅ ํ์ ์ํฌํ๋ก์ฐ
- 1๊ถ 28ํธ: ์๋ํ ์ฝ๋ ์์ฑ โ ์ฝ๋ ์๋ ์์ฑ ํจํด๊ณผ ์ํฌํ๋ก์ฐ
- 1๊ถ 29ํธ: ๋ ธ์ฝ๋ ์๋ํ ๋๊ตฌ โ ๋น๊ฐ๋ฐ์์ฉ ์๋ํ ์ํฌํ๋ก์ฐ
- 1๊ถ 32ํธ: ํ๋กฌํํธ ์์ง๋์ด๋ง ๊ธฐ์ด โ ํจ๊ณผ์ ์ธ ์ง์ ๋ฐฉ๋ฒ
- 1๊ถ 33ํธ: ํ๋กฌํํธ ์์ง๋์ด๋ง ์ฌํ โ ๊ณ ๊ธ ํ๋กฌํํธ ์ ๋ต
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S1WF25] Books 3๊ถ โ Task ๊ด๋ฆฌ ์ํฌํ๋ก์ฐ
- 3๊ถ 04ํธ: Task ์์ฑ๊ณผ ์์กด์ฑ ๊ด๋ฆฌ โ Task ์์ฑ ๊ธฐ์ด ์ํฌํ๋ก์ฐ
- 3๊ถ 05ํธ: Task Instruction ์์ฑ๋ฒ โ Task ์ง์นจ์ ์์ฑ ๊ธฐ์ด
- 3๊ถ 09ํธ: SAL Grid ๋งค๋ด์ผ ํ์ฉ๋ฒ โ ๋งค๋ด์ผ ๊ธฐ๋ฐ ์ํฌํ๋ก์ฐ ๊ธฐ์ด
- 3๊ถ 10ํธ: Order Sheet ์ ๋ โ Order Sheet ํ์ฉ ์ํฌํ๋ก์ฐ ๊ธฐ์ด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/3๊ถ_ํ๋ก์ ํธ_๊ด๋ฆฌ_๋ฐฉ๋ฒ/
[S1WF26] ์ค์ Tips โ ์ฌ์ฉ๋ฒ/๋๊ตฌ/์ธ์ /๊ฐ๋ฐ/๋ฐฑ์
Claude_Code_์ฌ์ฉ๋ฒ/โ 5ํ ๋๋ฒ๊น ๊ท์น, /status ํ์ฉ, ๋์ผ ๋ชจ๋ ์ด์ฉ (3๊ฐ)๋๊ตฌ_ํ์ฉ/โ MCP ์ค์ , Skills ํ์ฉ, Commands, Slash Commands, Pre-commit Hook, ์๋ธ์์ด์ ํธ (8๊ฐ)์ธ์ _๊ด๋ฆฌ/โ CLI ๋์ ์คํ, resume ๋ณต๊ตฌ, ๋ณ๋ ฌ ์ธ์คํด์ค, ์ธ์ ์ ๋ฆฌ (6๊ฐ)๊ฐ๋ฐ_์ค๋ฌด/โ ํ์ผ ์์น, ํด๋ ๊ด๋ฆฌ, ํ์ผ๋ช ๊ท์น, ๋ฐ์ํ ๋์์ธ, ์ต์ ํ (14๊ฐ)์์ _๊ธฐ๋ก_๋ฐฑ์ /โ Git ๋ฒ์ ๊ด๋ฆฌ, work_logs, outbox, Orders/Reports, ๋ฐฑ์ ์ ๋ต (6๊ฐ)ํธ๋ฌ๋ธ์ํ /โ ๋ก์ปฌ ์๋ฒ, ์ฝ์ ์๋ฌ, CSP ๋ฌธ์ , ์๋ฌ ํธ๋ค๋ง (4๊ฐ)ํธ์_๊ธฐ๋ฅ/โ ์์ฑ ์ง์ ํ์ฉ (Windows/AI) (2๊ฐ)ํจ์จ์ ์ธ_์ํต/โ ๊ตฌ์ฒด์ ์ง๋ฌธ, ๋จ๊ณ๋ณ ์์ฒญ, ๋์ ์์ฒญ, ์ดํด๋ ๋๊น์ง ์ง๋ฌธ (5๊ฐ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S1WF27] Custom Skills โ ์ปค์คํ ์คํฌ ์์ 3์ข
ai-tutor-build(SKILL.md) โ AI ํํฐ ๋น๋ ์คํฌ ์์deal-news(SKILL.md) โ ๋ด์ค ์์ง ์๋ํ ์คํฌ ์์youtube-generate(SKILL.md) โ ์ ํ๋ธ ์ฝํ ์ธ ์์ฑ ์คํฌ ์์
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Custom_Skills/
[S1WF28] .claude Methods โ CRUD/๋ก๊ทธ์ธ ์๋ฌ ์ ์ฐจ
- methods:
01_supabase-crud.mdโ Supabase CRUD 4๋จ๊ณ(์กฐํ/์์ฑ/์์ /์ญ์ ) ๊ธฐ๋ณธ ํ๋ฆ - methods:
03_login-error.mdโ ๋ก๊ทธ์ธ ์๋ฌ ์ฆ์ ๋ถ๋ฅ ๋ฐ ์ด๊ธฐ ๋์ ์ฒดํฌ๋ฆฌ์คํธ
๐ ๊ฒฝ๋ก: .claude/methods/
S1TO โ ํ์ด์ฉ (Team Operations)
[S1TO2] Slack ์ฐ๋ โ ํ ์ฑํ ์์ AI ํธ์ถ
- Slack์์
@Claude๋ฉ์ ์ผ๋ก ๋ฒ๊ทธ ๋ฆฌํฌํธ ์ ๋ฌ โ PR ์๋ ์์ฑ - ํ ์ฑํ ์ฑ๋์์ ์ง์ ์ฝ๋ฉ ์์ ์ ์์ฒญํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ ํ์ ํจํด
- ๋น๊ฐ๋ฐ์(PM, ๋์์ด๋)๋ Slack์ ํตํด AI์๊ฒ ์์ ์์ฒญ ๊ฐ๋ฅ
[S1TO1(์น์ 07a)] ์๋ธ์์ด์ ํธ ๊ธฐ๋ณธ
์ 8์ฅ: ๋ฉํฐํ์คํน๊ณผ ๋ณ๋ ฌ ์ฒ๋ฆฌ
"๋ณ๋ ฌ๋ก ์ผํ๋, ๋์์ ์๊ฐํ๋ผ" - ์ํํธ์จ์ด ์ํคํ ์ฒ ์์น
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
mindmap
root((ํ์ต ๋ชฉํ))
๋ฉํฐ ์ธ์คํด์ค ๊ด๋ฆฌ
ํจ๊ณผ์ ์ธ ์ญํ ๋ถ๋ด
์ปจํ
์คํธ ์ต์ ํ
์์
๋๊ธฐํ
๋ณ๋ ฌ ๊ฐ๋ฐ ํ๊ฒฝ
Git Worktree ํ์ฉ
๋
๋ฆฝ์ ๊ฐ๋ฐ ๊ณต๊ฐ
๋ธ๋์น๋ณ ํนํ ์ค์
๋ง์ดํฌ๋ก์๋น์ค ๊ฐ๋ฐ
์๋น์ค๋ณ ์ ๋ฌธํ
๋์ ๊ฐ๋ฐ ์ ๋ต
ํตํฉ ๊ด๋ฆฌ
์ ๋ณด ๊ณต์ ์ต์ ํ
์ปจํ
์คํธ ๊ด๋ฆฌ
์ธ์คํด์ค ๊ฐ ํ์
์ง์ ๋๊ธฐํ
ํ์ต ๋ชฉํ
์ด ์ฅ์ ์๋ฃํ๋ฉด ๋ค์์ ํ ์ ์์ต๋๋ค.
- ์ฌ๋ฌ Claude Code ์ธ์คํด์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ์ฉํ ์ ์์ต๋๋ค.
- Git Worktree์ ์ฐ๋ํ ๋ณ๋ ฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
- ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์ ๋์ ๊ฐ๋ฐ์ ์ํํ ์ ์์ต๋๋ค.
- ์ปจํ ์คํธ ๊ด๋ฆฌ์ ์ธ์คํด์ค ๊ฐ ์ ๋ณด ๊ณต์ ๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
๊ฐ์
ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ณต์กํ ์์คํ ์ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ผ๋ก ์ธํด ํ์ฐ์ ์ผ๋ก ๋ฉํฐํ์คํน์ด ํ์ํ ํ๊ฒฝ์ด ๋์์ต๋๋ค. Claude Code์ ๋ฉํฐ ์ธ์คํด์ค ํ์ฉ์ ๋จ์ํ ์ฌ๋ฌ ์์ ์ ๋์์ ํ๋ ๊ฒ์ ๋์ด์, ๊ฐ ์ธ์คํด์ค๊ฐ ํนํ๋ ์ญํ ์ ์ํํ๋ฉฐ ์๋์ง๋ฅผ ์ฐฝ์ถํ๋ ๊ณ ๊ธ ๊ฐ๋ฐ ์ ๋ต์ ๋๋ค.
์ด ์ฅ์์๋ ์ฌ๋ฌ Claude Code ์ธ์คํด์ค๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ๊ฐ๊ฐ์ ํน์ฑ์ ๋ง๋ ์ญํ ์ ๋ถ์ฌํ์ฌ ๊ฐ๋ฐ ํจ์จ์ฑ์ ๊ทน๋ํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃน๋๋ค.
8.1 ์ฌ๋ฌ Claude ์ธ์คํด์ค ํ์ฉ
๋ฉํฐ ์ธ์คํด์ค ์ ๋ต์ ๊ฐ ์ธ์คํด์ค๊ฐ ํน์ ๋๋ฉ์ธ์ ํนํ๋์ด ์ผ๊ด์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋๋ก ํ๋ ๊ฒ์ด ํต์ฌ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ์ ์ค์ด๊ณ ๊ฐ ์์ญ๋ณ ์ ๋ฌธ์ฑ์ ํ๋ณดํ ์ ์์ต๋๋ค.
ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ๋ฉํฐ ์ธ์คํด์ค ํ์ฉ์ ๋จ์ํ ๋ณ๋ ฌ ์์ ์ ๋์ด์ ์ ๋ต์ ์ํคํ ์ฒ ๊ด์ ์์ ์ ๊ทผํด์ผ ํฉ๋๋ค. ๊ฐ ์ธ์คํด์ค๋ ๋ง์น ์ ๋ฌธ ํ์์ฒ๋ผ ๊ณ ์ ํ ์ญํ ๊ณผ ์ฑ ์์ ๊ฐ์ง๋ฉฐ, ์๋ก ๋ค๋ฅธ ๊ธฐ์ ์ ๋งฅ๋ฝ๊ณผ ๋น์ฆ๋์ค ๋๋ฉ์ธ์ ์ต์ ํ๋์ด ์ด์๋ฉ๋๋ค.
์ํฐํ๋ผ์ด์ฆ๊ธ ๋ฉํฐ ์ธ์คํด์ค ์ํคํ ์ฒ
ํจ๊ณผ์ ์ธ ๋ฉํฐ ์ธ์คํด์ค ์ ๋ต์ ๋จ์ํ ์์ ๋ถํ ์ ๋์ด์ ๊ฐ ์ธ์คํด์ค์ ์ ๋ฌธ์ฑ๊ณผ ์ํธ ๋ณด์์ฑ์ ๊ณ ๋ คํ ์ฒด๊ณ์ ์ค๊ณ๊ฐ ํ์ํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph TD
subgraph core [ํต์ฌ ๊ฐ๋ฐ ์์ญ]
A[Frontend Studio<br/>์ธ์คํด์ค #1<br/>UX/UI ์ ๋ฌธ๊ฐ]
B[Backend Engine<br/>์ธ์คํด์ค #2<br/>์์คํ
์ํคํ
ํธ]
end
subgraph ops [์ด์ ๋ฐ ํ์ง ๊ด๋ฆฌ]
C[DevOps Pipeline<br/>์ธ์คํด์ค #3<br/>ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ๋ฌธ๊ฐ]
D[QA & Monitoring<br/>์ธ์คํด์ค #4<br/>ํ์ง ๋ณด์ฆ ์ ๋ฌธ๊ฐ]
end
subgraph integration [ํตํฉ ๊ด๋ฆฌ]
E[Integration Hub<br/>์ธ์คํด์ค #5<br/>์ํคํ
์ฒ ์กฐ์ ์]
end
A <--> B
A --> C
B --> C
C <--> D
A --> E
B --> E
C --> E
D --> E
F[ํฌ๋ก์ค ๋๋ฉ์ธ ์ด์ ํด๊ฒฐ] -.-> E
G[์ํคํ
์ฒ ์ผ๊ด์ฑ ๊ฒ์ฆ] -.-> E
H[ํ ๊ฐ ์ปค๋ฎค๋์ผ์ด์
์กฐ์ ] -.-> E
classDef coreStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef opsStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef hubStyle fill:#cbd5e1,stroke:#475569,stroke-width:3px,color:#1e293b
classDef activityStyle fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#64748b
class A,B coreStyle
class C,D opsStyle
class E hubStyle
class F,G,H activityStyle
์ธ์คํด์ค๋ณ ์ญํ ๋ถ๋ด
Frontend Studio (์ธ์คํด์ค #1) - ์ฌ์ฉ์ ๊ฒฝํ ์ ๋ฌธ๊ฐ
ํ๋ก ํธ์๋ ์ ์ฉ ์ธ์คํด์ค๋ ๋จ์ํ UI ๊ฐ๋ฐ์ ๋์ด์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ชจ๋ ์ธก๋ฉด์ ๋ด๋นํ๋ ์ ๋ฌธ๊ฐ ์ญํ ์ ์ํํฉ๋๋ค.
[S1TO3] CLAUDE.md โ ํ ๊ท์น ๋ฐ ์์ด์ ํธ ์ญํ ์ ์
- CLAUDE.md์ ์์ด์ ํธ ์ญํ ๋ฐฐ๋ถ๊ณผ ํ ํ์ ๊ท์น์ ์ ์
- ์: "Task Agent โ Verification Agent (์์ฑ์์ ๊ฒ์ฆ์ ๋ถ๋ฆฌ)"
- ์๋ธ์์ด์ ํธ ํฌ์ ๊ธฐ์ค, ํ ๊ตฌ์ฑ ์์น ๋ฑ ๋ช ์
- AI๊ฐ ์ ์ ํ ์ญํ ๋ถ๋ด์ ์งํค๋ฉฐ ํ์ ํ๋๋ก ์ ๋
- deploy-subagent-core ์คํฌ: ์๋ธ์์ด์ ํธ ์ต์ ํธ์ฑ ์ ๋ต ๋๊ตฌ
[S1TO4] Platoon Formation โ ์๋ ํธ์ ํ๊ตฌ์ฑ
- platoon-formation ์คํฌ: 42๋ช ๊ท๋ชจ ์๋ ํธ์ ๋ฐฉ์ ํ๊ตฌ์ฑ (์๋์ฅ+์ฐ๋ฝ๋ณ+3๋ถ๋+์ฉ๋ณ+์คํฌ)
npx skills add anthropics/platoon-formation์ผ๋ก ์ค์น ํ/platoon-formation๋ช ๋ น์ด ์ฌ์ฉ
[S1TO5] Deploy Skill โ ์คํฌ ํธ์ฑ ์ ๋ต
- deploy-skill-core ์คํฌ: ์ต์ ์คํฌ ์กฐํฉ ํธ์ฑ ๋ฐ ์ฅ์ฐฉ ์ ๋ต
- ํ๋ก์ ํธ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ํ์ํ ์คํฌ ์ธํธ๋ฅผ ์๋ ์ถ์ฒํ๊ณ ํธ์ฑ
[S1TO6] Books 1๊ถ โ ๋ฉํฐํ์คํน/ํ์ ํ์ต
- 1๊ถ 20ํธ: Subagents โ ์๋ธ์์ด์ ํธ ๊ฐ๋ , ์ ํ, ๋ณ๋ ฌ ์ฒ๋ฆฌ, ์์ ์ ๋ต
- 1๊ถ 22ํธ: MCP โ MCP ์๋ฒ ๊ฐ๋ ๋ฐ ๋๊ตฌ ์ฐ๋ ๊ธฐ์ด
- 1๊ถ 27ํธ: GitHub Actions์ Agent SDK โ ์๋ํ ํ์ดํ๋ผ์ธ, ์ปค์คํ ์์ด์ ํธ ๋น๋ ๊ฐ๋
- 1๊ถ 30ํธ: ๋ณตํฉ AI ํ์ฉ ์ ๋ต โ ๋ฉํฐ AI ํ์ , ์ค์ผ์คํธ๋ ์ด์ ํจํด ๊ธฐ์ด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S1TO7] ์ค์ Tips โ AI ์์คํ /์๋ธ์์ด์ ํธ/MCP
๋๊ตฌ_ํ์ฉ/์๋ธ์์ด์ ํธ_ํจ๊ณผ์ ์ผ๋ก_ํ์ฉํ๊ธฐ.mdโ ์๋ธ์์ด์ ํธ ์ค์ ํ์ฉ ํจํด๋๊ตฌ_ํ์ฉ/Multi-Role_AI_์์คํ ๊ณผ_Multi-Agent_์์คํ _๋น๊ต.mdโ ์์คํ ์ํคํ ์ฒ ๋น๊ต๋๊ตฌ_ํ์ฉ/MCP_์๋ฒ_์ค์ ๊ณผ_ํ์ฉ.mdโ MCP ์๋ฒ ๊ธฐ์ด ์ค์ ๋ฐ ํ์ฉ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/๋๊ตฌ_ํ์ฉ/
[S1TO8] .claude ์ฐธ๊ณ โ Subagents/Skills ๋ชฉ๋ก
- subagents: 20๊ฐ ์๋ธ์์ด์ ํธ ์ญํ ๋ถ๋ฅ โ ๊ฐ๋ฐ(frontend/backend/fullstack/database), ํ์ง(code-reviewer/qa/test-engineer/test-runner), ๋ณด์(security-specialist/auditor), ์ง์(debugger/devops/documentation/content/copywriter/ui-designer/data-scientist/api-designer/performance-optimizer/refactoring-specialist)
- skills: 17๊ฐ ์คํฌ ์นดํ ๊ณ ๋ฆฌ ์๊ฐ โ ๊ฐ๋ฐ(api-builder/fullstack-dev/ui-builder), ํ ์คํธ(api-test/e2e-test/test-runner), ์ธํ๋ผ(cicd-setup/deployment/db-schema), ํ์ง(code-review/security-audit/performance-check), ๋ฌธ์(doc-writer/ppt-creator/project-plan/troubleshoot)
๐ ๊ฒฝ๋ก:.claude/subagents/,.claude/skills/
S1QC โ ํ์ง๊ด๋ฆฌ (Quality Control)
[S1QC1(์น์ 12)] ๋ฐ์ด๋ธ ์ฝ๋ฉ โ ํ ๋์ ๋์ ๊ณผ์ ์ ํด๊ฒฐ ์ ๋ต
12.7 ๊ณ ๊ธ ๋์ ๊ณผ์ ์ ํด๊ฒฐ ์ ๋ต
Claude Code์ ํ ๋์ ๊ณผ์ ์์ ๋ง์ฃผ์น๋ ๋ณต์กํ ๋์ ๊ณผ์ ๋ค์ ๋จ์ํ ๊ธฐ์ ์ ๋ฌธ์ ๋ฅผ ๋์ด์ ์กฐ์ง ๋ฌธํ, ๊ฐ์ธ์ ์ ํญ, ๊ทธ๋ฆฌ๊ณ ์ฅ๊ธฐ์ ์ ๋ต๊ณผ ๊ด๋ จ๋ ๋ค์ธต์ ์ด์๋ค์ ๋๋ค. ์ด๋ฌํ ๋์ ๊ณผ์ ๋ค์ ์ฒด๊ณ์ ์ผ๋ก ๋ถ์ํ๊ณ ํด๊ฒฐํ๋ ๊ฒ์ด ์ฑ๊ณต์ ์ธ ๋์ ์ ํต์ฌ์ ๋๋ค.
์ฌ์ธต์ ๋์ ๊ณผ์ ๋ถ์
1. AI ์์กด์ฑ๊ณผ ์ญ๋ ๊ท ํ
# ๊ฑด์ ํ AI ์์กด์ฑ ๊ด๋ฆฌ
claude "ํ์ AI ์์กด์ฑ์ ๊ฑด์ ํ๊ฒ ๊ด๋ฆฌํ๋ ์ ๋ต์ ์๋ฆฝํด์ค.
ํ์ฌ ์ํฉ ๋ถ์
- ํ์๋ณ Claude ํ์ฉ ํจํด๊ณผ ์์กด๋
- AI ์์ด ๊ฐ๋ฐํ ์ ์๋ ์ญ๋ ์์ค
- ์ฐฝ์์ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ ๋ณํ
- ๊ธฐ๋ณธ์ ์ธ ์ฝ๋ฉ ์คํฌ ์ ์ง ์ํ
- ๋นํ์ ์ฌ๊ณ ์ ์ค๊ณ ๋ฅ๋ ฅ ๋ฐ์ ๋
๊ท ํ ์กํ ๊ฐ๋ฐ ์ ๋ต
- ์ฃผ๊ฐ 'AI-Free Development' ์๊ฐ ์ด์
- ๊ธฐ๋ณธ ์๋ฆฌ ์ดํด ์ค์ฌ์ ํ์ต ํ๋ก๊ทธ๋จ
- ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ ์ ๊ธฐ ์คํฐ๋
- ํ์ดํธ๋ณด๋ ์ฝ๋ฉ๊ณผ ํ์ด ํ๋ก๊ทธ๋๋ฐ
- ์ค๊ณ ์ฌ๊ณ ์ ์ํคํ
์ฒ ์ญ๋ ๊ฐํ"
# ๊ฐ์ธ๋ณ ๋ง์ถคํ ์ญ๋ ๊ฐํ
claude "ํ์๋ณ๋ก AI์์ ๊ฑด์ ํ ํ์
๋ฐฉ์์ ๊ฐ๋ฐํด์ค.
์ ์
๊ฐ๋ฐ์: ๊ธฐ๋ณธ๊ธฐ ์ฐ์ , AI๋ ๋ณด์กฐ ๋๊ตฌ๋ก ํ์ฉ
- ํต์ฌ ๊ฐ๋
์ดํด ํ AI ํ์ฉ ํ์ฉ
- ๋จ๊ณ๋ณ ๋์ ์์ฒญ๋ณด๋ค๋ ์ ์ฒด ๋งฅ๋ฝ ํ์ต
- ๋๋ฒ๊น
๊ณผ ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ ์ฐ์ ๊ฐ๋ฐ
- AI ์ ์์ ๋ํ ๋นํ์ ํ๊ฐ ๋ฅ๋ ฅ ๋ฐฐ์
์๋์ด ๊ฐ๋ฐ์: AI๋ฅผ ์ฐฝ์์ฑ ์ฆํญ ๋๊ตฌ๋ก ํ์ฉ
- ์ํคํ
์ฒ ์ค๊ณ์ ์ ๋ต์ ์์ฌ๊ฒฐ์ ์ฃผ๋
- AI๋ฅผ ํตํ ๋์ ํ์๊ณผ ๊ฒ์ฆ
- ๋ณต์กํ ๋ฌธ์ ์ ๊ตฌ์กฐํ์ ๋ถํด
- ํ ์ ์ฒด์ AI ํ์ฉ ๊ฐ์ด๋๋ผ์ธ ์ ์"
2. ํ์ง ์ผ๊ด์ฑ๊ณผ ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฌธํ
# ๊ณ ๋ํ๋ ํ์ง ๋ณด์ฅ ์์คํ
claude "AI ์์ฑ ์ฝ๋์ ํ์ง ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ์์คํ
์ ๊ตฌ์ถํด์ค.
๋ค์ธต์ ํ์ง ๊ฒ์ฆ
- AI ์ฝ๋ ์์ฑ ์ ์๋ ํ์ง ์ฒดํฌ
- ํผ์ด ๋ฆฌ๋ทฐ์์์ AI ํนํ ๊ฒ์ฆ ํญ๋ชฉ
- ์ ์ ๋ถ์๊ณผ ๋์ ํ
์คํธ ๊ฐํ
- ์ฝ๋ ํจํด ์ผ๊ด์ฑ ์๋ ๊ฒ์ฆ
- ์ฅ๊ธฐ์ ์ ์ง๋ณด์์ฑ ํ๊ฐ
์งํํ๋ ๋ฆฌ๋ทฐ ๋ฌธํ
- AI ํ์ฉ ๊ณผ์ ์ ํฌ๋ช
์ฑ ํ๋ณด
- ์ค๊ณ ๊ฒฐ์ ๊ณผ ํธ๋ ์ด๋์คํ ๋ฌธ์ํ
- ํ์ต ์ค์ฌ์ ๊ฑด์ค์ ํผ๋๋ฐฑ
- ์ฝ๋ ํ์ง ํ์ค์ ์ง์์ ๊ฐ์
- ํ ์ ์ฒด์ ์ง๋จ ์งํ ํ์ฉ"
# ํ์ง ๋ฉํธ๋ฆญ ์๋ํ
claude "AI ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ํ์ง์ ์๋์ผ๋ก ์ถ์ ํ๋ ์์คํ
์ ๋ง๋ค์ด์ค.
์ค์๊ฐ ํ์ง ์งํ
- ์ฝ๋ ๋ณต์ก๋์ ๊ฐ๋
์ฑ ์ ์
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ํ
์คํธ ํ์ง
- ๋ณด์ ์ทจ์ฝ์ ๊ณผ ์ฑ๋ฅ ์ด์
- ๋ฌธ์ํ ์์ฑ๋์ ์ต์ ์ฑ
- ํ ์ฝ๋ฉ ์คํ์ผ ์ผ๊ด์ฑ
ํ์ง ํธ๋ ๋ ๋ถ์
- ์๊ฐ์ ๋ฐ๋ฅธ ํ์ง ์งํ ๋ณํ
- AI ํ์ฉ๋์ ํ์ง์ ์๊ด๊ด๊ณ
- ๊ฐ์ธ๋ณ/ํ๋ก์ ํธ๋ณ ํ์ง ํจํด
- ๋ฆฌํฉํ ๋ง ํ์์ฑ ์์ธก
- ๊ธฐ์ ๋ถ์ฑ ๋์ ๋ฐฉ์ง ์๋ฆผ"
3. ํ ์ญ๋ ๊ฒฉ์ฐจ์ ํ์ ํจ์จ์ฑ
# ํ ๋ด AI ํ์ฉ ๊ฒฉ์ฐจ ํด์
claude "ํ์ ๊ฐ Claude ํ์ฉ ๋ฅ๋ ฅ ์ฐจ์ด๋ฅผ ์ค์ด๋ ์ ๋ต์ ์๋ฆฝํด์ค.
ํ์ฌ ์ํ ์ง๋จ
- ํ์๋ณ AI ํ์ฉ ์๋ จ๋ ํ๊ฐ
- ์์ฐ์ฑ ๊ฒฉ์ฐจ์ ์ํฅ ์์ธ ๋ถ์
- ํ์
ํจํด๊ณผ ์ง์ ๊ณต์ ์์ค
- ํ์ต ์์๊ณผ ๋ณํ ์์ฉ์ฑ ์ธก์
- ๋ฉํ ๋ง ๋คํธ์ํฌ์ ์ง์ ์ฒด๊ณ
๊ฒฉ์ฐจ ํด์ ํ๋ก๊ทธ๋จ
- ๋จ๊ณ๋ณ AI ํ์ฉ ๊ต์ก ์ปค๋ฆฌํ๋ผ
- ๋ฒ๋ ์์คํ
๊ณผ 1:1 ๋ฉํ ๋ง
- ์ค์ ํ๋ก์ ํธ ๊ธฐ๋ฐ ํ์ต
- ์ ๊ธฐ์ ์ธ ํ์ฉ๋ฒ ๊ณต์ ์ธ์
- ๊ฐ์ธ๋ณ ๋ง์ถคํ ํผ๋๋ฐฑ๊ณผ ์ง๋"
# ํ์
์๋์ง ๊ทน๋ํ
claude "AI๋ฅผ ํ์ฉํ ํ ํ์
์ ์๋์ง๋ฅผ ๊ทน๋ํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํด์ค.
ํ์
ํจํด ์ต์ ํ
- ์ญํ ๋ณ AI ํ์ฉ ์ ๋ต ์ฐจ๋ณํ
- ํฌ๋ก์ค ํ์
๋ ํ์ํฌ ๊ฐํ
- ์ง์ ๊ณต์ ์ ์ง๋จ ํ์ต ์ด์ง
- ์์ฌ๊ฒฐ์ ๊ณผ์ ์ ํฌ๋ช
์ฑ ํ๋ณด
- ์ฐฝ์์ฑ๊ณผ ํ์ ๋ฌธํ ์กฐ์ฑ
์กฐ์ง ์ฐจ์์ ๋ณํ ๊ด๋ฆฌ
- ๋ฆฌ๋์ญ์ AI ์ ๋ต๊ณผ ๋น์ ์ ์
- ์ฑ๊ณผ ํ๊ฐ ์์คํ
์ ์ ์
- ์ธ์ผํฐ๋ธ์ ๋๊ธฐ๋ถ์ฌ ์ฒด๊ณ
- ์ง์์ ํ์ต ๋ฌธํ ๊ตฌ์ถ
- ์คํจ์ ๋ํ ๊ด์ฉ๊ณผ ์คํ ์ ์ "
์๊ธฐ ์ํฉ ๋์๊ณผ ๋ณต๊ตฌ ์ ๋ต
์์คํ ๋ณต์๋ ฅ๊ณผ ์ฐ์์ฑ ๊ณํ
# AI ์๋น์ค ์ค๋จ ์ ๋์ ๊ณํ
claude "Claude Code ์๋น์ค ์ค๋จ ์ํฉ์ ๋๋นํ ํ ๋์ ๋งค๋ด์ผ์ ์์ฑํด์ค.
์ฆ์ ๋์ (1-2์๊ฐ)
- ํต์ฌ ์
๋ฌด ์ฐ์ ์์ ์ฌ์กฐ์
- ๋์ฒด ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ผ๋ก ์ ํ
- ์งํ ์ค์ธ ์์
์ ์ ์ฅ๊ณผ ๋ฐฑ์
- ํ ์ปค๋ฎค๋์ผ์ด์
๋ฐฉ์ ์กฐ์
- ๊ณ ๊ฐ๊ณผ ์ดํด๊ด๊ณ์ ์ํฉ ๊ณต์
๋จ๊ธฐ ๋์ (1-3์ผ)
- ์๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค ํ์ฑํ
- ๊ธฐ์กด ์ฝ๋์ ๋ฌธ์ ์ต๋ ํ์ฉ
- ํ์ ๊ฐ ์ง์ ๊ณต์ ๊ฐํ
- ์ธ๋ถ ๋๊ตฌ์ ๋ฆฌ์์ค ํ์ฉ
- ์
๋ฌด ์ผ์ ๊ณผ ๋ง์ผ์คํค ์กฐ์
์ฅ๊ธฐ ๋์ (1์ฃผ ์ด์)
- ๋์ฒด AI ๋๊ตฌ ํ๊ฐ์ ๋์
- ํ๋ก์ธ์ค ๊ฐ์ ๊ณผ ์๋ํ ๊ฐํ
- ํ ์คํฌ ๋ค์ํ์ ์ญ๋ ๊ฐํ
- ์์กด์ฑ ๋ถ์ฐ ์ ๋ต ์๋ฆฝ
- ๋ณต๊ตฌ ํ ๊ฐ์ ๋ฐฉ์ ์ค๋น"
# ํ ํ๋ ฅ์ฑ ๊ฐํ
claude "์์์น ๋ชปํ ๋ณํ์ ๋ํ ํ์ ์ ์๋ ฅ์ ๊ฐํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํด์ค.
ํ๋ ฅ์ฑ ๊ตฌ์ถ ์์
- ๋ค์ํ ๊ธฐ์ ๊ณผ ๋๊ตฌ์ ๋ํ ๊ฒฝํ
- ๋ฌธ์ ํด๊ฒฐ ์ ๊ทผ๋ฒ์ ๋ค๊ฐํ
- ํ์ ๊ฐ ์คํฌ ์ค๋ณต๊ณผ ๋ฐฑ์
- ์ง์์ ํ์ต๊ณผ ์ ์ ๋ฌธํ
- ๋ณํ์ ๋ํ ๊ธ์ ์ ๋ง์ธ๋์
์ค๋ฌด ์ ์ฉ ๋ฐฉ์
- ์ ๊ธฐ์ ์ธ ๊ธฐ์ ์คํ ๋ค์ํ ์คํ
- ๋กํ
์ด์
๊ณผ ํฌ๋ก์ค ํธ๋ ์ด๋
- ์๊ธฐ ์๋ฎฌ๋ ์ด์
๊ณผ ๋์ ํ๋ จ
- ์ธ๋ถ ๋คํธ์ํฌ์ ์ปค๋ฎค๋ํฐ ์ฐธ์ฌ
- ํ์ ๊ณผ ์คํ์ ์ฅ๋ คํ๋ ๋ฌธํ"
[S1QC2(์น์ 13a)] Git ๊ธฐ๋ณธ โ ์ ๋ ๊ธ์ง & ๋ ๋ ํ๋๊ทธ
3.5 Git ์ฐ๋๊ณผ ๋ฒ์ ๊ด๋ฆฌ
๊ธฐ๋ณธ Git ์์
์ผ์์ ์ธ ๋ฒ์ ๊ด๋ฆฌ ์์ ์ Claude Code์ ํจ๊ป ์ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
# ์ํ ํ์ธ
claude "git ์ํ๋ฅผ ํ์ธํ๊ณ ๋ณ๊ฒฝ์ฌํญ์ ์์ฝํด์ค"
# ์คํ
์ด์ง
claude "์์ ๋ ํ์ผ ์ค ํ
์คํธ ๊ด๋ จ ํ์ผ๋ง ์คํ
์ด์งํด์ค"
# ์ปค๋ฐ
claude "์๋ฏธ ์๋ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํด์ ์ปค๋ฐํด์ค"
# ๋ธ๋์น ๊ด๋ฆฌ
claude "์๋ก์ด ๊ธฐ๋ฅ์ ์ํ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ์ฒดํฌ์์ํด์ค"
๊ณ ๊ธ Git ์์
๋ณต์กํ Git ์์ ๋ Claude Code์ ๋์์ผ๋ก ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
# ๋ํํ ๋ฆฌ๋ฒ ์ด์ค
claude "์ต๊ทผ 3๊ฐ ์ปค๋ฐ์ ์ ๋ฆฌํด์ ํ๋๋ก ํฉ์ณ์ค"
# ์ถฉ๋ ํด๊ฒฐ
claude "๋จธ์ง ์ถฉ๋์ ํด๊ฒฐํด์ค. ๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ชจ๋ ์ ์งํ๋ ๋ฐฉํฅ์ผ๋ก"
# ํ์คํ ๋ฆฌ ๋ถ์
claude "์ด ๋ฒ๊ทธ๊ฐ ์ธ์ ๋์
๋๋์ง git bisect๋ก ์ฐพ์์ค"
# ์ฒด๋ฆฌํฝ
claude "hotfix ๋ธ๋์น์ ๋ฒ๊ทธ ์์ ์ปค๋ฐ๋ง main์ผ๋ก ์ฒด๋ฆฌํฝํด์ค"
Pull Request ์์ฑ
ํ ํ์ ์์ ์ค์ํ Pull Request ๊ด๋ จ ์์ ๋ค์ ๋๋ค.
# PR ์์ฑ
claude "์ด ๊ธฐ๋ฅ์ ๋ํ Pull Request๋ฅผ ์์ฑํด์ค.
๋ณ๊ฒฝ์ฌํญ์ ์์ฝํ๊ณ , ํ
์คํธ ๋ฐฉ๋ฒ๋ ํฌํจํด์ค"
# ์ฝ๋ ๋ฆฌ๋ทฐ ๋์
claude "๋ฆฌ๋ทฐ์ด๊ฐ ์ง์ ํ ์ฌํญ๋ค์ ์์ ํ๊ณ ๋ต๋ณ์ ์์ฑํด์ค"
# PR ํ
ํ๋ฆฟ ํ์ฉ
claude "ํ๋ก์ ํธ์ PR ํ
ํ๋ฆฟ์ ๋ง์ถฐ์ ์ค๋ช
์ ์์ฑํด์ค"
# CLAUDE.md
## ๐จ ์ค์ ๊ท์น (ํญ์ ์ค์)
- ์ ๋ main ๋ธ๋์น์ ์ง์ ํธ์ ๊ธ์ง
- ๋ชจ๋ API ํค๋ ํ๊ฒฝ ๋ณ์๋ก
- ํ
์คํธ ์๋ ์ฝ๋ ์ปค๋ฐ ๊ธ์ง
## ๐ ์ผ๋ฐ ๊ฐ์ด๋๋ผ์ธ
- ๊ฐ๋ฅํ๋ฉด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ์ฃผ์์ ์ต์ํ, ์ฝ๋๋ก ์ค๋ช
## ๐ก ๊ถ์ฅ์ฌํญ
- ์๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์
์ ํ ๋
ผ์
- ์ฑ๋ฅ ์ต์ ํ๋ ์ธก์ ํ ์งํ
[S1QC3] CLAUDE.md โ ์ฝ๋ฉ ๊ท์น ๋ฐ ํ์ง ๊ธฐ์ค ์ ์
- CLAUDE.md์ ์ฝ๋ฉ ์คํ์ผ, ๋ค์ด๋ฐ ๊ท์น, ๋ณด์ ๊ท์น์ ์ ์
- ์: "kebab-case ํ์ผ๋ช ํ์", "OWASP Top 10 ์ทจ์ฝ์ ๋ฐฉ์ง", "๊ฒ์ฆ ์์ด ์๋ฃ ๋ณด๊ณ ๊ธ์ง"
- ๋ฆฐํธ ๊ท์น, ํ ์คํธ ๊ธฐ์ค, ์ฝ๋ ๋ฆฌ๋ทฐ ์ฒดํฌ๋ฆฌ์คํธ ํฌํจ ๊ฐ๋ฅ
- AI๊ฐ ์ผ๊ด๋ ํ์ง ๊ธฐ์ค์ ์ค์ํ๋ฉฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ํต์ฌ ์ฅ์น
[S1QC4] Sandboxing โ ๋ณด์ ๊ฒฉ๋ฆฌ ํ๊ฒฝ
- Sandboxing: Claude Code์ ํ์ผ ์ ๊ทผ๊ณผ ๋ช ๋ น ์คํ์ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ผ๋ก ์ ํ
- ๋ฏผ๊ฐํ ์์คํ ํ์ผ, ๋ค๋ฅธ ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ์ ๋ํ ์ ๊ทผ ์ฐจ๋จ
- macOS: App Sandbox, Linux: ์ปจํ ์ด๋ ๊ธฐ๋ฐ ๊ฒฉ๋ฆฌ
- ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ์ธ๋ถ ์ ๊ทผ ์ ์ฌ์ฉ์ ๋ช ์์ ์น์ธ ํ์
[S1QC5] Zero Data Retention โ ๋ฐ์ดํฐ ๋ณด์กด ์์ ์ ์ฑ
- Zero Data Retention: API ์์ฒญ ๋ฐ์ดํฐ๋ฅผ Anthropic ์๋ฒ์ ์ ์ฅํ์ง ์๋ ์ ์ฑ
- ์ํฐํ๋ผ์ด์ฆ/API ์ฌ์ฉ์ ๋์ โ ํ์ต ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋์ง ์์ ๋ณด์ฅ
- ๊ท์ ์ฐ์ (๊ธ์ต, ์๋ฃ, ์ ๋ถ) ํ๊ฒฝ์์์ ์ปดํ๋ผ์ด์ธ์ค ์ถฉ์กฑ
- ๋ฐ์ดํฐ ๋ณด์์ด ์ค์ํ ํ๋ก์ ํธ์์ ํ์ ํ์ธ ์ฌํญ
[S1QC6] Books 1๊ถ+2๊ถ โ ํ์ง๊ด๋ฆฌ ๊ธฐ์ด ํ์ต
- 1๊ถ 34ํธ: AI ํ์ฉ ์ ์ฃผ์์ฌํญ๊ณผ ํ๊ณ โ AI ์ค๋ฅ, ํ๊ฐ, ๋ณด์ ์ํ, ํ๊ณ ์ธ์
- 2๊ถ 05ํธ: Git๊ณผ GitHub โ ๋ฒ์ ๊ด๋ฆฌ ๊ธฐ๋ฐ ํ์ง ๊ด๋ฆฌ ๊ธฐ์ด
- 2๊ถ 22ํธ: SEO ์ต์ ํ โ ๊ฒ์์์ง ์ต์ ํ ๊ธฐ์ด ๊ฐ๋
- 2๊ถ 23ํธ: ์น ์ ๊ทผ์ฑ โ ์ ๊ทผ์ฑ ๊ธฐ์ด ๊ฐ๋ ๊ณผ WCAG ์๊ฐ
- 2๊ถ 24ํธ: ์ฑ๋ฅ ์ต์ ํ โ ์น ์ฑ๋ฅ ์ธก์ ๋ฐ ์ต์ ํ ๊ธฐ์ด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S1QC7] Books 3๊ถ โ Stage Gate/๊ฒ์ฆ ํ์ต
- 3๊ถ 06ํธ: Verification Instruction ์์ฑ๋ฒ โ ๊ฒ์ฆ ์ง์นจ ์์ฑ ๊ธฐ์ด
- 3๊ถ 07ํธ: ๊ฒ์ฆ ์์คํ ๊ณผ Stage Gate โ Stage Gate ๊ฒ์ฆ ์ฒด๊ณ ์ดํด
- 3๊ถ 11ํธ: AI ์์ 6๋ ๊ท์น โ AI ํ์ ์ ํ์ ๊ท์น ์ดํด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/3๊ถ_ํ๋ก์ ํธ_๊ด๋ฆฌ_๋ฐฉ๋ฒ/
[S1QC8] ์ค์ Tips โ ๋ณด์/๊ฒ์ฆ/SAL Grid/Git
AI_์ค์์ฌํญ/AI_12๋_์ค์์ฌํญ.mdโ 12๋ ์ค์ ๊ท์น ์ค์ ์ฒดํฌ๋ฆฌ์คํธ (Tips ๊ด์ , ํ์ฅ ์ ์ฉ ์ฌ๋ก)๊ฒ์ฆ_๋ฌธ์ํ/โ ์๋ธ์์ด์ ํธ ๊ฒ์ฆ ์์ฒญ ๋ฐฉ๋ฒ, ๋์์ธ ๋ฆฌ๋ทฐ ์ฒดํฌ๋ฆฌ์คํธ, ์์ ๋ฌธ์ํ ์ต๊ด, CLAUDE.md ์ด๊ธฐ ์์ฑ (4๊ฐ)๋ณด์/โ .gitignore ํ์ ํจํด, API ํค ์ ์ถ ๋ฐฉ์ง, OWASP Top 10 ๊ฐ์, RLS ๊ธฐ์ด ์ค์ , ํ๊ฒฝ๋ณ์ ๋ถ๋ฆฌ ์์น (5๊ฐ)Git_GitHub/โ Push/Pull ๊ธฐ๋ณธ ์ํฌํ๋ก์ฐ, Feature ๋ธ๋์น ์์ฑ ํจํด, ๋ฉํฐ PC ๋๊ธฐํ (3๊ฐ)SAL_Grid/โ Phase Gate ๊ฐ๋ ์ดํด, Task ID-ํ์ผ๋ช ๋งคํ, Task ๋ถํ ํ๋จ ๊ธฐ์ค, ๊ฒ์ฆ ํ ๋ฌธ์ํ ์ ์ฐจ (5๊ฐ)๊ฐ๋ฐ_๋ง๋ฌด๋ฆฌ_์ ๊ฒ/ํ๋ก๋์ _๋ฐฐํฌ_์ _์ฒดํฌ๋ฆฌ์คํธ.mdโ ๋ฐฐํฌ ์ ์ต์ข ์ ๊ฒ ํญ๋ชฉ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S1QC9] .claude ์ฐธ๊ณ โ Rules/Compliance
- rules: ํ์ง ๊ด๋ จ 3๊ฐ ๊ท์น ์ง์ค โ
05_execution-process(6๋จ๊ณ ํ๋ก์ธ์ค),06_verification(๊ฒ์ฆ ๊ธฐ์ค),07_task-crud(Task ์ํ ์ ์ด) - compliance:
AI_12_COMPLIANCE.mdโ 12๋ ์ค์์ฌํญ ๊ท์น ์ฒด๊ณ (.claude ์ค์ ๊ด์ , ์๋ ๊ฐ์ ๊ตฌ์กฐ)
๐ ๊ฒฝ๋ก:.claude/rules/,.claude/compliance/
S1CM โ ๋น์ฉ๊ด๋ฆฌ (Cost Management)
[S1CM1(์น์ 19)] ์๊ธ์ ์ ํ ๊ฐ์ด๋
Claude Code ์๊ธ์ ์ดํด
Claude Code๋ Anthropic์ ๊ตฌ๋ ํ๋์ ๊ธฐ๋ฐํ์ฌ ์ฌ์ฉ๋ฉ๋๋ค. ์๊ธ์ ์ ๋ฐ๋ผ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ, ์ผ์ผ ์ฌ์ฉ๋, ๊ธฐ๋ฅ์ด ๋ฌ๋ผ์ง๋๋ค.
์๊ธ์ ๋น๊ต
| ํญ๋ชฉ | Free | Pro ($20/์) | Max ($100/์) | Team ($30/์ธ/์) | Enterprise | |
|---|---|---|---|---|---|---|
| Claude Code ์ฌ์ฉ | โ | โ | โ | โ | โ | |
| ๊ธฐ๋ณธ ๋ชจ๋ธ | - | Sonnet | Opus + Sonnet | Sonnet | Opus + Sonnet | |
| ์ผ์ผ ์ฌ์ฉ๋ | - | ๋ณดํต | ๋์ (5๋ฐฐ) | ๋ณดํต | ๋ฌด์ ํ | |
| ์๋ธ์์ด์ ํธ | - | โ | โ | โ | โ | |
| MCP ์๋ฒ | - | โ | โ | โ | โ | |
| ํ ๊ณต์ ์ค์ | - | โ | โ | โ | โ | |
| SSO/๊ฐ์ฌ ๋ก๊ทธ | - | โ | โ | โ | โ |
์๊ธ์ ์ ํ ๊ธฐ์ค
๊ฐ์ธ ํ์ต/์ฌ์ด๋ ํ๋ก์ ํธ
โ Pro ํ๋ ($20/์)
โ ์ผ๋ฐ์ ์ธ ๊ฐ์ธ ๊ฐ๋ฐ์ ์ถฉ๋ถ
๋ณธ๊ฒฉ์ ์ธ ๊ฐ์ธ ํ๋ก์ ํธ
โ Max ํ๋ ($100/์)
โ Opus ๋ชจ๋ธ + ๋์ ์ฌ์ฉ๋ ํ๋
์๊ท๋ชจ ํ (2~10๋ช
)
โ Team ํ๋ ($30/์ธ/์)
โ ํ ์ค์ ๊ณต์ , ์ผ๊ด๋ ์ฝ๋ฉ ์ปจ๋ฒค์
๊ธฐ์
/๋๊ท๋ชจ ์กฐ์ง
โ Enterprise (์ปค์คํ
๊ฐ๊ฒฉ)
โ SSO, ๊ฐ์ฌ ๋ก๊ทธ, ์ ์ฉ ์ง์
๋น์ฉ ์ต์ ํ ํ
- ํ ํฐ ์ ์ฝ: CLAUDE.md์ ํ๋ก์ ํธ ์ปจํ ์คํธ๋ฅผ ์ ์ ๋ฆฌํ๋ฉด ๋งค๋ฒ ์ค๋ช ํ ํ์ ์์ด ํ ํฐ ์ ์ฝ
- ๋ชจ๋ธ ์ ํ: ๋จ์ ์์ ์ Sonnet(๋น ๋ฅด๊ณ ์ ๋ ด), ๋ณต์กํ ์ค๊ณ๋ Opus ์ฌ์ฉ
- ์ธ์
๊ด๋ฆฌ:
/compact๋ช ๋ น์ผ๋ก ์ปจํ ์คํธ ์์ถ, ๋ถํ์ํ ๋ํ ์ ๋ฆฌ - ์บ์ฑ ํ์ฉ: ํ๋กฌํํธ ์บ์ฑ์ผ๋ก ๋ฐ๋ณต ์์ฒญ ๋น์ฉ ์ ๊ฐ (API ์ฌ์ฉ ์)
- ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง:
/cost๋ช ๋ น์ผ๋ก ํ์ฌ ์ธ์ ๋น์ฉ ํ์ธ
๋ฌด๋ฃ๋ก ์์ํ๊ธฐ
Claude Code๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ค๋ฉด:
- claude.ai์์ ๊ณ์ ์์ฑ
- Pro ํ๋ ๊ตฌ๋ ($20/์)
- ํฐ๋ฏธ๋์์
npm install -g @anthropic-ai/claude-code์ค์น claude๋ช ๋ น์ผ๋ก ์์
ํ: Pro ํ๋์ผ๋ก ์์ํ์ฌ ์ฌ์ฉ ํจํด์ ํ์ ํ ํ, ํ์ ์ Max๋ Team์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
[S1CM2(์น์ 05a)] ์ปจํ ์คํธ ๊ธฐ์ด โ ํ ํฐ๊ณผ ๋น์ฉ
2. ์ปจํ ์คํธ ํฌ๊ธฐ ์กฐ์
ํ๋ก์ ํธ ๊ท๋ชจ์ ๋ฐ๋ผ Claude Code๊ฐ ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋ ์ปจํ ์คํธ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค.
# ํฐ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ ์ปจํ
์คํธ ํ๋
claude config set max_context_length 100000
# ์์ ํ๋ก์ ํธ๋ ๋น ๋ฅธ ์๋ต์ด ํ์ํ ๊ฒฝ์ฐ
claude config set max_context_length 50000
# ํ์ฌ ์ค์ ํ์ธ
claude config get max_context_length
์ค์ ๊ฐ์ด๋๋ผ์ธ
- ์๊ท๋ชจ ํ๋ก์ ํธ (< 50๊ฐ ํ์ผ): 50,000
- ์ค๊ฐ ๊ท๋ชจ ํ๋ก์ ํธ (50-200๊ฐ ํ์ผ): 100,000
- ๋๊ท๋ชจ ํ๋ก์ ํธ (200๊ฐ+ ํ์ผ): 200,000
์ฃผ์์ฌํญ: ์ปจํ ์คํธ๊ฐ ํด์๋ก ์๋ต ์๊ฐ์ด ๊ธธ์ด์ง๊ณ API ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
[S1CM3] CLAUDE.md โ ๋น์ฉ ๋ฐ ํจ์จ ์ง์นจ ์ ์
- CLAUDE.md์ ํ ํฐ ์ ์ฝ ๋ฐ ๋น์ฉ ๊ด๋ จ ์ง์นจ์ ๋ช ์
- ์: "๋์ฉ๋ ํ์ผ์ ์ ์ฒด๋ฅผ ์ฝ์ง ๋ง๊ณ ํ์ํ ๋ถ๋ถ๋ง offset/limit์ผ๋ก ์ฝ๊ธฐ"
- ๋ถํ์ํ ๋๊ตฌ ํธ์ถ ์ต์ํ, ์ปจํ ์คํธ ๊ด๋ฆฌ ์ ๋ต ๋ฑ ํฌํจ
- AI์ ํจ์จ์ ๋ฆฌ์์ค ์ฌ์ฉ์ ์ ๋ํ๋ ๊ฐ์ด๋๋ผ์ธ
[S1CM4] Prompt Caching โ ํ๋กฌํํธ ์บ์ฑ์ผ๋ก ๋น์ฉ ์ ๊ฐ
- Prompt Caching: ๋์ผํ ์์คํ ํ๋กฌํํธ๋ CLAUDE.md ๋ด์ฉ์ ์บ์ํ์ฌ ์ฌ์ฌ์ฉ
- ์บ์ ํํธ ์ ์ ๋ ฅ ํ ํฐ ๋น์ฉ ์ต๋ 90% ์ ๊ฐ ๊ฐ๋ฅ
- ๊ธด CLAUDE.md, ํฐ ์ฝ๋๋ฒ ์ด์ค ์ปจํ ์คํธ์ผ์๋ก ์บ์ฑ ํจ๊ณผ ๊ทน๋ํ
- ์๋์ผ๋ก ์ ์ฉ๋๋ฉฐ ๋ณ๋ ์ค์ ๋ถํ์
[S1CM5] Max Turns โ ์์ด์ ํธ ํด ์ ์ ํ
--max-turns์ต์ : ์์ด์ ํธ๊ฐ ์ํํ ์ต๋ API ์๋ณต ํ์ ์ง์ - ์:
claude --max-turns 10(์ต๋ 10ํด์ผ๋ก ์ ํ) - ์๋ธ์์ด์ ํธ(Task tool)์์๋
max_turnsํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋ณ ์ ํ ๊ฐ๋ฅ - ๋น์ฉ ๊ด๋ฆฌ์ ํต์ฌ ์๋จ โ ๋ฌดํ ๋ฃจํ๋ ๊ณผ๋ํ ํ์ ๋ฐฉ์ง
[S1CM6] Model Selection โ ๋ชจ๋ธ ์ ํ ์ ๋ต
- Opus: ๋ณต์กํ ์ํคํ ์ฒ ์ค๊ณ, ๋๊ท๋ชจ ๋ฆฌํฉํ ๋ง ๋ฑ ๊ณ ๋๋ ์์
- Sonnet: ์ผ๋ฐ ๊ฐ๋ฐ ์์ , ์ฝ๋ ์์ , ๋ฒ๊ทธ ์์ ๋ฑ ํ์ค ์์
- Haiku: ๊ฐ๋จํ ์ง๋ฌธ, ๋น ๋ฅธ ๊ฒ์, ๋จ์ ๋ณํ ๋ฑ ๊ฒฝ๋ ์์
--modelํ๋๊ทธ ๋๋ ์๋ธ์์ด์ ํธmodelํ๋ผ๋ฏธํฐ๋ก ์์ ๋ณ ๋ชจ๋ธ ์ง์ - ๋น์ฉ ์ฐจ์ด: Opus > Sonnet > Haiku (๋ณต์ก๋์ ๋ง์ถฐ ์ ํํ๋ฉด ๋น์ฉ ์ ๊ฐ)
[S1CM7] Fast Mode โ ๋น ๋ฅธ ์๋ต ๋ชจ๋
/fastํ ๊ธ๋ก ๋น ๋ฅธ ์๋ต ๋ชจ๋ ์ ํ (๋์ผ ๋ชจ๋ธ, ๋ ๋น ๋ฅธ ์ถ๋ ฅ)- ๊ฐ๋จํ ์์ ์์ ์๋ต ์๋ ํฅ์ โ ํ ํฐ ์ ์ฝ ํจ๊ณผ
- ๋ณต์กํ ์ถ๋ก ์ด ํ์ํ ์์ ์์๋ ์ผ๋ฐ ๋ชจ๋ ์ฌ์ฉ ๊ถ์ฅ
[S1CM8] Monitoring / Analytics โ ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง
- ํ ๋จ์ ์ฌ์ฉ๋ ์ถ์ : ๋ชจ๋ธ๋ณ, ์ฌ์ฉ์๋ณ, ํ๋ก์ ํธ๋ณ ํ ํฐ ์๋น ๋ถ์
- ์ค์๊ฐ ์ธ์ ๋น์ฉ ํ์: ํ์ฌ ์ธ์ ์์ ์ฌ์ฉํ ๋น์ฉ ์ค์๊ฐ ํ์ธ
- ์กฐ์ง ๊ด๋ฆฌ์๊ฐ ์ฌ์ฉ ํจํด ๋ถ์ํ์ฌ ๋น์ฉ ์ต์ ํ ์ ๋ต ์๋ฆฝ
- Anthropic Console ๋๋ API๋ก ์ฌ์ฉ๋ ๋ฐ์ดํฐ ์กฐํ ๊ฐ๋ฅ
[S1CM9] AI๋ณ ์น๊ฒ์ ๋น์ฉ๊ณผ ํจ์จ์ ํ์ฉ๋ฒ
์ฐธ๊ณ : ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /์ค์ _Tips/๋๊ตฌ_ํ์ฉ/AI๋ณ_์น๊ฒ์_๋น์ฉ๊ณผ_ํจ์จ์ _ํ์ฉ๋ฒ.md
- Claude Code์ WebSearch/WebFetch ๋๊ตฌ ์ฌ์ฉ ์ ์ถ๊ฐ ํ ํฐ ์๋น ๋ฐ์
- MCP ๊ธฐ๋ฐ ์น๊ฒ์(Perplexity ๋ฑ)๊ณผ ๋ด์ฅ ์น๊ฒ์์ ๋น์ฉ ๋น๊ต
- ๊ฒ์ ๋น๋ ์ต์ํ ์ ๋ต: ์บ์ ํ์ฉ, ๊ฒ์ ๊ฒฐ๊ณผ ์ฌ์ฌ์ฉ, ์ ํํ ์ฟผ๋ฆฌ ์์ฑ
[S1CM10] --max-budget-usd โ ์ต๋ ์์ฐ ์ ํ
claude -p --max-budget-usd 5.00 "์์ ": API ํธ์ถ ๋น์ฉ์ด ์ง์ ๊ธ์ก ์ด๊ณผ ์ ์๋ ์ค๋จ- Headless/์๋ํ ํ๊ฒฝ์์ ๋น์ฉ ํญ์ฃผ ๋ฐฉ์ง์ ํต์ฌ ์์ ์ฅ์น
- --max-turns์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ด์ค ์์ ๋ง ๊ตฌ์ฑ ๊ฐ๋ฅ
[S1CM11] Effort Level โ ๋ ธ๋ ฅ ์์ค ์กฐ์
CLAUDE_CODE_EFFORT_LEVELํ๊ฒฝ๋ณ์: low / medium / high- low: ๋น ๋ฅธ ์๋ต, ์ต์ ํ ํฐ ์๋น (๊ฐ๋จํ ์ง๋ฌธ/์์ )
- high: ๊น์ด ์๋ ๋ถ์, ๋ ๋ง์ ํ ํฐ ์๋น (๋ณต์กํ ์ํคํ ์ฒ/๋๋ฒ๊น )
- ์์ ๋ณต์ก๋์ ๋ง์ถฐ ์ค์ ํ๋ฉด ๋ถํ์ํ ํ ํฐ ์๋น ๋ฐฉ์ง
[S1CM12] Books 1๊ถ โ ๋น์ฉ๊ด๋ฆฌ ํ์ต
- 1๊ถ 14ํธ: ๊ตฌ๋ ํ๋๊ณผ ์๊ธ ์ฒด๊ณ โ Pro/Team/Enterprise ํ๋, API ๊ณผ๊ธ ๊ตฌ์กฐ, ํ ํฐ ๋น์ฉ
- 1๊ถ 24ํธ: Memory์ ์ปจํ ์คํธ ๊ด๋ฆฌ โ ํ ํฐ ์ ์ฝ ๊ด์ ์ ์ปจํ ์คํธ ์ต์ ํ ๊ธฐ์ด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S1CM13] ์ค์ Tips โ AI ๋น์ฉ ํ์ฉ๋ฒ
๋๊ตฌ_ํ์ฉ/AI๋ณ_์น๊ฒ์_๋น์ฉ๊ณผ_ํจ์จ์ _ํ์ฉ๋ฒ.mdโ ์น๊ฒ์ ๋น์ฉ ๋น๊ต ๋ฐ ์ ๊ฐ ์ ๋ต
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/๋๊ตฌ_ํ์ฉ/
S2 ์ค๊ธ (Intermediate)
S2CO โ ๊ฐ๋ (Concept)
[S2CO1(์น์ 16)] AI ์๋์ ๊ฐ๋ฐ ํจ๋ฌ๋ค์ ๋ณํ
AI ์๋์ ๊ฐ๋ฐ ํจ๋ฌ๋ค์ ๋ณํ
2025๋ , ์ฐ๋ฆฌ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ์ญ์ฌ์ ๊ฐ์ฅ ๊ทน์ ์ธ ๋ณํ์ ํ๊ฐ์ด๋ฐ ์ ์์ต๋๋ค.
30๋ ์ , ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ(IDE)์ ๋ฑ์ฅ์ด ๊ฐ๋ฐ์๋ค์ ์์ฐ์ฑ์ ํ๋ช ์ ์ผ๋ก ํฅ์์์ผฐ๋ฏ์ด, ์ค๋๋ AI ํ์ด ํ๋ก๊ทธ๋๋ฐ ๋๊ตฌ๋ค์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ ๊ทผ๋ณธ์ ์ผ๋ก ๋ฐ๊พธ๊ณ ์์ต๋๋ค.
๊ทธ์ค์์๋ Claude Code๋ ๋จ์ํ ์ฝ๋ ์๋์์ฑ์ ๋์ด, ์ง์ ํ ์๋ฏธ์ 'AI ๋๋ฃ'๋ก์ ๊ฐ๋ฐ์์ ํ์ ํ๋ ์๋ก์ด ํจ๋ฌ๋ค์์ ์ ์ํฉ๋๋ค. ๋ง์น ๊ฒฝํ ๋ง์ ์๋์ด ๊ฐ๋ฐ์์ ํจ๊ป ์ผํ๋ ๊ฒ์ฒ๋ผ, Claude Code๋ ์ฌ๋ฌ๋ถ์ ์๋๋ฅผ ์ดํดํ๊ณ , ์ต์ ์ ์๋ฃจ์ ์ ์ ์ํ๋ฉฐ, ๋ณต์กํ ์์ ์ ํจ๊ป ์ํํฉ๋๋ค.
์ด ์ฑ ์ ์ฝ์ด์ผ ํ ์ฌ๋
์ด ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ค์ ์ํด ์ฐ์์ต๋๋ค.
์ด๊ธ ๊ฐ๋ฐ์๋ผ๋ฉด
- AI ๋๊ตฌ๋ฅผ ํ์ฉํด ๋น ๋ฅด๊ฒ ์ฑ์ฅํ๊ณ ์ถ์ ๋ถ
- ๋ณต์กํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ ์ถ์ ๋ถ
- ์๋์ด ๊ฐ๋ฐ์์ ์ฌ๊ณ ๊ณผ์ ์ ํ์ตํ๊ณ ์ถ์ ๋ถ
์ค๊ธ ๊ฐ๋ฐ์๋ผ๋ฉด
- ๋ฐ๋ณต์ ์ธ ์์ ์์ ๋ฒ์ด๋ ์ฐฝ์์ ์ธ ๋ฌธ์ ํด๊ฒฐ์ ์ง์คํ๊ณ ์ถ์ ๋ถ
- ๊ฐ๋ฐ ์์ฐ์ฑ์ ํ๊ธฐ์ ์ผ๋ก ๋์ด๊ณ ์ถ์ ๋ถ
- ์๋ก์ด ๊ธฐ์ ์คํ์ ๋น ๋ฅด๊ฒ ์ต๋ํ๊ณ ์ถ์ ๋ถ
์๋์ด ๊ฐ๋ฐ์์ ํ ๋ฆฌ๋๋ผ๋ฉด
- ํ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ํ์ ํ๊ณ ์ถ์ ๋ถ
- ์ฃผ๋์ด ๊ฐ๋ฐ์๋ค์ ์จ๋ณด๋ฉ์ ํจ๊ณผ์ ์ผ๋ก ์ง์ํ๊ณ ์ถ์ ๋ถ
- ๋ณต์กํ ์ํคํ ์ฒ ๊ฒฐ์ ์ AI์ ํจ๊ป ๊ฒ์ฆํ๊ณ ์ถ์ ๋ถ
๊ธฐ์ ๋ฆฌ๋์ CTO๋ผ๋ฉด
- AI ์๋์ ๊ฐ๋ฐ ๋ฌธํ๋ฅผ ์กฐ์ง์ ์ ์ฐฉ์ํค๊ณ ์ถ์ ๋ถ
- ๊ฐ๋ฐํ์ ์์ฐ์ฑ๊ณผ ์ฝ๋ ํ์ง์ ๋์์ ํฅ์์ํค๊ณ ์ถ์ ๋ถ
- ๋ฏธ๋์ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค๋นํ๊ณ ์ถ์ ๋ถ
์ฑ ์ ๊ตฌ์ฑ๊ณผ ํ์ฉ๋ฒ
์ด ์ฑ ์ ์ด 13๊ฐ์ ์ฅ์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๊ธฐ์ด๋ถํฐ ๊ณ ๊ธ ํ์ฉ๊น์ง ๋จ๊ณ์ ์ผ๋ก ํ์ตํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
๊ธฐ์ด ํธ (1-3์ฅ)
- ์ 1์ฅ: Claude Code๋ ๋ฌด์์ธ๊ฐ? - AI ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ์๋ก์ด ํจ๋ฌ๋ค์
- ์ 2์ฅ: ์ค์น์ ๊ธฐ๋ณธ ์ค์ - 5๋ถ ๋ง์ ์์ํ๊ธฐ
- ์ 3์ฅ: ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ๋ง์คํฐ - ํ๋กฌํํธ ์์ง๋์ด๋ง์ ๊ธฐ์
ํ๋ก์ ํธ ์ต์ ํ (4-6์ฅ)
- ์ 4์ฅ: CLAUDE.md๋ก ํ๋ก์ ํธ ๋ง์ถค ์ค์ - AI๊ฐ ๋น์ ์ ํ๋ก์ ํธ๋ฅผ ์ดํดํ๊ฒ ๋ง๋ค๊ธฐ
- ์ 5์ฅ: ํ๋ ์์ํฌ๋ณ ๋ฒ ์คํธ ํ๋ํฐ์ค - React, Vue, Django, Spring ์๋ฒฝ ํ์ฉ
- ์ 6์ฅ: ์ธ์ด๋ณ ํ์ฉ ์ ๋ต - TypeScript, Python, Java, Go, Rust ๋ง์คํฐํ๊ธฐ
๊ณ ๊ธ ์ํฌํ๋ก์ฐ (7-9์ฅ)
- ์ 7์ฅ: ํจ์จ์ ์ธ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ - ์์ฐ์ฑ 10๋ฐฐ ๋์ด๊ธฐ
- ์ 8์ฅ: ๋ฉํฐํ์คํน๊ณผ ๋ณ๋ ฌ ์ฒ๋ฆฌ - ์ฌ๋ฌ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋ ๊ธฐ์
- ์ 9์ฅ: ์๋ํ์ CI/CD ํตํฉ - ๋ฐ๋ณต ์์ ์ ๋ก ๋ง๋ค๊ธฐ
์ค์ ํ๋ก์ ํธ (10์ฅ)
- ์ 10์ฅ: ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ - ์ฒ์๋ถํฐ ๋ฐฐํฌ๊น์ง ํจ๊ปํ๊ธฐ
ํ ํ์ ๊ณผ ์กฐ์ง ํ์ (11-13์ฅ)
- ์ 11์ฅ: GitHub Actions์ Claude Code Action - PR ์๋ํ์ ๋ง๋ฒ
- ์ 12์ฅ: ํ์์ Claude Code ํ์ฉํ๊ธฐ - ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ ๋ฌธํ
- ์ 13์ฅ: ์กฐ์ง๋ณ Claude Code ํ์ฉ ์ฌ๋ก ์ฐ๊ตฌ - Anthropic ํ๋ค์ ์ค์ ๊ฒฝํ
์ด ์ฑ ์ ์ต๋ํ ํ์ฉํ๋ ๋ฐฉ๋ฒ
- ์ค์ต ์ค์ฌ ํ์ต: ๊ฐ ์ฅ์ ์์ ๋ฅผ ์ง์ ๋ฐ๋ผํ๋ฉฐ ํ์ตํ์ธ์. Claude Code๋ ์ค์ ๋ก ์ฌ์ฉํด๋ด์ผ ๊ทธ ๊ฐ์น๋ฅผ ์ ์ ์์ต๋๋ค.
- ์ ์ง์ ์ ์ฉ: ํ์ฌ ์งํ ์ค์ธ ํ๋ก์ ํธ์ ํ๋์ฉ ์ ์ฉํด๋ณด์ธ์. ์์ ์ฑ๊ณต ๊ฒฝํ์ด ํฐ ๋ณํ๋ก ์ด์ด์ง๋๋ค.
- ์ปค์คํฐ๋ง์ด์ง: ์ฑ ์ ๋ด์ฉ์ ๊ทธ๋๋ก ๋ฐ๋ฅด๊ธฐ๋ณด๋ค๋, ์ฌ๋ฌ๋ถ์ ํ๊ฒฝ๊ณผ ํ์์ ๋ง๊ฒ ์กฐ์ ํ์ธ์.
- ๊ณต์ ์ ํ ๋ก : ํ์๋ค๊ณผ ๊ฒฝํ์ ๊ณต์ ํ๊ณ , ๋ ๋์ ๋ฐฉ๋ฒ์ ํจ๊ป ์ฐพ์๊ฐ์ธ์.
ํจ๊ป ๋ ๋๋ ์ฌ์
์ด ์ฑ ์ ๋จ์ํ ๋๊ตฌ ์ฌ์ฉ๋ฒ์ ๋์ด, AI์ ํจ๊ป ์ผํ๋ ์๋ก์ด ๊ฐ๋ฐ ๋ฌธํ๋ฅผ ๋ง๋ค์ด๊ฐ๋ ์ฌ์ ์ ๋๋ค.
Claude Code๋ ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ฅผ ๋์ ์์ฑํ๋ ๋๊ตฌ๊ฐ ์๋๋๋ค. ์คํ๋ ค ์ฌ๋ฌ๋ถ์ด ๋ ๋์ ๊ฐ๋ฐ์๊ฐ ๋๋๋ก ๋๋ ๋๋ฃ์ ๋๋ค. ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํจ๊ป ๊ณ ๋ฏผํ๊ณ , ๋ค์ํ ํด๊ฒฐ์ฑ ์ ์ ์ํ๋ฉฐ, ๋๋ก๋ ์ฌ๋ฌ๋ถ์ด ๋์น ๋ถ๋ถ์ ์ง์ด์ฃผ๋ ๋ฏฟ์์งํ ํํธ๋์ ๋๋ค.
์ด์ AI์ ํจ๊ปํ๋ ๊ฐ๋ฐ์ ์ธ๊ณ๋ก ์ฒซ๋ฐ์ ๋ด๋์ด ๋ด ์๋ค. ์ด ์ฑ ์ด ์ฌ๋ฌ๋ถ์ ๊ฐ๋ฐ ์ธ์์ ์๋ก์ด ์ฅ์ ์ฌ๋ ๊ณ๊ธฐ๊ฐ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
2025๋ 6์
ํฉ๋ฏผํธ
๊ฒฐ๋ก : AI์ ํจ๊ปํ๋ ๊ฐ๋ฐ์ ๋ฏธ๋
"๋ฏธ๋๋ ์ด๋ฏธ ์ ์๋ค. ๋ค๋ง ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋์ด ์์ง ์์ ๋ฟ์ด๋ค" - ์๋ฆฌ์ ๊น์จ
์ด ์ฑ ์ ํตํด ์ฐ๋ฆฌ๋ Claude Code๋ผ๋ ํ์ ์ ์ธ ๋๊ตฌ๋ฅผ ๊น์ด ํ๊ตฌํ์ต๋๋ค. ๋จ์ํ ์ฌ์ฉ๋ฒ์ ๋์ด, AI์ ํจ๊ป ์ผํ๋ ์๋ก์ด ๊ฐ๋ฐ ํจ๋ฌ๋ค์์ ๊ฒฝํํ์ต๋๋ค.
์ฌ์ ์ ๋์๋ณด๋ฉฐ
์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๊ฒ๋ค
๊ธฐ์ ์ ์ธก๋ฉด
- Claude Code์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ํ์ฉ๋ฒ
- ํ๋ ์์ํฌ๋ณ, ์ธ์ด๋ณ ์ต์ ํ ์ ๋ต
- ์๋ํ์ CI/CD ํตํฉ ๋ฐฉ๋ฒ
- ํ ํ์ ๊ณผ ๋ฌธํ ๋ณํ
์ฒ ํ์ ์ธก๋ฉด
- AI๋ ๋๊ตฌ๊ฐ ์๋ ๋๋ฃ
- ์ธ๊ฐ์ ์ฐฝ์์ฑ๊ณผ AI์ ํจ์จ์ฑ ๊ฒฐํฉ
- ์ง์์ ์ธ ํ์ต๊ณผ ์ ์์ ์ค์์ฑ
- ๊ฐ๋ฐ์ ์ญํ ์ ์งํ
๋ณํํ๋ ๊ฐ๋ฐ์์ ์ญํ
Before AI
๊ฐ๋ฐ์ = ์ฝ๋ ์์ฑ์
- ๋ฌธ๋ฒ๊ณผ API ์๊ธฐ
- ๋ฐ๋ณต์ ์ธ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์์ฑ
- ์คํ์ค๋ฒํ๋ก์ฐ ๊ฒ์
- ํผ์์ ๋ชจ๋ ๋ฌธ์ ํด๊ฒฐ
After AI
๊ฐ๋ฐ์ = ๋ฌธ์ ํด๊ฒฐ์ + ์ํคํ
ํธ + ๋ฉํ
- ๋น์ฆ๋์ค ๋ฌธ์ ์ดํด์ ํด๊ฒฐ
- ์์คํ
์ค๊ณ์ ์ํคํ
์ฒ
- AI์์ ํ์
์ ํตํ ํจ์จ์ ๊ตฌํ
- ํ๊ณผ AI๋ฅผ ์ด๋๋ ๋ฆฌ๋์ญ
ํต์ฌ ๊ตํ๋ค
1. AI๋ ์ฆ๊ฐ(Augmentation)์ด์ง ๋์ฒด(Replacement)๊ฐ ์๋๋ค.
Claude Code๋ ๊ฐ๋ฐ์๋ฅผ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ผ ๋ฅ๋ ฅ์ ์ฆ๊ฐ์ํต๋๋ค.
์ธ๊ฐ์ ์ฐฝ์์ฑ + AI์ ํจ์จ์ฑ = ๋ฌดํํ ๊ฐ๋ฅ์ฑ
- ์ธ๊ฐ: ๋ฌธ์ ์ ์, ์๊ตฌ์ฌํญ ์ดํด, ์ฐฝ์์ ํด๊ฒฐ์ฑ
- AI: ๋น ๋ฅธ ๊ตฌํ, ํจํด ์ธ์, ์ต์ ํ ์ ์
- ํ์ : ์๋ก์ ๊ฐ์ ์ ๊ฒฐํฉํ ์๋์ง
2. ์ง์์ ์ธ ํ์ต์ด ํต์ฌ์ด๋ค.
AI ๊ธฐ์ ์ ๋น ๋ฅด๊ฒ ๋ฐ์ ํฉ๋๋ค. ์ค์ํ ๊ฒ์
- ๊ธฐ์ด ์๋ฆฌ ์ดํด: ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ณธ๊ธฐ๋ ์ฌ์ ํ ์ค์
- ์๋ก์ด ๋๊ตฌ ํํ: ์ด๋ฆฐ ๋ง์์ผ๋ก ์๋ก์ด AI ๋๊ตฌ ์์ฉ
- ์คํ๊ณผ ์คํจ: ๋ค์ํ ์ ๊ทผ ๋ฐฉ์ ์๋
- ๊ณต์ ์ ํ ๋ก : ๊ฒฝํ์ ๋๋๋ฉฐ ํจ๊ป ์ฑ์ฅ
3. ํ์ง์ ์๋ํ์ ํต์ฌ์ด๋ค.
Claude Code๋ฅผ ํ์ฉํ ๋ ํ์ง ๊ด๋ฆฌ๋ ํ์์ ๋๋ค.
- ํ ์คํธ ์ฐ์ : AI๊ฐ ์์ฑํ ์ฝ๋๋ ๋ฐ๋์ ํ ์คํธ
- ์ฝ๋ ๋ฆฌ๋ทฐ: ์ธ๊ฐ์ ๊ฒ์ฆ์ ์ฌ์ ํ ์ค์
- ์ ์ง์ ๊ฐ์ : ์์ ๋จ์๋ก ๊ฐ์ ํ๋ฉฐ ์ํ ์ต์ํ
- ๋ฉํธ๋ฆญ ์ถ์ : ํ์ง ์งํ๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง
4. ํ ๋ฌธํ๊ฐ ์ฑ๊ณต์ ์ข์ฐํ๋ค.
๊ฐ์ธ์ ์์ฐ์ฑ์ ๋์ด ํ ์ ์ฒด์ ํ์ ์ด ๋ชฉํ์ ๋๋ค.
- ์ฌ๋ฆฌ์ ์์ : ์คํ๊ณผ ์คํจ๋ฅผ ํ์ฉํ๋ ๋ฌธํ
- ์ง์ ๊ณต์ : AI ํ์ฉ ๊ฒฝํ๊ณผ ๋ ธํ์ฐ ๊ณต์
- ์ง์์ ๊ฐ์ : ํ๋ก์ธ์ค์ ๋๊ตฌ๋ฅผ ๊ณ์ ๋ฐ์ ์ํด
- ์ธ๊ฐ ์ค์ฌ: ๊ธฐ์ ์ ์๋จ, ์ฌ๋์ด ๋ชฉ์
๋ฏธ๋๋ฅผ ์ค๋นํ๋ฉฐ
๋ค๊ฐ์ฌ ๋ณํ๋ค
๊ธฐ์ ์ ๋ฐ์
- ๋ ๊ฐ๋ ฅํ๊ณ ํนํ๋ AI ๋ชจ๋ธ
- ์ค์๊ฐ ํ์ ๊ณผ ์ปจํ ์คํธ ๊ณต์
- ์์ฑ๊ณผ ์ ์ค์ฒ ๊ธฐ๋ฐ ์ธํฐํ์ด์ค
- AR/VR์ ํ์ฉํ ๋ชฐ์ ํ ๊ฐ๋ฐ ํ๊ฒฝ
๊ฐ๋ฐ ๋ฌธํ ๋ณํ
- AI ํ์ด ํ๋ก๊ทธ๋๋ฐ์ด ํ์ค์ด ๋๋ ์๋
- ์ธ๊ฐ-AI-์ธ๊ฐ ํ์ ํจํด์ ํ์ฐ
- ์ฐฝ์์ ๋ฌธ์ ํด๊ฒฐ์ ์ง์คํ๋ ๊ฐ๋ฐ์
- ๋๋ฉ์ธ ์ ๋ฌธ์ฑ์ด ๋์ฑ ์ค์ํด์ง๋ ํ๊ฒฝ
๊ฐ๋ฐ์๊ฐ ์ค๋นํด์ผ ํ ๊ฒ๋ค
1. ๊ธฐ๋ณธ๊ธฐ ๊ฐํ
# ๋ณํ์ง ์๋ ๊ฒ๋ค
- ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฃ๊ตฌ์กฐ
- ์์คํ
์ค๊ณ ์์น
- ๋ฌธ์ ํด๊ฒฐ ์ฌ๊ณ ๋ ฅ
- ์ปค๋ฎค๋์ผ์ด์
๋ฅ๋ ฅ
2. ์๋ก์ด ์ญ๋ ๊ฐ๋ฐ
# ์๋กญ๊ฒ ํ์ํ ๊ฒ๋ค
- AI์์ ํจ๊ณผ์ ์ธ ์ํต ๋ฅ๋ ฅ
- ํ๋กฌํํธ ์์ง๋์ด๋ง ์คํฌ
- ๋๋ฉ์ธ ์ ๋ฌธ ์ง์
- ์ฐฝ์์ ์ฌ๊ณ ์ ํ์ ๋ฅ๋ ฅ
3. ์ง์์ ์ธ ์คํ
# ์คํํด์ผ ํ ๊ฒ๋ค
- ์๋ก์ด AI ๋๊ตฌ์ ํ๋ซํผ
- ํ์ ์ ์ธ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ
- ํ ํ์
๋ฐฉ์์ ๋ณํ
- ์๋ํ ๊ฐ๋ฅํ ์์
์์ญ
์ค์ฒ ๊ฐ์ด๋
์ค๋๋ถํฐ ์์ํ ์ ์๋ ๊ฒ๋ค
๊ฐ์ธ ์์ค
- Claude Code ์ค์นํ๊ณ ์ฒซ ํ๋ก์ ํธ ์์
- ์ผ์ผ ์ ๋ฌด์์ ๋ฐ๋ณต ์์ ํ๋์ฉ ์๋ํ
- ๋งค์ฃผ ์๋ก์ด AI ๋๊ตฌ๋ ๊ธฐ๋ฅ ์คํ
- ํ์ตํ ๋ด์ฉ์ ๋ธ๋ก๊ทธ๋ ๋ ธํธ์ ๊ธฐ๋ก
ํ ์์ค
- ํ CLAUDE.md ์์ฑํ๊ณ ๊ณต์
- ์ฝ๋ ๋ฆฌ๋ทฐ์ Claude ํ์ฉ ์๋ฒ ๋์
- ์ฃผ๊ฐ AI ํ์ฉ ์ฌ๋ก ๊ณต์ ์ธ์ ์์
- ํ์ผ๋ฟ ํ๋ก์ ํธ์์ ์ง์ค์ ์ผ๋ก ํ์ฉ
์กฐ์ง ์์ค
- AI ๋๊ตฌ ๋์ ๊ฐ์ด๋๋ผ์ธ ์๋ฆฝ
- ๊ต์ก ํ๋ก๊ทธ๋จ๊ณผ ์ํฌ์ต ๊ณํ
- ์ฑ๊ณต ์ฌ๋ก ์์ง๊ณผ ํ์ฐ ์ ๋ต
- ์ค๋ฆฌ์ AI ์ฌ์ฉ ์ ์ฑ ๋ง๋ จ
์ฅ๊ธฐ์ ์ธ ๋ก๋๋งต
3๊ฐ์ ํ
- Claude Code ๊ธฐ๋ณธ ํ์ฉ๋ฒ ์์ ์๋ฌ
- ๊ฐ์ธ ์ํฌํ๋ก์ฐ์ AI ๋๊ตฌ ์์ ํตํฉ
- ํ ๋ด AI ํ์ฉ ๋ฌธํ ์ ์ฐฉ
6๊ฐ์ ํ
- ํ๋ก์ ํธ๋ณ ํนํ๋ AI ํ์ฉ ํจํด ๊ฐ๋ฐ
- ์๋ํ๋ ํ์ง ๊ด๋ฆฌ ์์คํ ๊ตฌ์ถ
- ๋ค๋ฅธ ํ๊ณผ์ AI ํ์ฉ ๊ฒฝํ ๊ณต์
1๋ ํ
- AI์ ํจ๊ปํ๋ ๊ฐ๋ฐ์ด ์์ฐ์ค๋ฌ์ด ์ผ์
- ์กฐ์ง ์ฐจ์์ AI ํ์ฉ ์ฑ์๋ ํฅ์
- ์๋ก์ด AI ๋๊ตฌ์ ๋น ๋ฅธ ์ ์๊ณผ ํ์ฉ
๋ง์ง๋ง ๋ฉ์์ง
๋ ์ ์ฌ๋ฌ๋ถ๊ป
์ด ์ฑ ์ ๋๊น์ง ์ฝ์ด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ฌ๋ฌ๋ถ์ ์ด์ AI ์๋์ ๊ฐ๋ฐ์๋ก์ ํ์ํ ์ง์๊ณผ ๋๊ตฌ๋ฅผ ๊ฐ์ถ์ จ์ต๋๋ค.
์ค์ํ ๊ฒ์ ์ด ์ง์์ ์ค์ ๋ก ์ ์ฉํ๋ ๊ฒ์ ๋๋ค. ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํด์, ์คํจ๋ฅผ ๋๋ ค์ํ์ง ๋ง๊ณ , ์ง์์ ์ผ๋ก ์คํํ๊ณ ํ์ตํ์ธ์.
๋ฏธ๋์ ๊ฐ๋ฐ์๋ค์๊ฒ
AI์ ํจ๊ป ์ผํ๋ ๊ฒ์ ์ ํ์ด ์๋ ํ์๊ฐ ๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง ๋๋ ค์ํ ํ์๋ ์์ต๋๋ค. AI๋ ์ฌ๋ฌ๋ถ์ ๋ฅ๋ ฅ์ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ผ ํ์ฅํ๋ ๋๊ตฌ์ ๋๋ค.
์ค์ํ ๊ฒ์
- ํธ๊ธฐ์ฌ์ ์์ง ๋ง์ธ์: ์๋ก์ด ๊ธฐ์ ๊ณผ ๋๊ตฌ์ ์ด๋ฆฐ ๋ง์์ผ๋ก ์ ๊ทผํ์ธ์
- ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ํํ ํ์ง ๋ง์ธ์: AI ๋๊ตฌ๋ ๊ฐ๋ ฅํ์ง๋ง ๊ธฐ์ด๊ฐ ์์ผ๋ฉด ์ ๋๋ก ํ์ฉํ ์ ์์ต๋๋ค.
- ํจ๊ป ์ฑ์ฅํ์ธ์: ํผ์์๋ ํ๊ณ๊ฐ ์์ต๋๋ค. ๋๋ฃ๋ค๊ณผ ๊ฒฝํ์ ๋๋๋ฉฐ ํจ๊ป ๋ฐ์ ํ์ธ์
- ์ธ๊ฐ๋ค์์ ์์ง ๋ง์ธ์: ๊ธฐ์ ์ ์๋จ์ผ ๋ฟ, ๊ฒฐ๊ตญ ์ค์ํ ๊ฒ์ ์ฌ๋์ ๋๋ค.
์ฐ๋ฆฌ ๋ชจ๋์ ๋ฏธ๋
AI์ ํจ๊ปํ๋ ๊ฐ๋ฐ์ ๋ฏธ๋๋ ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋ง๋ค์ด๊ฐ๋ ๊ฒ์ ๋๋ค. ์ด ์ฑ ์ด ๊ทธ ์ฌ์ ์ ์ถ๋ฐ์ ์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ง๊ธ ์ด ์๊ฐ์๋ ์ ์ธ๊ณ์ ๊ฐ๋ฐ์๋ค์ด AI์ ํจ๊ป ๋๋ผ์ด ๊ฒ๋ค์ ๋ง๋ค์ด๋ด๊ณ ์์ต๋๋ค. ์ฌ๋ฌ๋ถ๋ ๊ทธ ์ผ๋ถ๊ฐ ๋์ด, ๋ ๋์ ์ธ์์ ๋ง๋๋ ๋ฐ ๊ธฐ์ฌํ์๊ธฐ ๋ฐ๋๋๋ค.
ํ์ด์ ๋น๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์! ๐
"The future belongs to those who learn more skills and combine them in creative ways." - Robert Greene
์ด ์ฑ ์ ๋์ด์ง๋ง, ์ฌ๋ฌ๋ถ์ AI์ ํจ๊ปํ๋ ๊ฐ๋ฐ ์ฌ์ ์ ์ด์ ์์์ ๋๋ค.
[S2CO2] Books 1๊ถ+2๊ถ โ ์ค๊ธ ๊ฐ๋ ํ์ต
- 1๊ถ 07ํธ: Claude Code โ Claude Code ์ค์ ๊ฐ๋ ์ฌํ
- 1๊ถ 09ํธ: Claude ์ํ๊ณ ์ ์ฒด ๊ตฌ์กฐ โ ์ํ๊ณ ์ค์ ํ์ฉ ์ ๋ต
- 2๊ถ 15ํธ: Frontend ๊ฐ๋ฐ์์ญ โ ํ๋ก ํธ์๋ ๊ฐ๋ฐ ์ค๋ฌด ๊ฐ๋
- 2๊ถ 16ํธ: Backend ๊ฐ๋ฐ์์ญ โ ๋ฐฑ์๋ ๊ฐ๋ฐ ์ค๋ฌด ๊ฐ๋
- 2๊ถ 17ํธ: Database ๊ฐ๋ฐ์์ญ โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ์ค๋ฌด ๊ฐ๋
- 2๊ถ 18ํธ: Security ๊ฐ๋ฐ์์ญ โ ๋ณด์ ์ค๋ฌด ๊ฐ๋
- 2๊ถ 19ํธ: Testing ๊ฐ๋ฐ์์ญ โ ํ ์คํธ ์ค๋ฌด ๊ฐ๋
- 2๊ถ 20ํธ: DevOps ๊ฐ๋ฐ์์ญ โ ๋ฐฐํฌ/์ด์ ์ค๋ฌด ๊ฐ๋
- 2๊ถ 21ํธ: External Service ๊ฐ๋ฐ์์ญ โ ์ธ๋ถ ์๋น์ค ์ฐ๋ ์ค๋ฌด ๊ฐ๋
- 2๊ถ ๋ถ๋ก: ์ฉ์ด์ฌ์ โ ํ์คํ ๊ฐ๋ฐ ์ ๋ฌธ ์ฉ์ด ์ฐธ์กฐ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S2CO3] ์ค์ Tips โ ์น๊ฐ๋ฐ ๊ธฐ์ด๊ฐ๋ ์ค๊ธ
์น๊ฐ๋ฐ_๊ธฐ์ด๊ฐ๋ /โ ํ์คํ ๊ฐ๋ ์ค์ ์ ์ฉ (3๊ฐ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/์น๊ฐ๋ฐ_๊ธฐ์ด๊ฐ๋
/
S2ST โ ์คํธ๋ญ์ฒ (Structure)
[S2ST1(์น์ 20)] ์ค์ ํ๋ก์ ํธ ๋ ์ํผ 12์ข
์ 5์ฅ: ํ๋ ์์ํฌ๋ณ ๋ฒ ์คํธ ํ๋ํฐ์ค
"์ฌ๋ฐ๋ฅธ ๋๊ตฌ๋ฅผ ์ฌ๋ฐ๋ฅธ ์์ ์ ์ฌ์ฉํ๋ผ" - ํ๋ก๊ทธ๋๋ฐ ๊ฒฉ์ธ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
mindmap
root((ํ์ต ๋ชฉํ))
์ ๋ต ์๋ฆฝ
ํ๋ ์์ํฌ๋ณ ํน์ฑ ์ดํด
์ต์ ํ๋ ํ์ฉ ์ ๋ต
๊ฐ๋ฐ ํจํด ์ ๋ฆฝ
์ฃผ์ ํ๋ ์์ํฌ
React/Next.js ๋ง์คํฐ
Node.js/Express ํ์ฉ
Django ๊ฐ๋ฐ ํจํด
์ฝ๋ ํ์ง ๊ด๋ฆฌ
CLAUDE.md ์ค์
์ผ๊ด๋ ํ์ง ์ ์ง
ํ ํ์
๊ท์น
๋ง์ด๊ทธ๋ ์ด์
ํ๋ ์์ํฌ ์ ํ ์ง์
ํจ๊ณผ์ ํ์ฉ ๋ฐฉ๋ฒ
์ค์ ์ ์ฉ ๋ฅ๋ ฅ
๊ฐ์
ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ํ๋ ์์ํฌ๋ ๊ฐ๋ฐ ํจ์จ์ฑ๊ณผ ์ฝ๋ ํ์ง์ ๊ฒฐ์ ํ๋ ํต์ฌ ์์์ ๋๋ค. ๊ฐ ํ๋ ์์ํฌ๋ ๊ณ ์ ํ ์ฒ ํ, ์ค๊ณ ํจํด, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ด, ๋์ผํ ๊ธฐ๋ฅ์ด๋ผ๋ ํ๋ ์์ํฌ์ ๋ฐ๋ผ ์ ํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ด ์๊ตฌ๋ฉ๋๋ค.
Claude Code๋ ์ด๋ฌํ ํ๋ ์์ํฌ๋ณ ํน์ฑ์ ๊น์ด ์ดํดํ๊ณ , ๊ฐ ํ๋ ์์ํฌ์ ๊ด์ฉ๊ตฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ์ฅ์์๋ ์ฃผ์ ํ๋ ์์ํฌ๋ณ๋ก Claude Code๋ฅผ ์ต์ ํํ๋ ์ ๋ต๊ณผ ์ค์ ํ์ฉ๋ฒ์ ์ฒด๊ณ์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
5.1 React/Next.js ํ๋ก์ ํธ
React์ Next.js๋ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํต์ฌ ๊ธฐ์ ๋ก, ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ์ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ์ ํตํด ๋ณต์กํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌ์ถํ ์ ์๊ฒ ํด์ค๋๋ค. Claude Code๋ React์ ํจ์ํ ์ปดํฌ๋ํธ ํจํด, Next.js์ App Router ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ ํ๋์ ์ธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ์ ํตํฉ์ ์๋ฒฝํ ์ง์ํฉ๋๋ค.
React ํ๋ก์ ํธ ์ด๊ธฐ ์ค์
React ํ๋ก์ ํธ๋ฅผ ์์ํ ๋๋ ํ๋ก์ ํธ์ ๊ท๋ชจ์ ์๊ตฌ์ฌํญ์ ๋ง๋ ๋๊ตฌ ์ ํ์ด ์ค์ํฉ๋๋ค. Claude Code๋ ์ ๊ณ ํ์ค ๋๊ตฌ๋ค์ ์กฐํฉํ์ฌ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
# Vite๋ฅผ ์ฌ์ฉํ React ํ๋ก์ ํธ ์์ฑ
claude "Vite๋ก ์๋ก์ด React TypeScript ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด์ค.
Tailwind CSS, React Router, React Query๋ฅผ ํฌํจํ๊ณ ,
ํด๋ ๊ตฌ์กฐ๋ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ฐ๋ผ ์ค์ ํด์ค"
Claude Code๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์์ฑํฉ๋๋ค.
src/
โโโ components/
โ โโโ common/ # Button, Input ๋ฑ ๊ณตํต ์ปดํฌ๋ํธ
โ โโโ features/ # ๊ธฐ๋ฅ๋ณ ์ปดํฌ๋ํธ
โ โโโ layouts/ # Header, Footer ๋ฑ
โโโ hooks/ # ์ปค์คํ
ํ
โโโ pages/ # ๋ผ์ฐํธ๋ณ ํ์ด์ง ์ปดํฌ๋ํธ
โโโ services/ # API ํต์
โโโ store/ # ์ ์ญ ์ํ ๊ด๋ฆฌ
โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โโโ types/ # TypeScript ํ์
์ ์
React ์ปดํฌ๋ํธ ๊ฐ๋ฐ ํจํด
React ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ํ ์คํธ ๊ฐ๋ฅํ ๋จ์๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. Claude Code๋ ์ปดํฌ๋ํธ์ ์ญํ ๊ณผ ์ฑ ์์ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ , ์ ์ ํ ์ถ์ํ ์์ค์ ์ ์งํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
1. ์ปดํฌ๋ํธ ์์ฑ ์์ฒญ - ์ค์ ์์
ํจ๊ณผ์ ์ธ ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ์ํด์๋ ๋ช ํํ ์๊ตฌ์ฌํญ ์ ์์ ํจ๊ป ํ ์คํธ์ ๋ฌธ์ํ๋ฅผ ํฌํจํ ์์ฑ๋ ๋์ ์์ฒญ์ด ํ์ํฉ๋๋ค. ๋ค์์ ์ค์ ํ๋ก์ ํธ์์ ์์ฃผ ์ฌ์ฉ๋๋ ํจํด๋ค์ ๋๋ค.
# ๊ธฐ๋ณธ ์ปดํฌ๋ํธ ์์ฑ
claude "UserProfile ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ค.
ํ๋กํ ์ด๋ฏธ์ง, ์ด๋ฆ, ์๊ฐ๋ฅผ ํ์ํ๊ณ ,
ํธ์ง ๋ชจ๋๋ฅผ ์ง์ํด์ผ ํด.
Storybook ์คํ ๋ฆฌ์ ํ
์คํธ ์ฝ๋๋ ํจ๊ป ์์ฑํด์ค"
# ๊ณ ๊ธ ๋ฐ์ดํฐ ํ
์ด๋ธ ์ปดํฌ๋ํธ
claude "DataTable ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ค.
- ์ ๋ ฌ, ํํฐ๋ง, ํ์ด์ง๋ค์ด์
์ง์
- ์ ํ ๊ฐ๋ฅํ ํ๊ณผ ๋๋ ์์
- ๊ฐ์ ์คํฌ๋กค๋ง์ผ๋ก ์ฑ๋ฅ ์ต์ ํ
- TypeScript ์ ๋ค๋ฆญ์ผ๋ก ํ์
์์ ์ฑ ๋ณด์ฅ
- ์ ๊ทผ์ฑ(a11y) ์ค์"
# ๋ณต์กํ ํผ ์ปดํฌ๋ํธ
claude "MultiStepForm ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ค.
- React Hook Form๊ณผ Zod ๊ฒ์ฆ ํตํฉ
- ๋จ๊ณ๋ณ ์งํ ํ์์ ๋ค๋น๊ฒ์ด์
- ์๋ ์ ์ฅ๊ณผ ์์ ์ ์ฅ ๊ธฐ๋ฅ
- ์ค๋ฅ ์ํ ์ฒ๋ฆฌ์ ์ฌ์ฉ์ ํผ๋๋ฐฑ
- ๊ฐ ๋จ๊ณ๋ณ ์กฐ๊ฑด๋ถ ํ๋ ํ์"
2. ์ํ ๊ด๋ฆฌ ํจํด
# ์ธ์ฆ ์ํ ๊ด๋ฆฌ
claude "์ฌ์ฉ์ ์ธ์ฆ ์ํ๋ฅผ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๋
Context์ ์ปค์คํ
ํ
์ ๋ง๋ค์ด์ค.
๋ก๊ทธ์ธ, ๋ก๊ทธ์์, ํ ํฐ ๊ฐฑ์ ๊ธฐ๋ฅ์ด ํ์ํด"
# ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ์ํ ๊ด๋ฆฌ
claude "์ ์์๊ฑฐ๋ ์ฅ๋ฐ๊ตฌ๋ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ตฌํํด์ค.
- Zustand๋ก ์ํ ์ ์ฅ์ ๊ตฌ์ฑ
- ์ํ ์ถ๊ฐ/์ ๊ฑฐ/์๋ ๋ณ๊ฒฝ ๋ก์ง
- ํ ์ธ ์ฟ ํฐ ์ ์ฉ๊ณผ ๊ฐ๊ฒฉ ๊ณ์ฐ
- ๋ก์ปฌ์คํ ๋ฆฌ์ง ๋๊ธฐํ
- ๋น๊ด์ /๋๊ด์ ์
๋ฐ์ดํธ ์ฒ๋ฆฌ"
# ์๋ฒ ์ํ์ ์บ์ฑ
claude "React Query๋ฅผ ํ์ฉํ ์๋ฒ ์ํ ๊ด๋ฆฌ๋ฅผ ์ค์ ํด์ค.
- API ์๋ต ์บ์ฑ ์ ๋ต
- ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ฆฌํ์นญ๊ณผ ์คํ
์ผ ํ์ ์ค์
- ๋ฌดํ ์คํฌ๋กค ๋ฐ์ดํฐ ํ์นญ
- ์๋ฌ ์ฌ์๋ ๋ก์ง๊ณผ ์คํ๋ผ์ธ ์ง์"
3. ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
# ๋ฆฌ๋ ๋๋ง ์ต์ ํ
claude "์ด ์ปดํฌ๋ํธ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋๋ก
React.memo, useMemo, useCallback์ ์ ์ฉํด์ค"
# ์ฝ๋ ์คํ๋ฆฌํ
๊ณผ ์ง์ฐ ๋ก๋ฉ
claude "์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์ฝ๋ ์คํ๋ฆฌํ
์ ์ ์ฉํด์ค.
- ๋ผ์ฐํธ ๋ ๋ฒจ ์ง์ฐ ๋ก๋ฉ
- ๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ์ ๋์ ์ํฌํธ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ๋ค ๋ถ๋ฆฌ
- ๋ก๋ฉ ์คํผ๋์ ์๋ฌ ๋ฐ์ด๋๋ฆฌ ์ถ๊ฐ"
# ๋์ฉ๋ ๋ฆฌ์คํธ ์ต์ ํ
claude "10,000๊ฐ ์์ดํ
์ ํจ์จ์ ์ผ๋ก ๋ ๋๋งํ๋
๊ฐ์ ์คํฌ๋กค ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํด์ค.
- react-window ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
- ๋์ ์์ดํ
๋์ด ์ง์
- ๋ฌดํ ์คํฌ๋กค๊ณผ ํ์ด์ง๋ค์ด์
ํตํฉ"
# ์ด๋ฏธ์ง ์ต์ ํ
claude "์ด๋ฏธ์ง ๊ฐค๋ฌ๋ฆฌ์ ์ฑ๋ฅ์ ์ต์ ํํด์ค.
- ์ง์ฐ ๋ก๋ฉ๊ณผ ํ๋ฆฌ๋ก๋ฉ ์ ๋ต
- WebP ํฌ๋งท ์ง์๊ณผ ํด๋ฐฑ
- ์ด๋ฏธ์ง ์์ถ๊ณผ ๋ฆฌ์ฌ์ด์ง
- Progressive loading ๊ตฌํ"
Next.js ํนํ ๊ธฐ๋ฅ - ์ค์ ํ์ฉ
1. App Router ๊ณ ๊ธ ํจํด
# ์ข
ํฉ์ ์ธ ๋ธ๋ก๊ทธ ์์คํ
claude "Next.js 14 App Router๋ก ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ค์ด์ค.
๋์ ๋ผ์ฐํ
, ๋ฉํ๋ฐ์ดํฐ ์ต์ ํ,
๊ทธ๋ฆฌ๊ณ ISR(Incremental Static Regeneration)์ ํ์ฉํด์ค"
# ๋ค๊ตญ์ด ์ง์๊ณผ ๊ตญ์ ํ
claude "Next.js์์ ๋ค๊ตญ์ด ์ง์์ ๊ตฌํํด์ค.
- i18n ๋ผ์ฐํ
์ค์
- ์๋ฒ ์ปดํฌ๋ํธ์์ ๋ฒ์ญ ์ฒ๋ฆฌ
- ๋์ ๋ฒ์ญ ๋ก๋ฉ๊ณผ ํด๋ฐฑ
- SEO ์ต์ ํ๋ฅผ ์ํ hreflang ํ๊ทธ"
# ๋ณต์กํ ์ธ์ฆ ์์คํ
claude "NextAuth.js๋ก ๋ค์ค ์ธ์ฆ ์ ๊ณต์๋ฅผ ์ง์ํ๋ ์์คํ
์ ๊ตฌํํด์ค.
- OAuth (Google, GitHub), ์ด๋ฉ์ผ, ์๊ฒฉ์ฆ๋ช
๋ก๊ทธ์ธ
- ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด (RBAC)
- ์ธ์
๊ด๋ฆฌ์ ๋ณด์ ๊ฐํ
- API ๋ผ์ฐํธ ๋ณดํธ ๋ฏธ๋ค์จ์ด"
2. Server Components ํจํด
claude "์ด ํ์ด์ง๋ฅผ Server Component๋ก ๋ฆฌํฉํ ๋งํด์ค.
๋ฐ์ดํฐ ํ์นญ์ ์๋ฒ์์, ์ธํฐ๋์
์ Client Component๋ก ๋ถ๋ฆฌํด์ค"
3. API Routes ์ค๊ณ
claude "RESTful API๋ฅผ Next.js API routes๋ก ๊ตฌํํด์ค.
๋ฏธ๋ค์จ์ด๋ก ์ธ์ฆ์ ์ฒ๋ฆฌํ๊ณ , Zod๋ก ์์ฒญ ๊ฒ์ฆ์ ์ถ๊ฐํด์ค"
React/Next.js CLAUDE.md ์์
# React/Next.js Project Guidelines
## ์ปดํฌ๋ํธ ๊ท์น
- ํจ์ํ ์ปดํฌ๋ํธ๋ง ์ฌ์ฉ
- Props๋ ์ธํฐํ์ด์ค๋ก ์ ์
- ์ปดํฌ๋ํธ๋น ํ๋์ ํ์ผ
## ์ํ ๊ด๋ฆฌ
- ๋ก์ปฌ ์ํ: useState
- ์๋ฒ ์ํ: React Query (TanStack Query)
- ์ ์ญ ์ํ: Zustand
## ํด๋ ๊ตฌ์กฐ
components/
โโโ Button/
โ โโโ Button.tsx
โ โโโ Button.test.tsx
โ โโโ Button.stories.tsx
โ โโโ index.ts
## ์ฑ๋ฅ ์ต์ ํ
- ์ด๋ฏธ์ง๋ next/image ์ฌ์ฉ
- ๋์ import๋ก ์ฝ๋ ์คํ๋ฆฌํ
- Lighthouse ์ ์ 90+ ์ ์ง
5.2 Node.js/Express ๋ฐฑ์๋
Node.js์ Express๋ JavaScript ์ํ๊ณ์์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฐฑ์๋ ๊ธฐ์ ์คํ์ ๋๋ค. ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ํคํ ์ฒ์ ์ฅ์ ์ ํ์ฉํ์ฌ ๋์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ฉฐ, Claude Code๋ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ถ์ ์ง์ํฉ๋๋ค.
Express ์๋ฒ ๊ตฌ์กฐํ - ์ํฐํ๋ผ์ด์ฆ ํจํด
ํ์ฅ ๊ฐ๋ฅํ Express ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด์๋ ๊ณ์ธตํ๋ ์ํคํ ์ฒ์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ํต์ฌ์ ๋๋ค. Claude Code๋ ์ ๊ณ ํ์ค ์ํคํ ์ฒ ํจํด์ ๋ฐ๋ฅด๋ ์๋ฒ ๊ตฌ์กฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
# ๊ธฐ๋ณธ REST API ์๋ฒ
claude "Express.js๋ก ํ์ฅ ๊ฐ๋ฅํ REST API ์๋ฒ๋ฅผ ๋ง๋ค์ด์ค.
๊ณ์ธตํ๋ ์ํคํ
์ฒ(Controller-Service-Repository)๋ฅผ ์ฌ์ฉํ๊ณ ,
TypeScript, JWT ์ธ์ฆ, ์๋ฌ ํธ๋ค๋ง, ๋ก๊น
์ ํฌํจํด์ค"
# ๋ง์ดํฌ๋ก์๋น์ค ํจํด
claude "Express๋ก ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ฅผ ๊ตฌํํด์ค.
- ์๋น์ค ๊ฐ ํต์ (HTTP/gRPC)
- API Gateway ํจํด
- ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ์ ๋ก๋ ๋ฐธ๋ฐ์ฑ
- ๋ถ์ฐ ๋ก๊น
๊ณผ ํธ๋ ์ด์ฑ
- Circuit Breaker ํจํด"
# ๊ณ ์ฑ๋ฅ API ์๋ฒ
claude "๋์ฉ๋ ํธ๋ํฝ์ ์ฒ๋ฆฌํ๋ Express API๋ฅผ ๋ง๋ค์ด์ค.
- ํด๋ฌ์คํฐ๋ง๊ณผ ์์ปค ํ๋ก์ธ์ค ๊ด๋ฆฌ
- Redis๋ฅผ ํ์ฉํ ์ธ์
๊ณผ ์บ์ฑ
- ์์ฒญ ์ ํ๊ณผ DDoS ๋ฐฉ์ด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
ํ๋ง
- APM ๋ชจ๋ํฐ๋ง ํตํฉ"
# GraphQL API ์๋ฒ
claude "Express์ GraphQL์ ํตํฉํ API ์๋ฒ๋ฅผ ๋ง๋ค์ด์ค.
- Apollo Server ์ค์
- ์คํค๋ง stitching๊ณผ federation
- DataLoader๋ฅผ ํ์ฉํ N+1 ์ฟผ๋ฆฌ ๋ฐฉ์ง
- ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ
- ์ฟผ๋ฆฌ ๋ณต์ก๋ ์ ํ"
์ํฐํ๋ผ์ด์ฆ๊ธ ํ๋ก์ ํธ ๊ตฌ์กฐ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph TD
A[src/] --> B[controllers/]
A --> C[services/]
A --> D[repositories/]
A --> E[models/]
A --> F[middleware/]
A --> G[routes/]
A --> H[config/]
A --> I[utils/]
A --> J[types/]
A --> K[tests/]
A --> L[docs/]
B -.-> |HTTP ์์ฒญ/์๋ต ์ฒ๋ฆฌ| B1[Request Handler]
C -.-> |๋น์ฆ๋์ค ๋ก์ง| C1[Business Logic]
D -.-> |๋ฐ์ดํฐ ์ก์ธ์ค ๊ณ์ธต| D1[Data Access]
E -.-> |๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ์คํค๋ง| E1[Schema Definition]
F -.-> |์ธ์ฆ, ๋ก๊น
, ๊ฒ์ฆ| F1[Middleware Functions]
G -.-> |API ๋ผ์ฐํธ ์ ์| G1[Route Definitions]
H -.-> |ํ๊ฒฝ ์ค์ | H1[Configuration]
I -.-> |๊ณตํต ์ ํธ๋ฆฌํฐ| I1[Utility Functions]
J -.-> |TypeScript ํ์
์ ์| J1[Type Definitions]
K -.-> |ํ
์คํธ ํ์ผ| K1[Test Suites]
L -.-> |API ๋ฌธ์| L1[Documentation]
๊ณ์ธต๋ณ ์ฑ ์ ๋ถ๋ฆฌ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph LR
A[Controllers] --> B[Services]
B --> C[Repositories]
C --> D[Models]
A1[์์ฒญ/์๋ต ์ฒ๋ฆฌ] -.-> A
B1[๋น์ฆ๋์ค ๋ก์ง] -.-> B
C1[๋ฐ์ดํฐ ์ ๊ทผ] -.-> C
D1[๋ฐ์ดํฐ ๋ชจ๋ธ] -.-> D
E[Middlewares] -.-> A
F[Utils] -.-> B
G[Config] -.-> B
H[Types] -.-> A
H -.-> B
H -.-> C
๋ฐฑ์๋ ๊ฐ๋ฐ ํจํด
1. RESTful API ์ค๊ณ
claude "์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ์ํ RESTful API๋ฅผ ์ค๊ณํด์ค.
CRUD ์์
, ํ์ด์ง๋ค์ด์
, ํํฐ๋ง, ์ ๋ ฌ์ ์ง์ํ๊ณ ,
OpenAPI(Swagger) ๋ฌธ์๋ ์๋ ์์ฑ๋๋๋ก ํด์ค"
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํตํฉ
claude "Prisma ORM์ ์ฌ์ฉํด์ User, Post, Comment ๋ชจ๋ธ์ ๋ง๋ค์ด์ค.
๊ด๊ณ ์ค์ , ๋ง์ด๊ทธ๋ ์ด์
, ์๋ ๋ฐ์ดํฐ๋ ํฌํจํด์ค"
3. ์ธ์ฆ/์ธ๊ฐ ๊ตฌํ
claude "JWT ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
์ ๊ตฌํํด์ค.
์ก์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉํ๊ณ ,
์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด(RBAC)๋ ์ถ๊ฐํด์ค"
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ
claude "์ด ๋ชจ๋๋ฆฌ์ ์ฑ์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถํดํด์ค.
User Service, Product Service, Order Service๋ก ๋๋๊ณ ,
API Gateway์ ์๋น์ค ๊ฐ ํต์ ๋ฐฉ๋ฒ๋ ์ค๊ณํด์ค"
Node.js/Express CLAUDE.md ์์
# Node.js/Express API Guidelines
## API ์ค๊ณ ์์น
- RESTful ์์น ์ค์
- ์ผ๊ด๋ ์๋ต ํ์
- ์ ์ ํ HTTP ์ํ ์ฝ๋ ์ฌ์ฉ
## ์๋ต ํ์
```json
{
"success": true,
"data": {},
"message": "Success",
"timestamp": "2024-01-01T00:00:00Z"
}
์๋ฌ ์ฒ๋ฆฌ
- ๋ชจ๋ ์๋ฌ๋ ์ค์ ์๋ฌ ํธ๋ค๋ฌ๋ก
- ์๋ฌ ๋ก๊น ํ์
- ํด๋ผ์ด์ธํธ์๊ฒ๋ ์ผ๋ฐํ๋ ๋ฉ์์ง
๋ณด์
- ๋ชจ๋ ์๋ํฌ์ธํธ rate limiting
- SQL Injection ๋ฐฉ์ง
- ์ ๋ ฅ ๊ฒ์ฆ ํ์
## 5.3 Python/Django ์ ํ๋ฆฌ์ผ์ด์
Django๋ "battery included" ์ฒ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ Python ์น ํ๋ ์์ํฌ๋ก, ๊ฐ๋ ฅํ ORM, ๊ด๋ฆฌ์ ์ธํฐํ์ด์ค, ๊ทธ๋ฆฌ๊ณ ๋ณด์ ๊ธฐ๋ฅ์ ๋ด์ฅํ๊ณ ์์ต๋๋ค. Django REST Framework์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๊ฒฌ๊ณ ํ API ์๋ฒ๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ์ ์์ผ๋ฉฐ, Claude Code๋ Django์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ์ง์ํฉ๋๋ค.
### Django ํ๋ก์ ํธ ์ค์
Django ํ๋ก์ ํธ์ ์ฑ๊ณต์ ์ด๊ธฐ ์ค์ ๊ณผ ์ํคํ
์ฒ ์ค๊ณ์์ ๊ฒฐ์ ๋ฉ๋๋ค. Claude Code๋ Django์ ์ฑ ๊ธฐ๋ฐ ๋ชจ๋ํ์ ์ค์ ๊ด๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
```bash
claude "Django REST Framework๋ก ๋ธ๋ก๊ทธ API๋ฅผ ๋ง๋ค์ด์ค.
์ฌ์ฉ์ ์ธ์ฆ, ํฌ์คํธ CRUD, ๋๊ธ, ํ๊ทธ ๊ธฐ๋ฅ์ ํฌํจํ๊ณ ,
ํ
์คํธ ์ฝ๋์ API ๋ฌธ์ํ๋ ์ค์ ํด์ค"
Django ๊ฐ๋ฐ ํจํด
1. ๋ชจ๋ธ ์ค๊ณ
claude "์ ์์๊ฑฐ๋๋ฅผ ์ํ Django ๋ชจ๋ธ์ ์ค๊ณํด์ค.
Product, Category, Order, User ๋ชจ๋ธ๊ณผ ๊ด๊ณ๋ฅผ ์ ์ํ๊ณ ,
Admin ์ธํฐํ์ด์ค๋ ์ปค์คํฐ๋ง์ด์งํด์ค"
2. ViewSet๊ณผ Serializer
claude "Product ๋ชจ๋ธ์ ๋ํ ViewSet๊ณผ Serializer๋ฅผ ๋ง๋ค์ด์ค.
ํํฐ๋ง, ๊ฒ์, ์ ๋ ฌ์ ์ง์ํ๊ณ ,
์ค์ฒฉ๋ ๊ด๊ณ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํด์ค"
3. ๋น๋๊ธฐ ํ์คํฌ
claude "Celery๋ฅผ ์ฌ์ฉํด์ ์ด๋ฉ์ผ ๋ฐ์ก๊ณผ
์ด๋ฏธ์ง ์ฒ๋ฆฌ๋ฅผ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋๋ก ์ค์ ํด์ค"
Python/Django CLAUDE.md ์์
# Django Project Guidelines
## ์ฑ ๊ตฌ์กฐ
- ๊ธฐ๋ฅ๋ณ๋ก ์ฑ ๋ถ๋ฆฌ
- ์ฑ๋น ์ต๋ 10๊ฐ ๋ชจ๋ธ
- ์ํ ์์กด์ฑ ๊ธ์ง
## ๋ชจ๋ธ ์ค๊ณ
- ๋ชจ๋ ๋ชจ๋ธ์ created_at, updated_at
- soft delete ์ฌ์ฉ (is_deleted ํ๋)
- ๊ด๊ณ๋ ๋ช
์์ ์ผ๋ก ์ ์
## API ์ค๊ณ
- ViewSet ์ฌ์ฉ ๊ถ์ฅ
- ์ปค์คํ
์ก์
์ @action ๋ฐ์ฝ๋ ์ดํฐ
- ํ์ด์ง๋ค์ด์
๊ธฐ๋ณธ 20๊ฐ
## ํ
์คํธ
- ๋ชจ๋ธ, ๋ทฐ, ์๋ฆฌ์ผ๋ผ์ด์ ๊ฐ๊ฐ ํ
์คํธ
- Factory Boy๋ก ํ
์คํธ ๋ฐ์ดํฐ ์์ฑ
- ์ปค๋ฒ๋ฆฌ์ง 80% ์ด์
[S2ST2] ํ๋ ์์ํฌ โ ๋ชจ๋ฐ์ผ, ๋ฐ์ดํฐ๊ณผํ, ๋ง์ด๊ทธ๋ ์ด์
5.4 ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ (React Native/Flutter)
๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ ์์ญ์์ ํฌ๋ก์ค ํ๋ซํผ ์๋ฃจ์ ์ ๊ฐ๋ฐ ํจ์จ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. React Native๋ JavaScript์ React ์ง์์ ํ์ฉํ ๋ค์ดํฐ๋ธ ์ฑ ๊ฐ๋ฐ์, Flutter๋ Dart ์ธ์ด๋ฅผ ํตํ ๊ณ ์ฑ๋ฅ UI ๊ตฌํ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. Claude Code๋ ๊ฐ ํ๋ซํผ์ ํน์ฑ์ ์ดํดํ๊ณ ํ๋ซํผ๋ณ ์ต์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
React Native ํ๋ก์ ํธ
React Native๋ React์ ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์ ์ ์ฉํ ํ๋ ์์ํฌ๋ก, ์น ๊ฐ๋ฐ ๊ฒฝํ์ ํ์ฉํ์ฌ ๋ค์ดํฐ๋ธ ๋ชจ๋ฐ์ผ ์ฑ์ ๊ฐ๋ฐํ ์ ์๊ฒ ํด์ค๋๋ค.
claude "Expo๋ก ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋ฐ์ผ ์ฑ์ ๋ง๋ค์ด์ค.
๋ค๋น๊ฒ์ด์
, ์ํ ๊ด๋ฆฌ, ๋ค์ดํฐ๋ธ ๊ธฐ๋ฅ ์ ๊ทผ์ ์ค์ ํ๊ณ ,
iOS์ Android ์คํ์ผ ์ฐจ์ด๋ ์ฒ๋ฆฌํด์ค"
React Native ๊ฐ๋ฐ ํจํด
1. ๋ค๋น๊ฒ์ด์ ๊ตฌ์กฐ
claude "React Navigation์ผ๋ก ๋ณต์กํ ๋ค๋น๊ฒ์ด์
์ ๊ตฌํํด์ค.
Tab Navigator, Stack Navigator, Drawer๋ฅผ ์กฐํฉํ๊ณ ,
๋ฅ๋งํน๋ ์ค์ ํด์ค"
2. ๋ค์ดํฐ๋ธ ๋ชจ๋ ํตํฉ
claude "์นด๋ฉ๋ผ์ ์์น ์ ๋ณด์ ์ ๊ทผํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด์ค.
๊ถํ ์์ฒญ ์ฒ๋ฆฌ์ ์๋ฌ ํธ๋ค๋ง๋ ํฌํจํด์ค"
Flutter ํ๋ก์ ํธ
claude "Flutter๋ก Material Design ์ฑ์ ๋ง๋ค์ด์ค.
๋ค๊ตญ์ด ์ง์, ๋คํฌ ๋ชจ๋, ๋ฐ์ํ ๋ ์ด์์์ ํฌํจํ๊ณ ,
Clean Architecture ํจํด์ ์ ์ฉํด์ค"
๋ชจ๋ฐ์ผ ์ฑ CLAUDE.md ์์
# Mobile App Guidelines
## ์ํคํ
์ฒ
- MVVM ํจํด ์ฌ์ฉ
- ๋น์ฆ๋์ค ๋ก์ง์ ViewModel์
- View๋ ์ํ๋ง ํ์
## ์ฑ๋ฅ
- ๋ฆฌ์คํธ๋ ๊ฐ์ํ ํ์
- ์ด๋ฏธ์ง ์ต์ ํ ๋ฐ ์บ์ฑ
- ์ ๋๋ฉ์ด์
60fps ์ ์ง
## ํ๋ซํผ๋ณ ์ฒ๋ฆฌ
```javascript
Platform.select({
ios: { /* iOS ์คํ์ผ */ },
android: { /* Android ์คํ์ผ */ }
})
ํ ์คํธ
- ์ปดํฌ๋ํธ ํ ์คํธ: Jest
- E2E ํ ์คํธ: Detox
- ํ๋ซํผ๋ณ ํ ์คํธ ํ์
## 5.5 ๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ - MLOps ํตํฉ
๋ฐ์ดํฐ ๊ณผํ๊ณผ ๋จธ์ ๋ฌ๋ ๋ถ์ผ๋ ํ์์ ๋ถ์์์ ํ๋ก๋์
๋ฐฐํฌ๊น์ง ๋ค์ํ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ ๋ณต์กํ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. Claude Code๋ ๋ฐ์ดํฐ ๊ณผํ์๋ค์ด ์ฌ์ฉํ๋ ์ฃผ์ ๋๊ตฌ๋ค๊ณผ ํ๋์ ์ธ MLOps ํ์ดํ๋ผ์ธ์ ์ดํดํ์ฌ, ์คํ๋ถํฐ ๋ฐฐํฌ๊น์ง ์ ์ฒด ํ๋ก์ธ์ค๋ฅผ ์ง์ํ ์ ์์ต๋๋ค.
### ํ๋์ ๋ฐ์ดํฐ ๊ณผํ ์คํ
๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ์ ์ฑ๊ณต์ ์ํด์๋ ๋จ์ํ ๋ถ์ ๋๊ตฌ๋ฅผ ๋์ด์ ์ฌํ ๊ฐ๋ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ MLOps ํ์ดํ๋ผ์ธ์ด ํ์ํฉ๋๋ค.
```mermaid
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph TB
subgraph "๋ฐ์ดํฐ ์์ง"
A1[Raw Data] --> A2[Data Pipeline]
A2 --> A3[Clean Data]
end
subgraph "์คํ ๋ฐ ๊ฐ๋ฐ"
B1[Jupyter Notebooks] --> B2[Feature Engineering]
B2 --> B3[Model Training]
B3 --> B4[Experiment Tracking]
end
subgraph "๋ชจ๋ธ ์ด์"
C1[Model Registry] --> C2[API Serving]
C2 --> C3[Monitoring]
C3 --> C4[Retraining]
C4 --> C1
end
A3 --> B1
B4 --> C1
C3 --> A2
Jupyter Notebook ํ๊ฒฝ
Jupyter Notebook์ ๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ์ ํต์ฌ ๋๊ตฌ๋ก, ์ฝ๋, ์๊ฐํ, ๋ฌธ์๋ฅผ ํ๋์ ํ๊ฒฝ์์ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค. Claude Code๋ ์ฌํ ๊ฐ๋ฅํ๊ณ ์ฒด๊ณ์ ์ธ ๋ถ์ ํ๊ฒฝ ๊ตฌ์ถ์ ์ง์ํฉ๋๋ค.
claude "๋จธ์ ๋ฌ๋ ํ๋ก์ ํธ๋ฅผ ์ํ Jupyter ํ๊ฒฝ์ ์ค์ ํด์ค.
๋ฐ์ดํฐ ๋ถ์, ์๊ฐํ, ๋ชจ๋ธ ํ์ต ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ณ ,
์คํ ์ถ์ ๋ ์ค์ ํด์ค"
๋ฐ์ดํฐ ๋ถ์ ์ํฌํ๋ก์ฐ - ์ฐ์ ํ์ค ์ ๊ทผ
1. ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ
# ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
claude "์ด CSV ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ์ ์ฒ๋ฆฌํด์ค.
๊ฒฐ์ธก์น ์ฒ๋ฆฌ, ์ด์์น ํ์ง, ํน์ฑ ์์ง๋์ด๋ง์ ์ํํ๊ณ ,
๊ฐ ๋จ๊ณ๋ฅผ ์๊ฐํํด์ค"
# ๊ณ ๊ธ ํน์ฑ ์์ง๋์ด๋ง
claude "์๊ณ์ด ๋ฐ์ดํฐ์ ํน์ฑ ์์ง๋์ด๋ง์ ๊ตฌํํด์ค.
- ์๊ฐ ๊ธฐ๋ฐ ํน์ฑ ์์ฑ (lag, rolling window)
- ๊ณ์ ์ฑ๊ณผ ํธ๋ ๋ ๋ถํด
- Fourier ๋ณํ์ ํตํ ์ฃผ๊ธฐ ํน์ฑ
- ์ค์ผ์ผ๋ง๊ณผ ์ ๊ทํ ํ์ดํ๋ผ์ธ
- ๋ฒ์ฃผํ ๋ณ์ ์ธ์ฝ๋ฉ ์ ๋ต"
# ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
claude "Dask๋ฅผ ํ์ฉํ ๋์ฉ๋ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๋ง๋ค์ด์ค.
- ์ฒญํฌ ๋จ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๋ก๋ฉ
- ๋ถ์ฐ ์ปดํจํ
ํ๊ฒฝ ์ค์
- ์งํ ์ํฉ ๋ชจ๋ํฐ๋ง"
2. ๋ชจ๋ธ ๊ฐ๋ฐ๊ณผ ์คํ ๊ด๋ฆฌ
# AutoML๊ณผ ๋ชจ๋ธ ๋น๊ต
claude "์ฌ๋ฌ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ๋น๊ต ํ๊ฐํด์ค.
๊ต์ฐจ ๊ฒ์ฆ, ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋์ ์ํํ๊ณ ,
๊ฒฐ๊ณผ๋ฅผ ํ๋ก ์ ๋ฆฌํด์ค"
# ๋ฅ๋ฌ๋ ๋ชจ๋ธ ๊ฐ๋ฐ
claude "PyTorch๋ก ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ชจ๋ธ์ ๊ตฌํํด์ค.
- ์ ์ดํ์ต (Transfer Learning) ํ์ฉ
- ๋ฐ์ดํฐ ์ฆ๊ฐ๊ณผ ์ ๊ทํ
- ํ์ต๋ฅ ์ค์ผ์ค๋ง๊ณผ ์กฐ๊ธฐ ์ข
๋ฃ
- ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ์ ์ฌ๊ฐ ๊ธฐ๋ฅ
- TensorBoard ์๊ฐํ"
# MLflow ์คํ ์ถ์
claude "MLflow๋ฅผ ํ์ฉํ ์คํ ์ถ์ ์์คํ
์ ๊ตฌ์ถํด์ค.
- ๋ชจ๋ธ ๋ฉํธ๋ฆญ๊ณผ ํ๋ผ๋ฏธํฐ ๋ก๊น
- ์ํฐํฉํธ ๋ฒ์ ๊ด๋ฆฌ
- ๋ชจ๋ธ ๋ ์ง์คํธ๋ฆฌ ์ค์
- A/B ํ
์คํธ ํ๋ ์์ํฌ
- ์คํ ๋น๊ต ๋์๋ณด๋"
3. ๋ชจ๋ธ ๋ฐฐํฌ์ ์ด์
# API ์๋น
claude "ํ์ต๋ ๋ชจ๋ธ์ FastAPI๋ก ์๋นํ๋ API๋ฅผ ๋ง๋ค์ด์ค.
์
๋ ฅ ๊ฒ์ฆ, ์์ธก, ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ ํฌํจํด์ค"
# ์ค์๊ฐ ์์ธก ์์คํ
claude "Kafka์ Redis๋ฅผ ํ์ฉํ ์ค์๊ฐ ML ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด์ค.
- ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- ์ค์๊ฐ ํน์ฑ ์ ์ฅ์
- ๋ฐฐ์น์ ์จ๋ผ์ธ ์์ธก ํตํฉ
- ๋ชจ๋ธ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
- ์๋ ์ฌํ์ต ํธ๋ฆฌ๊ฑฐ"
# ์ปจํ
์ด๋ ๋ฐฐํฌ
claude "Docker์ Kubernetes๋ก ML ๋ชจ๋ธ์ ๋ฐฐํฌํด์ค.
- ๋ฉํฐ ์คํ
์ด์ง Docker ๋น๋
- GPU ์ง์ ์ปจํ
์ด๋
- ์คํ ์ค์ผ์ผ๋ง ์ค์
- ํฌ์ค์ฒดํฌ์ ๋ก๊ทธ ์์ง
- CI/CD ํ์ดํ๋ผ์ธ ํตํฉ"
# ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง
claude "ํ๋ก๋์
ML ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง ์์คํ
์ ๊ตฌ์ถํด์ค.
- ๋ฐ์ดํฐ ๋๋ฆฌํํธ ํ์ง
- ๋ชจ๋ธ ์ฑ๋ฅ ์ ํ ์๋ฆผ
- ํธํฅ์ฑ ๋ชจ๋ํฐ๋ง
- ์ค๋ช
๊ฐ๋ฅํ AI ๋์๋ณด๋
- ์ฌ๊ณ ๋์ ํ๋ ์ด๋ถ"
๋ฐ์ดํฐ ๊ณผํ CLAUDE.md ์์
ํ๋์ ์ธ ๋ฐ์ดํฐ ๊ณผํ ํ๋ก์ ํธ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ผ์ธ
# Data Science Project Guidelines
## ํ๋ก์ ํธ ๊ตฌ์กฐ
project/
โโโ data/ # ์๋ณธ ๋ฐ์ดํฐ
โโโ notebooks/ # ์คํ ๋ ธํธ๋ถ
โโโ src/ # ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋
โโโ models/ # ํ์ต๋ ๋ชจ๋ธ
โโโ reports/ # ๋ถ์ ๊ฒฐ๊ณผ
## ์ฝ๋ฉ ๊ท์น
- ๋
ธํธ๋ถ์ ์คํ์ฉ, ํ๋ก๋์
์ฝ๋๋ .py๋ก
- ๋ชจ๋ ์คํ์ ์ถ์ ๊ฐ๋ฅํ๊ฒ
- ์ฌํ ๊ฐ๋ฅ์ฑ ๋ณด์ฅ (์๋ ๊ณ ์ )
## ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- ์๋ณธ ๋ฐ์ดํฐ๋ ์์ ํ์ง ์์
- ์ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ ๋ฌธ์ํ
- ๋ฐ์ดํฐ ๋ฒ์ ๊ด๋ฆฌ
## ๋ชจ๋ธ ๊ด๋ฆฌ
- MLflow๋ก ์คํ ์ถ์
- ๋ชจ๋ธ ๋ฒ์ ๊ด๋ฆฌ
- A/B ํ
์คํธ ์ง์
ํ๋ ์์ํฌ ๋ ๋ฆฝ์ ์ธ ๋ฒ ์คํธ ํ๋ํฐ์ค
ํ๋ ์์ํฌ๋ณ ํนํ๋ ์ ๊ทผ ๋ฐฉ์ ์ธ์๋, ๋ชจ๋ ํ๋ ์์ํฌ์ ๊ณตํต์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ํต์ฌ ์์น๋ค์ด ์์ต๋๋ค. ์ด๋ฌํ ์์น๋ค์ ์ดํดํ๊ณ ์ ์ฉํ๋ฉด ์ด๋ค ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ์ผ๊ด๋ ํ์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
1. ์ด๊ธฐ ํ์ ์ ๋ต
์๋ก์ด ํ๋ก์ ํธ๋ ๊ธฐ์กด ํ๋ก์ ํธ์ ์ฐธ์ฌํ ๋๋ ์ฒด๊ณ์ ์ธ ํ์๊ณผ ์ดํด๊ฐ ์ฑ๊ณต์ ํต์ฌ์ ๋๋ค. Claude Code๋ ํ๋ก์ ํธ์ ์ ์ฒด์ ์ธ ๊ตฌ์กฐ์ ๋งฅ๋ฝ์ ํ์ ํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
# ์ ํ๋ก์ ํธ ์์ ์
claude "์ด ํ๋ก์ ํธ์ ๊ตฌ์กฐ์ ์ฌ์ฉ๋ ๊ธฐ์ ์คํ์ ๋ถ์ํด์ค.
์ฃผ์ ํ์ผ๋ค์ ์ญํ ๊ณผ ๋ฐ์ดํฐ ํ๋ฆ์ ์ค๋ช
ํด์ค"
2. ์ ์ง์ ๊ฐ์
# ๊ธฐ์กด ์ฝ๋ ๊ฐ์
claude "์ด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ค.
๋จผ์ ํ
์คํธ๋ฅผ ์์ฑํด์ ๋์์ ๋ณด์ฅํ ํ,
๋จ๊ณ๋ณ๋ก ๊ฐ์ ํด์ค"
3. ๋ฌธ์ํ ์๋ํ
# ๋ฌธ์ ์์ฑ
claude "ํ๋ก์ ํธ์ README.md๋ฅผ ์
๋ฐ์ดํธํด์ค.
์ค์น ๋ฐฉ๋ฒ, ์ฌ์ฉ๋ฒ, API ๋ฌธ์, ๊ธฐ์ฌ ๊ฐ์ด๋๋ฅผ ํฌํจํด์ค"
4. ์ฑ๋ฅ ํ๋กํ์ผ๋ง
# ์ฑ๋ฅ ๋ถ์
claude "์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ํ๋กํ์ผ๋งํ๊ณ ,
๋ณ๋ชฉ ์ง์ ์ ์ฐพ์์ ์ต์ ํ ๋ฐฉ์์ ์ ์ํด์ค"
์ค์ ํ: ํ๋ ์์ํฌ ์ ํ๊ณผ ํ๋ํ
ํ๋ ์์ํฌ ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ธฐ์ ๋ถ์ฑ ํด๊ฒฐ๊ณผ ์ฑ๋ฅ ๊ฐ์ ์ ์ํ ์ค์ํ ํ๋ก์ ํธ์ ๋๋ค. Claude Code๋ ์ฒด๊ณ์ ์ด๊ณ ์ํ์ ์ต์ํํ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ ์๋ฆฝํ๊ณ ์คํํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
๋ ๊ฑฐ์ ์์คํ ํ๋ํ ์ ๋ต
๊ธฐ์กด ์์คํ ์ ํ๋์ ์ธ ์ํคํ ์ฒ๋ก ์ ํํ๋ ๊ฒ์ ๋จ์ํ ์ฝ๋ ๋ณํ์ ๋์ด์ ์ ์ฒด์ ์ธ ์์คํ ์ฌ์ค๊ณ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต ์๋ฆฝ - ์ค์ ์ฌ๋ก
๊ธฐ์กด ํ๋ก์ ํธ๋ฅผ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๋๋ ๋จ๊ณ์ ์ด๊ณ ์ ์ง์ ์ธ ์ ๊ทผ์ด ํ์ํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph TD
A[ํ์ฌ ์์คํ
๋ถ์] --> B[๋ง์ด๊ทธ๋ ์ด์
๊ณํ ์๋ฆฝ]
B --> C[ํ์ผ๋ฟ ํ๋ก์ ํธ]
C --> D{์ฑ๊ณต ์ฌ๋ถ}
D -->|์ฑ๊ณต| E[๋จ๊ณ๋ณ ๋ง์ด๊ทธ๋ ์ด์
]
D -->|์คํจ| F[๊ณํ ์์ ]
F --> C
E --> G[์ฑ๋ฅ ๊ฒ์ฆ]
G --> H{๋ชฉํ ๋ฌ์ฑ}
H -->|์๋์ค| I[์ต์ ํ]
I --> G
H -->|์| J[์ ์ฒด ์์คํ
์ ํ]
J --> K[๋ชจ๋ํฐ๋ง ๋ฐ ์ ์ง๋ณด์]
style A fill:#e2e8f0
style J fill:#dcfce7
style K fill:#dcfce7
# 1. ์์กด์ฑ ๋ฐ ์ํคํ
์ฒ ๋ถ์
claude "์ด Express ์ฑ์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๊ตฌ์กฐ๋ฅผ ๋ถ์ํด์ค.
- ์์กด์ฑ ํธ๋ฆฌ์ ์ํ ์ฐธ์กฐ ํ์ธ
- ๋น์ฆ๋์ค ํฌ๋ฆฌํฐ์ปฌ ๋ชจ๋ ์๋ณ
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ํ๊ฐ
- ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ํ์
"
# 2. ์์ธํ ๋ง์ด๊ทธ๋ ์ด์
๋ก๋๋งต
claude "์ด ์ฑ์ Fastify๋ก ๋ง์ด๊ทธ๋ ์ด์
ํ๋ ๊ณํ์ ์ธ์์ค.
- Strangler Fig ํจํด ์ ์ฉ
- ๋จ๊ณ๋ณ ๋กค๋ฐฑ ๊ณํ
- ์ฑ๋ฅ ๋ฒค์น๋งํฌ ์ค์
- ํ ๊ต์ก ์ผ์ ํฌํจ
- ๋ฆฌ์คํฌ ํ๊ฐ์ ์ํ ์ ๋ต"
# 3. ์ ์ง์ ๋ง์ด๊ทธ๋ ์ด์
์คํ
claude "์ธ์ฆ ๋ชจ๋๋ถํฐ Fastify๋ก ๋ง์ด๊ทธ๋ ์ด์
ํด์ค.
- ํธ๋ํฝ ์คํ๋ฆฌํ
๊ตฌํ
- ๋ชจ๋ํฐ๋ง๊ณผ ์๋ฆผ ์ค์
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ ๋ณด์ฅ
- ์๋ํ๋ ํ
์คํธ ์ค์ํธ
- ์ฑ๋ฅ ํ๊ท ๊ฐ์ง"
# 4. ๋ณต์กํ ํ๋ก ํธ์๋ ๋ง์ด๊ทธ๋ ์ด์
claude "React ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ํจ์ํ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
ํด์ค.
- ์๋ช
์ฃผ๊ธฐ๋ฅผ ํ
์ผ๋ก ๋ณํ
- ์ํ ๊ด๋ฆฌ ํ๋ํ
- ์ฝ๋ ๋ถํ ๊ณผ ์ง์ฐ ๋ก๋ฉ ์ ์ฉ
- TypeScript ํ์
์์ ์ฑ ๊ฐํ
- ์ฑ๋ฅ ์ต์ ํ ๊ธฐํ ์๋ณ"
# 5. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
claude "MySQL์์ PostgreSQL๋ก ๋ง์ด๊ทธ๋ ์ด์
๊ณํ์ ์ธ์์ค.
- ์คํค๋ง ๋ณํ๊ณผ ๋ฐ์ดํฐ ํ์
๋งคํ
- ๋ฌด์ค๋จ ๋ฐ์ดํฐ ์ด์ ์ ๋ต
- ์ฟผ๋ฆฌ ์ต์ ํ์ ์ฑ๋ฅ ํ๋
- ๋ฐฑ์
๊ณผ ๋ณต๊ตฌ ์ ์ฐจ
- ๊ฒ์ฆ๊ณผ ํ
์คํธ ๊ณํ"
ํ๋ ์์ํฌ๋ณ ์ฑ๊ณต ์งํ
๊ฐ ํ๋ ์์ํฌ ์ ํ ํ๋ก์ ํธ์ ์ฑ๊ณต์ ์ธก์ ํ๊ธฐ ์ํ ๊ตฌ์ฒด์ ์ธ KPI๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
# ์ฑ๋ฅ ์งํ ๋ชจ๋ํฐ๋ง
claude "๋ง์ด๊ทธ๋ ์ด์
์ ํ ์ฑ๋ฅ ๋น๊ต ๋์๋ณด๋๋ฅผ ๋ง๋ค์ด์ค.
- ์๋ต ์๊ฐ๊ณผ ์ฒ๋ฆฌ๋ ๋น๊ต
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ CPU ํจ์จ์ฑ
- ๋ฒ๋ค ํฌ๊ธฐ์ ๋ก๋ฉ ์๊ฐ
- ์ฌ์ฉ์ ๊ฒฝํ ๋ฉํธ๋ฆญ (LCP, FID, CLS)
- ๊ฐ๋ฐ์ ์์ฐ์ฑ ์งํ"
# ํ์ง ์งํ ์ถ์
claude "์ฝ๋ ํ์ง ๊ฐ์ ์ฌํญ์ ์ถ์ ํ๋ ์์คํ
์ ๊ตฌ์ถํด์ค.
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง ๋ณํ
- ์ฝ๋ ๋ณต์ก๋ ๊ฐ์
- ๋ณด์ ์ทจ์ฝ์ ํด๊ฒฐ
- ๊ธฐ์ ๋ถ์ฑ ๊ฐ์
- ํ ๋ง์กฑ๋ ์กฐ์ฌ"
๋ง์น๋ฉฐ
ํ๋ ์์ํฌ๋ณ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ์์งํ๋ ๊ฒ์ Claude Code๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ํต์ฌ์ ๋๋ค. ๊ฐ ํ๋ ์์ํฌ๋ ๊ณ ์ ํ ์ฒ ํ๊ณผ ์ค๊ณ ์์น์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ดํดํ๊ณ ์ ์ฉํ๋ ๊ฒ์ด ์ฑ๊ณต์ ์ธ ๊ฐ๋ฐ์ ๊ธฐ๋ฐ์ด ๋ฉ๋๋ค.
ํต์ฌ ์ฑ๊ณต ์์
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
mindmap
root((ํ๋ ์์ํฌ ์ฑ๊ณต ์์))
์ํ๊ณ ์ดํด
์ฒ ํ๊ณผ ์์น
ํต์ฌ ๊ฐ๋
์์ง
์ค๊ณ ์์น ์ค์
๊ด์ฉ๊ตฌ์ ํจํด
์ปค๋ฎค๋ํฐ ๋ชจ๋ฒ ์ฌ๋ก
๊ฒ์ฆ๋ ๊ด๋ก ์ ์ฉ
๋๊ตฌ ์ฒด์ธ
์ ์ฉ ๋๊ตฌ ํ์ฉ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ
์ค์ ์ ์ฉ
์ ์ง์ ๋์
๋จ๊ณ์ ์ ๊ทผ
๋ฆฌ์คํฌ ์ต์ํ
์ฑ๋ฅ ์ค์ฌ
์ต์ ํ ์ ๋ต
๋ฒค์น๋งํน
ํ ๊ต์ก
์ฒด๊ณ์ ํ์ต
์ง์ ๊ณต์
์ง์์ ๊ฐ์
๋ชจ๋ํฐ๋ง
์ ๋์ ์ธก์
์ฑ๊ณผ ์ถ์
ํผ๋๋ฐฑ ๋ฃจํ
ํ๋ก์ธ์ค ๊ฐ์
ํ ์๊ฒฌ ์๋ ด
์ต์ ๋ํฅ
์
๋ฐ์ดํธ ์ถ์
์ ๊ธฐ๋ฅ ํ์ต
์ค๋ฌด ์ฒดํฌ๋ฆฌ์คํธ
ํ๋ก์ ํธ ์์
- [ ] ํ๋ ์์ํฌ๋ณ CLAUDE.md ํ์ผ ์์ฑ
- [ ] ํ ์ฝ๋ฉ ์ปจ๋ฒค์ ๊ณผ ์คํ์ผ ๊ฐ์ด๋ ์๋ฆฝ
- [ ] ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ๋๊ตฌ ์ฒด์ธ ํ์คํ
- [ ] ์ฑ๋ฅ ๋ฒค์น๋งํฌ์ ํ์ง ๊ธฐ์ค ์ค์
๊ฐ๋ฐ ๊ณผ์
- [ ] ํ๋ ์์ํฌ ๋ชจ๋ฒ ์ฌ๋ก ์ค์ ์ฌ๋ถ ์ฝ๋ ๋ฆฌ๋ทฐ
- [ ] ์ ๊ธฐ์ ์ธ ์ฑ๋ฅ ํ๋กํ์ผ๋ง๊ณผ ์ต์ ํ
- [ ] ์๋ํ๋ ํ ์คํธ์ CI/CD ํ์ดํ๋ผ์ธ ์ด์
- [ ] ๊ธฐ์ ๋ถ์ฑ ๊ด๋ฆฌ์ ๋ฆฌํฉํ ๋ง ๊ณํ
๋ง์ด๊ทธ๋ ์ด์ ํ๋ก์ ํธ
- [ ] ์์ธํ ๋ง์ด๊ทธ๋ ์ด์ ๋ก๋๋งต๊ณผ ๋ฆฌ์คํฌ ํ๊ฐ
- [ ] ์ ์ง์ ์ ํ์ ์ํ ๋ธ๋ฆฌ์ง ์ ๋ต
- [ ] ์ฑ๋ฅ๊ณผ ์์ ์ฑ ํ๊ท ๋ฐฉ์ง ์ฒด๊ณ
- [ ] ํ ๊ต์ก๊ณผ ์ง์ ์ ์ ํ๋ก๊ทธ๋จ
Claude Code์ ์ง์ ํ ๊ฐ์น๋ ๋จ์ํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ, ๊ฐ ํ๋ ์์ํฌ์ ์ฒ ํ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ ์ ์ฒด๊ฐ ์ผ๊ด๋๊ฒ ์ ์ฉํ ์ ์๋๋ก ๋๋ ๋ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ ํ์ง์ ํ์คํ์ ํ ์์ฐ์ฑ์ ๊ทน๋ํ๋ฅผ ๋์์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๋ค์ ์ฅ์์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ณ๋ก Claude Code๋ฅผ ์ต์ ํํ๋ ์ ๋ต์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ธ์ด์ ๊ณ ์ ํ ํน์ฑ๊ณผ ์ํ๊ณ๋ฅผ ์ดํดํ์ฌ ๋์ฑ ํจ๊ณผ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํด๋ด ์๋ค.
- exploratory-data-analysis ์คํฌ: EDA ํ์์ ๋ฐ์ดํฐ ๋ถ์ ์๋ํ โ ๋ฐ์ดํฐ๊ณผํ ํ๋ ์์ํฌ์ ์ฐ๊ณ
[S2ST3] ์ธ์ด ์ ๋ต โ TypeScript/JavaScript, Python
์ 6์ฅ: ์ธ์ด๋ณ ํ์ฉ ์ ๋ต
"์ธ์ด๋ ์ฌ๊ณ ๋ฅผ ํ์ฑํ๋ค" - ๋ฒค์๋ฏผ ๋ฆฌ ์ํ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
mindmap
root((ํ์ต ๋ชฉํ))
์ ๋ต ์๋ฆฝ
์ธ์ด๋ณ ์ต์ ํ ์ ๋ต
๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ
๋๊ตฌ ์ฒด์ธ ์ ํ
ํ์
์์คํ
ํ์ฉ
ํ์
์์ ์ฑ ๋ณด์ฅ
์ ์ ๋ถ์ ๋๊ตฌ
๋ฐํ์ ๊ฒ์ฆ
๋ฉํฐ ์ธ์ด ํ๋ก์ ํธ
์ธ์ด ๊ฐ ์ํธ ์ด์ฉ์ฑ
API ์ธํฐํ์ด์ค ์ค๊ณ
ํ์
๊ณต์ ์ ๋ต
์ธ์ด ์ ํ ๊ฐ์ด๋
์๊ตฌ์ฌํญ ๋ถ์
์ฑ๋ฅ vs ์์ฐ์ฑ
ํ ์ญ๋ ๊ณ ๋ ค
ํ์ต ๋ชฉํ
์ด ์ฅ์ ์๋ฃํ๋ฉด ๋ค์์ ํ ์ ์์ต๋๋ค.
- ์ฃผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ณ Claude Code ์ต์ ํ ์ ๋ต์ ์๋ฆฝํ ์ ์์ต๋๋ค.
- ์ธ์ด๋ณ ํ์ ์์คํ ๊ณผ ์์ ์ฑ ๊ธฐ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.
- ์ธ์ด ๊ฐ ์ํธ ์ด์ฉ์ฑ์ ๊ณ ๋ คํ ๋ฉํฐ ์ธ์ด ํ๋ก์ ํธ๋ฅผ ์ค๊ณํ ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ต์ ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ ํํ ์ ์์ต๋๋ค.
๊ฐ์
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๋จ์ํ ๋๊ตฌ๋ฅผ ๋์ด์ ๊ฐ๋ฐ์์ ์ฌ๊ณ ๋ฐฉ์๊ณผ ๋ฌธ์ ํด๊ฒฐ ์ ๊ทผ๋ฒ์ ํ์ฑํ๋ ์ค์ํ ์์์ ๋๋ค. ๊ฐ ์ธ์ด๋ ๊ณ ์ ํ ์ฒ ํ, ๋ฌธ๋ฒ, ๊ทธ๋ฆฌ๊ณ ์ํ๊ณ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฌํ ํน์ฑ์ ๊น์ด ์ดํดํ๊ณ ํ์ฉํ๋ ๊ฒ์ด ์ฑ๊ณต์ ์ธ ๊ฐ๋ฐ์ ํต์ฌ์ ๋๋ค.
Claude Code๋ ๋ค์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํน์ฑ๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํ๊ณ ์์ด, ๊ฐ ์ธ์ด์ ์ฅ์ ์ ์ต๋ํ ํ์ฉํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด ์ฅ์์๋ ์ฃผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ณ๋ก Claude Code๋ฅผ ์ต์ ํํ๋ ์ ๋ต๊ณผ ์ค์ ํ์ฉ๋ฒ์ ์ฒด๊ณ์ ์ผ๋ก ์ดํด๋ณด๊ฒ ์ต๋๋ค.
6.1 TypeScript/JavaScript
TypeScript์ JavaScript๋ ํ๋ ์น ๊ฐ๋ฐ ์ํ๊ณ์ ์ค์ฌ์ด๋ฉฐ, ๋์ ํ์ดํ์ ์ ์ฐ์ฑ๊ณผ ์ ์ ํ์ดํ์ ์์ ์ฑ์ ๋ชจ๋ ์ ๊ณตํฉ๋๋ค. Claude Code๋ TypeScript์ ๊ฐ๋ ฅํ ํ์ ์์คํ ์ ํ์ฉํ์ฌ ์์ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ, JavaScript์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์๊ณผ ๋น๋๊ธฐ ์ฒ๋ฆฌ ํน์ฑ์ ์ต์ ํํ ์ ์์ต๋๋ค.
TypeScript ์ํฐํ๋ผ์ด์ฆ ํ๋ก์ ํธ ์ค์
๊ฒฌ๊ณ ํ TypeScript ํ๋ก์ ํธ๋ ์๊ฒฉํ ํ์ ์ฒดํฌ์ ํ๋์ ์ธ ๊ฐ๋ฐ ๋๊ตฌ์ ํตํฉ์์ ์์๋ฉ๋๋ค. Claude Code๋ ํ๋ก์ ํธ์ ๊ท๋ชจ์ ์๊ตฌ์ฌํญ์ ๋ง๋ ์ต์ ์ ์ค์ ์ ์ ์ํ ์ ์์ต๋๋ค.
# ๊ธฐ๋ณธ TypeScript ํ๋ก์ ํธ ์ค์
claude "์๊ฒฉํ ํ์
์ฒดํฌ๋ฅผ ์ฌ์ฉํ๋ TypeScript ํ๋ก์ ํธ๋ฅผ ์ค์ ํด์ค.
tsconfig.json์ ์ต์ ํํ๊ณ , ESLint์ Prettier๋ TypeScript์ ๋ง๊ฒ ๊ตฌ์ฑํด์ค"
# ๋๊ท๋ชจ ๋ชจ๋
ธ๋ ํฌ ์ค์
claude "๋๊ท๋ชจ TypeScript ๋ชจ๋
ธ๋ ํฌ๋ฅผ ์ค์ ํด์ค.
- Nx ์ํฌ์คํ์ด์ค ๊ตฌ์ฑ
- ํ๋ก์ ํธ ๊ฐ ์์กด์ฑ ๊ด๋ฆฌ
- ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๋ ์์คํ
- ์ปจ์์คํดํธ ์ฝ๋ ์คํ์ผ ์ ์ฉ
- ์ฌ์ดํด๋ฆญ ์์กด์ฑ ๊ฐ์ง"
# ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ
์ฒ
claude "TypeScript ๋ง์ดํฌ๋กํ๋ก ํธ์๋ ์ํคํ
์ฒ๋ฅผ ๊ตฌ์ฑํด์ค.
- Module Federation ์ค์
- ๋ฐํ์ ํ์
์์ ์ฑ ๋ณด์ฅ
- ์ฌ์ด๋์นด ๋ก๋ฉ๊ณผ ๋ฒ์ ๊ด๋ฆฌ
- ๊ณต์ ์ํ ๋ฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ
- ํ
์คํธ ์ ๋ต๊ณผ ๋ชฉ ์ค์ "
์ํฐํ๋ผ์ด์ฆ๊ธ tsconfig.json ์ค์
{
"compilerOptions": {
// ์ต์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค ์ง์
"target": "ES2022",
"module": "ESNext",
"lib": ["ES2022", "DOM", "DOM.Iterable"],
// ์ต๋ ํ์
์์ ์ฑ
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"exactOptionalPropertyTypes": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true,
// ์ถ๊ฐ ์๊ฒฉ์ฑ ์ต์
"allowUnusedLabels": false,
"allowUnreachableCode": false,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,
// ๋ชจ๋ ํ์
๋ฐ ๋ด๋ณด๋ด๊ธฐ
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"noEmit": true,
"isolatedModules": true,
// ์ฑ๋ฅ ์ต์ ํ
"incremental": true,
"tsBuildInfoFile": ".tsbuildinfo",
// ๊ฒฝ๋ก ๋งคํ
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"],
"@/components/*": ["./src/components/*"],
"@/utils/*": ["./src/utils/*"],
"@/types/*": ["./src/types/*"]
}
},
"include": [
"src/**/*",
"types/**/*",
"tests/**/*"
],
"exclude": [
"node_modules",
"dist",
"build",
"coverage"
]
}
๊ณ ๊ธ TypeScript ํ์ ํจํด
TypeScript์ ์ง์ ํ ์ฅ์ ์ ๋จ์ํ ํ์ ์ฒดํฌ๋ฅผ ๋์ด์ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ํ์ ๋ ๋ฒจ์์ ๊ฐ์ ํ ์ ์๋ค๋ ์ ์ ๋๋ค.
# Branded Types๋ก ๋น์ฆ๋์ค ๊ท์น ์ ์ฉ
claude "Branded Types๋ฅผ ์ฌ์ฉํด์ ๋น์ฆ๋์ค ๋ก์ง ์์ ์ฑ์ ๋ณด์ฅํด์ค.
- UserId, Email, PhoneNumber ๋ฑ ๋๋ฉ์ธ ํ์
์ ์
- ๋ฐํ์ ๊ฒ์ฆ ํจ์์ ์ฐ๋
- API ์๋ต ํ์
์์ ์ฑ ๋ณด์ฅ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง์ ๋๊ธฐํ"
# Conditional Types๋ก API ํ์
์๋ ์์ฑ
claude "Conditional Types๋ฅผ ํ์ฉํด์ OpenAPI ์คํค๋ง์์
TypeScript ํ์
์ ์๋ ์์ฑํ๋ ์์คํ
์ ๋ง๋ค์ด์ค.
- Path Parameter์ Query Parameter ํ์
์ถ๋ก
- Response ํ์
์๋ ๋งคํ
- HTTP Status Code๋ณ ํ์
๊ตฌ๋ถ
- ์๋ฌ ํ์
์ ๋์จ ์์ฑ"
# Template Literal Types๋ก DSL ๊ตฌํ
claude "Template Literal Types๋ฅผ ์ฌ์ฉํด์ ํ์
์์ ํ DSL์ ๋ง๋ค์ด์ค.
- CSS-in-JS ํ์
์ฒดํฌ
- SQL ์ฟผ๋ฆฌ ๋น๋ ํ์
์์ ์ฑ
- Event Name ์๋ ์์ฑ
- i18n ํค ์ ํจ์ฑ ๊ฒ์ฌ"
์ฑ๋ฅ ์ต์ ํ๋ TypeScript ํจํด
๋๊ท๋ชจ TypeScript ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ปดํ์ผ ์๊ฐ๊ณผ ๋ฐํ์ ์ฑ๋ฅ ๋ชจ๋๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
# ์ ์ง์ ํ์
๋ก๋ฉ
claude "๋๊ท๋ชจ ํ๋ก์ ํธ์ TypeScript ์ปดํ์ผ ์ฑ๋ฅ์ ์ต์ ํํด์ค.
- Project References๋ก ์ ์ง์ ๋น๋
- Type-only imports ํ์ฉ
- ์ฌ์ฉํ์ง ์๋ ํ์
์ ๊ฑฐ
- ๋์ import๋ก ํ์
๋ก๋ฉ ์ต์ ํ
- Watch mode ์ฑ๋ฅ ํ๋"
# ๋ฐํ์ ํ์
๊ฒ์ฆ ์ต์ ํ
claude "๋ฐํ์ ํ์
๊ฒ์ฆ์ ์ฑ๋ฅ์ ์ํฅ ์์ด ๊ตฌํํด์ค.
- Zod๋ก ๋ฐํ์ ์คํค๋ง ๊ฒ์ฆ
- Type Guards ์ต์ ํ
- ๋น๋๊ธฐ ๊ฒ์ฆ ๋ฐฐ์นญ
- ์บ์ ์ ๋ต๊ณผ ๋ฉ๋ชจ์ด์ ์ด์
- ์๋ฌ ๋ฐ์ด๋๋ฆฌ์ ๋ก๊น
"
### ํ์
์์ ์ฑ ๊ทน๋ํ
**1. ๊ณ ๊ธ ํ์
ํ์ฉ**
```bash
claude "์ด JavaScript ์ฝ๋๋ฅผ TypeScript๋ก ๋ง์ด๊ทธ๋ ์ด์
ํด์ค.
์ ๋์จ ํ์
, ์ ๋ค๋ฆญ, ์กฐ๊ฑด๋ถ ํ์
์ ํ์ฉํด์
ํ์
์์ ์ฑ์ ์ต๋ํ ํ๋ณดํด์ค"
2. ํ์ ์ถ๋ก ๊ฐ์
claude "์ด ํจ์์ ๋ฐํ ํ์
์ด ๋๋ฌด ๋๊ฒ ์ถ๋ก ๋๊ณ ์์ด.
ํ์
๊ฐ๋์ const assertion์ ์ฌ์ฉํด์ ๋ ์ ํํ ํ์
์ ์ถ๋ก ํ๋๋ก ํด์ค"
3. Zod๋ฅผ ํ์ฉํ ๋ฐํ์ ๊ฒ์ฆ
claude "API ์๋ต์ Zod ์คํค๋ง๋ก ๊ฒ์ฆํ๋ ์์คํ
์ ๋ง๋ค์ด์ค.
ํ์
์คํฌ๋ฆฝํธ ํ์
๋ ์๋์ผ๋ก ์์ฑ๋๋๋ก ํด์ค"
JavaScript ๋ชจ๋ ํจํด
1. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
claude "์ด ๋ช
๋ นํ ์ฝ๋๋ฅผ ํจ์ํ ์คํ์ผ๋ก ๋ฆฌํฉํ ๋งํด์ค.
๋ถ๋ณ์ฑ์ ์ ์งํ๊ณ , ์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉฐ,
ํจ์ ์กฐํฉ์ผ๋ก ๋ก์ง์ ๊ตฌ์ฑํด์ค"
2. ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ต์ ํ
claude "์ฌ๋ฌ API ํธ์ถ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ต์ ํํด์ค.
Promise.all, Promise.allSettled๋ฅผ ์ ์ ํ ์ฌ์ฉํ๊ณ ,
์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์๋ ๋ก์ง๋ ์ถ๊ฐํด์ค"
TypeScript/JavaScript CLAUDE.md ์์
# TypeScript/JavaScript Guidelines
## ํ์
์ ์ ๊ท์น
- ์ธํฐํ์ด์ค > ํ์
๋ณ์นญ (ํ์ฅ ๊ฐ๋ฅํ ๊ฒฝ์ฐ)
- any ์ฌ์ฉ ๊ธ์ง (unknown ์ฌ์ฉ)
- ๋ช
์์ ๋ฐํ ํ์
์ ํธ
## ๋น๋๊ธฐ ์ฒ๋ฆฌ
```typescript
// ์ข์ ์
const fetchData = async (): Promise<Result<Data, Error>> => {
try {
const data = await api.get('/data');
return { ok: true, value: data };
} catch (error) {
return { ok: false, error };
}
};
๋ถ๋ณ์ฑ
- Object.freeze() ํ์ฉ
- Spread ์ฐ์ฐ์๋ก ๋ณต์ฌ
- Immer ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๊ณ ๋ ค
์๋ฌ ์ฒ๋ฆฌ
- Error ํด๋์ค ์์ํ์ฌ ์ปค์คํ ์๋ฌ ์์ฑ
- ์๋ฌ ๋ฐ์ด๋๋ฆฌ ํ์ฉ
- ํ์ ์์ ํ ์๋ฌ ์ฒ๋ฆฌ
### TypeScript ์ค์ ๋๋ฒ๊น
๊ณผ ๋ชจ๋ํฐ๋ง
```bash
# ๊ณ ๊ธ ๋๋ฒ๊น
์ค์
claude "TypeScript ํ๋ก์ ํธ์ ๊ณ ๊ธ ๋๋ฒ๊น
ํ๊ฒฝ์ ์ค์ ํด์ค.
- Source Map ์ต์ ํ๋ก ๋๋ฒ๊น
์ฑ๋ฅ ํฅ์
- Chrome DevTools ์ฐ๋
- TypeScript ์ปดํ์ผ๋ฌ ์๋ฌ ์ถ์
- ๋ฐํ์ ์ฑ๋ฅ ํ๋กํ์ผ๋ง
- ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์ง ๋๊ตฌ"
# ํ๋ก๋์
๋ชจ๋ํฐ๋ง
claude "TypeScript ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋ก๋์
๋ชจ๋ํฐ๋ง์ ์ค์ ํด์ค.
- ๋ฐํ์ ํ์
์๋ฌ ์์ง
- ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์ถ์
- ๋ฒ๋ค ํฌ๊ธฐ ๋ชจ๋ํฐ๋ง
- TypeScript ์ปดํ์ผ ์๊ฐ ์ถ์
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฆฌํฌํธ"
6.2 Python - ์ํฐํ๋ผ์ด์ฆ ํ์ด์ฌ
Python์ "์ฝ๊ธฐ ์ฌ์ด ์ฝ๋"๋ฅผ ์ฒ ํ์ผ๋ก ํ๋ ์ธ์ด๋ก, ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ์ ํตํด ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ฐ์ํ๊ฒ ํด๊ฒฐํ ์ ์๊ฒ ํด์ค๋๋ค. Claude Code๋ Python์ ๋์ ํน์ฑ๊ณผ Duck Typing์ ์ฅ์ ์ ํ์ฉํ๋ฉด์๋, ํ์ ํํธ์ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ํตํด ์ฝ๋์ ์์ ์ฑ์ ๋์ด๋ ๋ชจ๋ Python ๊ฐ๋ฐ ํจํด์ ์ง์ํฉ๋๋ค.
Python ์ํฐํ๋ผ์ด์ฆ ํ๋ก์ ํธ ๊ตฌ์กฐํ
ํ์ฅ ๊ฐ๋ฅํ Python ํ๋ก์ ํธ๋ ๋ช ํํ ํจํค์ง ๊ตฌ์กฐ์ ์์กด์ฑ ๊ด๋ฆฌ์์ ์์๋ฉ๋๋ค. Claude Code๋ PEP ํ์ค์ ์ค์ํ๋ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ํ๋์ ์ธ ๊ฐ๋ฐ ๋๊ตฌ ์ค์ ์ ์ ์ํ ์ ์์ต๋๋ค.
# ๊ธฐ๋ณธ Python ํ๋ก์ ํธ ์ค์
claude "Python ํจํค์ง ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ฐ๋ผ ์ค์ ํด์ค.
pyproject.toml, ๊ฐ์ ํ๊ฒฝ, ํ์
ํํธ,
๊ทธ๋ฆฌ๊ณ ํ
์คํธ ์ค์ ์ ํฌํจํด์ค"
# ๋๊ท๋ชจ FastAPI ์ ํ๋ฆฌ์ผ์ด์
claude "FastAPI๋ก ์ํฐํ๋ผ์ด์ฆ๊ธ API ์๋ฒ๋ฅผ ๊ตฌ์ถํด์ค.
- ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋ (SQLAlchemy 2.0)
- Pydantic v2๋ก ๋ฐ์ดํฐ ๊ฒ์ฆ
- OAuth2/JWT ์ธ์ฆ ์์คํ
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ ๋๋น
- ๋ชจ๋ํฐ๋ง๊ณผ ๋ก๊น
์์คํ
"
# ๋ฐ์ดํฐ ์์ง๋์ด๋ง ํ์ดํ๋ผ์ธ
claude "Apache Airflow๋ก ๋์ฉ๋ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด์ค.
- ETL ์ํฌํ๋ก์ฐ ์๋ํ
- Pandas/Polars ์ฑ๋ฅ ์ต์ ํ
- ๋์ฉ๋ ๋ฐ์ดํฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ
- ์๋ฌ ๋ณต๊ตฌ์ ์ฌ์๋ ๋ก์ง
- ๋ชจ๋ํฐ๋ง๊ณผ ์๋ฆผ ์์คํ
"
# ๋จธ์ ๋ฌ๋ ํ๋ก๋์
์์คํ
claude "MLOps ํ์ดํ๋ผ์ธ์ Python์ผ๋ก ๊ตฌ์ถํด์ค.
- MLflow๋ก ์คํ ์ถ์ ๊ณผ ๋ชจ๋ธ ๋ฒ์ ๊ด๋ฆฌ
- Celery๋ก ๋น๋๊ธฐ ๋งค์น ํ์ต
- FastAPI๋ก ๋ชจ๋ธ ์๋น API
- ์ค์๊ฐ ๋ชจ๋ธ ๋ชจ๋ํฐ๋ง
- A/B ํ
์คํธ ํ๋ ์์ํฌ"
์ํฐํ๋ผ์ด์ฆ๊ธ pyproject.toml ์ค์
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
[tool.poetry]
name = "enterprise-python-app"
version = "0.1.0"
description = "Enterprise-grade Python application"
authors = ["Team <team@company.com>"]
readme = "README.md"
packages = [{include = "app", from = "src"}]
[tool.poetry.dependencies]
python = "^3.11"
fastapi = "^0.104.0"
uvicorn = {extras = ["standard"], version = "^0.24.0"}
sqlalchemy = "^2.0.0"
alembic = "^1.12.0"
pydantic = "^2.5.0"
celery = "^5.3.0"
redis = "^5.0.0"
structlog = "^23.2.0"
prometheus-client = "^0.19.0"
[tool.poetry.group.dev.dependencies]
pytest = "^7.4.0"
pytest-asyncio = "^0.21.0"
pytest-cov = "^4.1.0"
mypy = "^1.7.0"
black = "^23.11.0"
ruff = "^0.1.0"
pre-commit = "^3.5.0"
# ๋ง์ดํฌ๋ก์๋น์ค ๋๊ตฌ
locust = "^2.17.0" # ๋ก๋ ํ
์คํธ
opentelemetry-api = "^1.21.0" # ๋ถ์ฐ ์ถ์
jinja2 = "^3.1.0" # ํ
ํ๋ฆฟ ์์ง
# ์ฝ๋ ํ์ง ๋๊ตฌ
[tool.mypy]
python_version = "3.11"
strict = true
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
strict_equality = true
[tool.black]
line-length = 88
target-version = ['py311']
include = '\.pyi?$'
extend-exclude = '''
^/(
(
\.eggs
| \.git
| \.mypy_cache
| \.tox
| \.venv
| _build
| buck-out
| build
| dist
)/
)
'''
[tool.ruff]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # pyflakes
"I", # isort
"B", # flake8-bugbear
"C4", # flake8-comprehensions
"UP", # pyupgrade
"N", # pep8-naming
"S", # bandit
]
ignore = [
"E501", # line too long
"B008", # do not perform function calls in argument defaults
"S101", # use of assert
]
line-length = 88
target-version = "py311"
[tool.pytest.ini_options]
minversion = "7.0"
addopts = "-ra -q --cov=src --cov-report=term-missing --cov-report=html"
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
asyncio_mode = "auto"
๊ณ ๊ธ ํ์ ์์คํ ๊ณผ ์ ์ ๋ถ์
Python์ ๋์ ํน์ฑ์ ์ ์งํ๋ฉด์๋ ํ์ ์์ ์ฑ์ ํ๋ณดํ๋ ๊ฒ์ด ํ๋ Python ๊ฐ๋ฐ์ ํต์ฌ์ ๋๋ค.
# ๊ณ ๊ธ ํ์
ํํธ ํจํด
claude "์ด Python ์ฝ๋์ ๊ณ ๊ธ ํ์
ํํธ๋ฅผ ์ถ๊ฐํด์ค.
- ์ ๋ค๋ฆญ๊ณผ ํ๋กํ ์ฝ์ ํ์ฉํ ์ถ์ํ
- Union๊ณผ Literal์ ์ด์ฉํ ์ ํํ ํ์
์ ์
- TypeGuard๋ก ๋ฐํ์ ํ์
์ฒดํฌ
- NewType์ผ๋ก ๋๋ฉ์ธ ํ์
์์ฑ
- mypy strict ๋ชจ๋ ํต๊ณผ ๋ณด์ฅ"
# Pydantic v2 ๊ณ ๊ธ ๊ธฐ๋ฅ
claude "Pydantic v2๋ก ๊ณ ๊ธ ๋ฐ์ดํฐ ๊ฒ์ฆ ์์คํ
์ ๊ตฌ์ถํด์ค.
- Field validators์ model validators
- ๋น๋๊ธฐ ๊ฒ์ฆ์์ ์ปค์คํ
์๋ฆฌ์ผ๋ผ์ด์
- Discriminated Unions๋ก ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- JSON Schema ์๋ ์์ฑ
- ์ฑ๋ฅ ์ต์ ํ๋ ์ค์ "
# ์ ์ ๋ถ์ ๋๊ตฌ ํตํฉ
claude "Python ์ฝ๋ ํ์ง์ ์ํ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ์ค์ ํด์ค.
- mypy + Pylance๋ก ์ต๋ ํ์
์ฒดํฌ
- ruff๋ก ๋น ๋ฅธ ๋ฆฐํ
๊ณผ ํฌ๋งคํ
- bandit์ผ๋ก ๋ณด์ ์ทจ์ฝ์ ๊ฒ์ฌ
- vulture๋ก ์ฌ์ฉํ์ง ์๋ ์ฝ๋ ํ์ง
- ์ ์ฒด CI/CD ํ์ดํ๋ผ์ธ ํตํฉ"
์ค์ ํ์ ํํธ ์์
from typing import (
AsyncGenerator, Awaitable, Callable,
Generic, Literal, Protocol, TypeGuard,
TypeVar, Union, overload
)
from dataclasses import dataclass
from pydantic import BaseModel, Field, field_validator
from datetime import datetime
from decimal import Decimal
# Domain Types with NewType
from typing import NewType
UserId = NewType('UserId', int)
Email = NewType('Email', str)
ProductId = NewType('ProductId', str)
# Protocol for dependency injection
class DatabaseProtocol(Protocol):
async def execute(self, query: str) -> list[dict[str, any]]: ...
async def fetch_one(self, query: str) -> dict[str, any] | None: ...
# Generic Repository Pattern
T = TypeVar('T', bound=BaseModel)
class Repository(Generic[T]):
def __init__(self, db: DatabaseProtocol, model_class: type[T]) -> None:
self._db = db
self._model_class = model_class
async def find_by_id(self, id_: int) -> T | None:
result = await self._db.fetch_one(
f"SELECT * FROM {self._model_class.__tablename__} WHERE id = {id_}"
)
return self._model_class(**result) if result else None
# Advanced Pydantic Models
class UserCreateRequest(BaseModel):
email: Email = Field(..., pattern=r'^[\w\.-]+@[\w\.-]+\.\w+$')
name: str = Field(..., min_length=1, max_length=100)
age: int = Field(..., ge=18, le=120)
@field_validator('email')
@classmethod
def validate_email_domain(cls, v: str) -> str:
allowed_domains = ['company.com', 'partner.com']
domain = v.split('@')[1]
if domain not in allowed_domains:
raise ValueError(f'Email domain must be one of {allowed_domains}')
return v
# Type Guards for runtime validation
def is_valid_user_id(value: any) -> TypeGuard[UserId]:
return isinstance(value, int) and value > 0
# Discriminated Union for complex data structures
class SuccessResponse(BaseModel):
status: Literal['success'] = 'success'
data: dict[str, any]
timestamp: datetime = Field(default_factory=datetime.now)
class ErrorResponse(BaseModel):
status: Literal['error'] = 'error'
message: str
error_code: int
timestamp: datetime = Field(default_factory=datetime.now)
APIResponse = Union[SuccessResponse, ErrorResponse]
# Async Context Manager with proper typing
class AsyncDatabaseTransaction:
def __init__(self, db: DatabaseProtocol) -> None:
self._db = db
self._transaction: any = None
async def __aenter__(self) -> DatabaseProtocol:
self._transaction = await self._db.begin()
return self._db
async def __aexit__(self, exc_type: type[Exception] | None,
exc_val: Exception | None,
exc_tb: any) -> None:
if exc_type is None:
await self._transaction.commit()
else:
await self._transaction.rollback()
Python ์ฑ๋ฅ ์ต์ ํ - ์ํฐํ๋ผ์ด์ฆ ์์ค
๋๊ท๋ชจ Python ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฒ๋ฆฌ๋, ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ, ๋์์ฑ ์ฒ๋ฆฌ๊ฐ ๋ชจ๋ ์ค์ํฉ๋๋ค.
# ๊ณ ์ฑ๋ฅ ๋น๋๊ธฐ ์์คํ
claude "๋์ฉ๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ์์คํ
์ ๊ตฌ์ถํด์ค.
- asyncio + aiohttp๋ก ๋๋ HTTP ์์ฒญ ์ฒ๋ฆฌ
- asyncpg๋ก ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋
- ๋น๋๊ธฐ ์ปจํ
์คํธ ๋งค๋์ ์ ์ธ๋งํฌ์ด
- ๋ฐฑํ๋ ์
์ ์ํท ๊ด๋ฆฌ
- ์๋ฌ ์ ํ์ ๋ก๊น
์ ๋ต"
# ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ ์ ๋ต
claude "Pandas/Polars๋ก ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํด์ค.
- ์ฒญํฌ ๋จ์ ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ
- ์ ๋๋ ์ดํฐ์ ์ดํฐ๋ ์ดํฐ ์ต์ ํ
- ๋ฉ๋ชจ๋ฆฌ ๋งคํ ํ์ผ๊ณผ ํ์ผ ํ์
- ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๋ฉํฐํ๋ก์ธ์ฑ
- ๊ฐ๋น์ง ์ปด๋ ์
์ต์ ํ"
# Celery๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ฒ๋ฆฌ
claude "Celery๋ก ์ํฐํ๋ผ์ด์ฆ๊ธ ๋น๋๊ธฐ ์์
์์คํ
์ ๊ตฌ์ถํด์ค.
- Redis Sentinel๋ก ๊ณ ๊ฐ์ฉ์ฑ ๋ธ๋ก์ปค
- ๋์ ์์ปค ์ค์ผ์ผ๋ง
- ์์
์ฐ์ ์์์ ๋ผ์ฐํ
- ์คํจ ์ฒ๋ฆฌ์ ์ฌ์๋ ์ ๋ต
- ๋ชจ๋ํฐ๋ง๊ณผ ๋ฉํธ๋ฆญ ์์ง"
# ์ฑ๋ฅ ํ๋กํ์ผ๋ง๊ณผ ๋ณ๋ชฉ ๋ถ์
claude "Python ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ๋ณ๋ชฉ์ ์ฐพ์์ ์ต์ ํํด์ค.
- cProfile๊ณผ py-spy๋ก ํ๋กํ์ผ๋ง
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ถ์ (memory_profiler)
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ต์ ํ
- ์บ์ ์ ๋ต ๋ฐ ๋ฉ๋ชจ์ด์ ์ด์
- JIT ์ปดํ์ผ๋ฌ (Numba) ํ์ฉ"
๊ณ ์ฑ๋ฅ ๋น๋๊ธฐ ํจํด ์์
import asyncio
import aiohttp
import asyncpg
from typing import AsyncIterator, AsyncContextManager
from contextlib import asynccontextmanager
import structlog
from dataclasses import dataclass
from datetime import datetime
# ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
ํ
class AsyncDatabasePool:
def __init__(self, dsn: str, min_size: int = 10, max_size: int = 100):
self.dsn = dsn
self.min_size = min_size
self.max_size = max_size
self.pool: asyncpg.Pool | None = None
self.logger = structlog.get_logger()
async def initialize(self) -> None:
"""๋น๋๊ธฐ ์ปค๋ฅ์
ํ ์ด๊ธฐํ"""
self.pool = await asyncpg.create_pool(
self.dsn,
min_size=self.min_size,
max_size=self.max_size,
command_timeout=60
)
self.logger.info("Database pool initialized",
min_size=self.min_size, max_size=self.max_size)
@asynccontextmanager
async def acquire(self) -> AsyncIterator[asyncpg.Connection]:
"""์ปค๋ฅ์
ํ๋ ๋ฐ ์๋ ๋ฐ๋ฉ"""
if not self.pool:
raise RuntimeError("Pool not initialized")
async with self.pool.acquire() as conn:
try:
yield conn
except Exception as e:
self.logger.error("Database operation failed", error=str(e))
raise
async def close(self) -> None:
"""์ปค๋ฅ์
ํ ์ข
๋ฃ"""
if self.pool:
await self.pool.close()
self.logger.info("Database pool closed")
# ๋น๋๊ธฐ HTTP ํด๋ผ์ด์ธํธ ๋ํผ
class AsyncHTTPClient:
def __init__(self, timeout: int = 30, max_connections: int = 100):
self.timeout = aiohttp.ClientTimeout(total=timeout)
self.connector = aiohttp.TCPConnector(
limit=max_connections,
limit_per_host=20,
keepalive_timeout=30
)
self.session: aiohttp.ClientSession | None = None
self.logger = structlog.get_logger()
async def __aenter__(self) -> 'AsyncHTTPClient':
self.session = aiohttp.ClientSession(
timeout=self.timeout,
connector=self.connector
)
return self
async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
if self.session:
await self.session.close()
async def get_multiple(self, urls: list[str],
concurrency: int = 10) -> AsyncIterator[dict]:
"""์ฌ๋ฌ URL์ ๋์์ ์์ฒญํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์คํธ๋ฆฌ๋ฐ"""
semaphore = asyncio.Semaphore(concurrency)
async def fetch_one(url: str) -> dict:
async with semaphore:
try:
async with self.session.get(url) as response:
data = await response.json()
return {"url": url, "status": response.status, "data": data}
except Exception as e:
self.logger.error("HTTP request failed", url=url, error=str(e))
return {"url": url, "status": 500, "error": str(e)}
# ๋น๋๊ธฐ ์ ๋๋ ์ดํฐ๋ก ๊ฒฐ๊ณผ ์คํธ๋ฆฌ๋ฐ
tasks = [fetch_one(url) for url in urls]
for task in asyncio.as_completed(tasks):
result = await task
yield result
# ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ ๋๋ ์ดํฐ ํจํด
async def process_large_dataset_chunks(
query: str,
db_pool: AsyncDatabasePool,
chunk_size: int = 10000
) -> AsyncIterator[list[dict]]:
"""๋์ฉ๋ ๋ฐ์ดํฐ์
์ ์ฒญํฌ ๋จ์๋ก ์ฒ๋ฆฌ"""
offset = 0
while True:
chunked_query = f"{query} LIMIT {chunk_size} OFFSET {offset}"
async with db_pool.acquire() as conn:
rows = await conn.fetch(chunked_query)
if not rows:
break
# dict๋ก ๋ณํํ์ฌ ๋ฆฌํด
chunk = [dict(row) for row in rows]
yield chunk
offset += chunk_size
# ๋ด๋ถ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋น๋๊ธฐ ์ง์ฐ
await asyncio.sleep(0.01)
# ๋ฌด์ ํ ์ฌ์๋์ ์ง์ ๋ฐฑ์คํ
async def retry_with_exponential_backoff(
func: Callable[[], Awaitable[T]],
max_retries: int = 3,
base_delay: float = 1.0,
max_delay: float = 60.0
) -> T:
"""์ง์ ๋ฐฑ์คํ์ ํจ๊ป ์ฌ์๋"""
logger = structlog.get_logger()
for attempt in range(max_retries + 1):
try:
return await func()
except Exception as e:
if attempt == max_retries:
logger.error("Max retries exceeded", error=str(e))
raise
delay = min(base_delay * (2 ** attempt), max_delay)
logger.warning(
"Operation failed, retrying",
attempt=attempt + 1,
max_retries=max_retries,
delay=delay,
error=str(e)
)
await asyncio.sleep(delay)
# ์ด ์ง์ ์ ๋๋ฌํ ์ ์์
raise RuntimeError("Unexpected execution path")
Python ์ํฐํ๋ผ์ด์ฆ CLAUDE.md ์์
๋๊ท๋ชจ Python ํ๋ก์ ํธ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ผ์ธ
# Enterprise Python Guidelines
## ํ๋ก์ ํธ ๊ตฌ์กฐ
src/
โโโ app/
โ โโโ api/ # FastAPI ๋ผ์ฐํฐ์ ์๋ํฌ์ธํธ
โ โโโ core/ # ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋๋ฉ์ธ ๋ชจ๋ธ
โ โโโ db/ # ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๊ณผ ๋ง์ด๊ทธ๋ ์ด์
โ โโโ services/ # ๋น์ฆ๋์ค ๋ก์ง ์๋น์ค
โ โโโ utils/ # ์ ํธ๋ฆฌํฐ ํจ์
โโโ tests/
โโโ scripts/ # ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ ์ด์ ์คํฌ๋ฆฝํธ
## ์ฝ๋ ํ์ง ๊ธฐ์ค
- **PEP 8 + ruff**: ๋ชจ๋ ์ฝ๋๋ ruff ๋ฆฐํฐ ํต๊ณผ ํ์
- **ํ์
ํํธ**: mypy strict ๋ชจ๋ 100% ์ปค๋ฒ๋ฆฌ์ง
- **๋ณต์ก๋**: ํจ์๋น ๋งฅ๋ ๋ณต์ก๋ 10 ์ดํ
- **๋์คํธ๋ง**: ๊ณ ํ์ง ๋์คํธ๋ง ํ์ (Google Style)
## ํ์
ํํธ ๊ท์น
```python
from typing import TypeVar, Generic, Protocol, TypeGuard, NewType
from datetime import datetime
from decimal import Decimal
# Domain Types
UserId = NewType('UserId', int)
Email = NewType('Email', str)
# Repository Protocol
T = TypeVar('T')
class Repository(Protocol, Generic[T]):
async def find_by_id(self, id_: int) -> T | None: ...
async def save(self, entity: T) -> T: ...
async def delete(self, id_: int) -> bool: ...
# Type Guards
def is_valid_email(value: str) -> TypeGuard[Email]:
return '@' in value and '.' in value.split('@')[1]
# Pydantic Models
class UserCreate(BaseModel):
email: Email = Field(..., description="์ฌ์ฉ์ ์ด๋ฉ์ผ")
name: str = Field(..., min_length=1, max_length=100)
@field_validator('email')
@classmethod
def validate_email(cls, v: str) -> str:
if not is_valid_email(v):
raise ValueError('์ ํจํ์ง ์์ ์ด๋ฉ์ผ ํ์')
return v
๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ท์น
- ์ปจํ ์คํธ ๋งค๋์ : ๋ชจ๋ ๋ฆฌ์์ค๋ async context manager ์ฌ์ฉ
- ์๋ฌ ์ฒ๋ฆฌ: ๋น๋๊ธฐ ์์ ์ ๋ํ ์ฒด๊ณ์ ์์ธ ์ฒ๋ฆฌ
- ๋ฆฌ์์ค ๊ด๋ฆฌ: ์ปค๋ฅ์ ํ๊ณผ ์ธ๋งํฌ์ด ์ฌ์ฉ
- ๋ก๊น : structlog๋ก ๊ตฌ์กฐํ๋ ๋ก๊น
์ฑ๋ฅ ๊ธฐ์ค
- API ์๋ต ์๊ฐ: 95% ์์ฒญ 200ms ์ดํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ: ๋ชจ๋ ์ฟผ๋ฆฌ 100ms ์ดํ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ํ๋ก์ธ์ค๋น 512MB ์ดํ
- ๋์ ์ฌ์ฉ์: 10,000๋ช ๋์ ์ ์ ์ง์
ํ ์คํธ ์ ๋ต
- ์ปค๋ฒ๋ฆฌ์ง: ๋จ์ ํ ์คํธ 90% ์ด์
- ํตํฉ ํ ์คํธ: ์ฃผ์ API ์๋ํฌ์ธํธ 100% ์ปค๋ฒ
- E2E ํ ์คํธ: ๋น์ฆ๋์ค ํฌ๋ฆฌํฐ์ปฌ ์๋๋ฆฌ์ค
- ์ฑ๋ฅ ํ ์คํธ: Locust๋ก ๋ก๋ ํ ์คํธ
๋ณด์ ๊ท์น
- ์ ๋ ฅ ๊ฒ์ฆ: ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ Pydantic ๊ฒ์ฆ
- SQL Injection: SQLAlchemy ORM ์ฌ์ฉ, ์ง์ ์ฟผ๋ฆฌ ๊ธ์ง
- ๋น๋ฐ๋ฒํธ: bcrypt๋ก ํด์ฑ, ์ต์ 12์๋ฆฌ
- API ํค: ํ๊ฒฝ ๋ณ์๋ก๋ง ๊ด๋ฆฌ, ์ฝ๋์ ํ๋์ฝ๋ฉ ๊ธ์ง
๋ก๊น ๊ณผ ๋ชจ๋ํฐ๋ง
import structlog
logger = structlog.get_logger()
# ๋น์ฆ๋์ค ๋ก์ง
logger.info(
"User created successfully",
user_id=user.id,
email=user.email,
timestamp=datetime.now().isoformat()
)
# ์๋ฌ ๋ก๊น
logger.error(
"Database connection failed",
error=str(e),
retry_count=retry_count,
max_retries=max_retries
)
CI/CD ์ฒดํฌ๋ฆฌ์คํธ
- [ ] ruff linting ํต๊ณผ
- [ ] mypy ํ์ ์ฒดํฌ ํต๊ณผ
- [ ] pytest ๋ชจ๋ ํ ์คํธ ํต๊ณผ
- [ ] bandit ๋ณด์ ์ค์บ ํต๊ณผ
- [ ] ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง 90% ์ด์
- [ ] ์ฑ๋ฅ ํ ์คํธ ๊ธฐ์ค ํต๊ณผ
### Python ์ค์ ๋๋ฒ๊น
๊ณผ ๋ชจ๋ํฐ๋ง
```bash
# ํ๋ก๋์
๋๋ฒ๊น
ํ๊ฒฝ
claude "Python ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋ก๋์
๋๋ฒ๊น
ํ๊ฒฝ์ ์ค์ ํด์ค.
- ์๊ฒฉ ๋๋ฒ๊น
๊ณผ ๋ก๊ทธ ์์ง
- APM ๋๊ตฌ (New Relic, DataDog) ์ฐ๋
- ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์ค์๊ฐ ์ถ์
- ์์ธ ๋ฐ ์ค๋ฅ ์๋ ์์ง
- ๋น๋๊ธฐ ์์
๋ชจ๋ํฐ๋ง"
# ๋์ฉ๋ ์์คํ
๋ชจ๋ํฐ๋ง
claude "Python ๋ง์ดํฌ๋ก์๋น์ค์ ์ข
ํฉ ๋ชจ๋ํฐ๋ง์ ์ค์ ํด์ค.
- Prometheus + Grafana ๋ฉํธ๋ฆญ ์์ง
- ๋ถ์ฐ ๋ก๊น
(ELK Stack)
- ๋น๋๊ธฐ ์์
๋์๋ณด๋
- ์๋ ์๋ฆผ๊ณผ ์์ค์ผ์ผ๋ ์ด์
- ์ฑ๋ฅ ํ๊ท ๊ฐ์ง"
[S2ST4] ์ธ์ด ์ ๋ต โ Java/Kotlin, Go, Rust
6.3 Java/Kotlin - ์ํฐํ๋ผ์ด์ฆ JVM
Java๋ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์ค์ด๋ฉฐ, Kotlin์ Java์์ ์๋ฒฝํ ํธํ์ฑ์ ์ ์งํ๋ฉด์๋ ํ๋์ ์ด๊ณ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ์ ์ ๊ณตํฉ๋๋ค. Claude Code๋ Java์ ๊ฐ๋ ฅํ ์ํ๊ณ์ JVM์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉฐ, Kotlin์ null ์์ ์ฑ๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฅ์ ํตํด ๋์ฑ ์์ ํ๊ณ ํํ๋ ฅ ์๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Java ์ํฐํ๋ผ์ด์ฆ ํ๋ก์ ํธ ํ๋ํ
๋ ๊ฑฐ์ Java ์์คํ ์ ํ๋์ ์ธ ์ํคํ ์ฒ๋ก ์ ํํ๋ ๊ฒ์ ๋จ์ํ ๋ฒ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ๋์ด์ ์ ์ฒด์ ์ธ ๊ฐ๋ฐ ํจ๋ฌ๋ค์์ ๋ณํ๋ฅผ ์๋ฏธํฉ๋๋ค. Claude Code๋ ์ด๋ฌํ ๋ณต์กํ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ฒด๊ณ์ ์ผ๋ก ์ง์ํ ์ ์์ต๋๋ค.
# ๊ธฐ๋ณธ ํ๋ํ ์์
claude "์ด ๋ ๊ฑฐ์ Java 8 ์ฝ๋๋ฅผ Java 17+ ๊ธฐ๋ฅ์ ํ์ฉํด์ ํ๋ํํด์ค.
- Records๋ก ๋ฐ์ดํฐ ํด๋์ค ๋ณํ
- Pattern Matching์ผ๋ก instanceof ๊ฐ์ํ
- Text Blocks๋ก ๊ฐ๋
์ฑ ํฅ์
- Optional๋ก null ์์ ์ฑ ๊ฐํ
- Stream API๋ก ์ปฌ๋ ์
์ฒ๋ฆฌ ์ต์ ํ"
# ๋๊ท๋ชจ ์์คํ
๋ง์ด๊ทธ๋ ์ด์
claude "๋ชจ๋๋ฆฌ์ Spring ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถํดํด์ค.
- ๋๋ฉ์ธ ๊ฒฝ๊ณ ์๋ณ๊ณผ ์๋น์ค ๋ถ๋ฆฌ
- Spring Cloud Gateway๋ก API ๊ฒ์ดํธ์จ์ด ๊ตฌ์ฑ
- ๋ถ์ฐ ํธ๋์ญ์
๊ณผ ์ฌ๊ฐ ํจํด ์ ์ฉ
- ์๋น์ค ๋ฉ์์ ๋ถ์ฐ ์ถ์ ์ค์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ๋ฆฌ ์ ๋ต"
# ์ฑ๋ฅ ์ต์ ํ
claude "Java ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ํ๋กํ์ผ๋งํ๊ณ ์ต์ ํํด์ค.
- JVM ํ๋๊ณผ GC ์ต์ ํ
- ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์ง์ ํด๊ฒฐ
- ์ค๋ ๋ ํ ์ค์ ์ต์ ํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์
ํ๋ง
- JIT ์ปดํ์ผ๋ฌ ์ต์ ํ"
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph TD
A[src/main/java/com/company/app/] --> B[config/<br/>Spring ์ค์ ํด๋์ค]
A --> C[domain/<br/>๋น์ฆ๋์ค ์์ญ]
A --> D[infrastructure/<br/>์ธ๋ถ ์์คํ
์ฐ๋]
A --> E[presentation/<br/>์ปจํธ๋กค๋ฌ์ DTO]
A --> F[shared/<br/>๊ณตํต ์ ํธ๋ฆฌํฐ]
A --> G[security/<br/>๋ณด์ ์ค์ ]
C --> H[model/<br/>๋๋ฉ์ธ ๋ชจ๋ธ]
C --> I[service/<br/>๋น์ฆ๋์ค ์๋น์ค]
C --> J[repository/<br/>๋ฐ์ดํฐ ์ก์ธ์ค]
K[resources/] --> L[application.yml<br/>ํ๊ฒฝ๋ณ ์ค์ ]
K --> M[logback.xml<br/>๋ก๊น
์ค์ ]
K --> N[schema.sql<br/>๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง]
classDef configStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef domainStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class B,D,E,F,G,H,I,J,L,M,N domainStyle
class A,C,K configStyle
์ํฐํ๋ผ์ด์ฆ๊ธ Java ํ๋ก์ ํธ ๊ตฌ์กฐ
Spring Boot ์ํฐํ๋ผ์ด์ฆ ํจํด
1. ๊ณ ๊ธ ์์กด์ฑ ์ฃผ์ ๊ณผ ์ค์ ๊ด๋ฆฌ
# ๋ณต์กํ ์์กด์ฑ ๊ทธ๋ํ ์ต์ ํ
claude "Spring Boot ์ ํ๋ฆฌ์ผ์ด์
์ ์์กด์ฑ ์ฃผ์
์ ์ต์ ํํด์ค.
- Constructor injection์ผ๋ก ๋ถ๋ณ์ฑ ๋ณด์ฅ
- ์ํ ์์กด์ฑ ํ์ง์ ํด๊ฒฐ
- Configuration Properties๋ก ํ์
์์ ํ ์ค์
- Profile๋ณ Bean ์กฐ๊ฑด๋ถ ์์ฑ
- ํ
์คํธ์ฉ Test Configuration ๋ถ๋ฆฌ"
# ๋ฉํฐ ๋ชจ๋ ํ๋ก์ ํธ ์ค์
claude "๋๊ท๋ชจ Spring Boot ๋ฉํฐ ๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ์ค์ ํด์ค.
- ๊ณตํต ๋ชจ๋๊ณผ ๋๋ฉ์ธ๋ณ ๋ชจ๋ ๋ถ๋ฆฌ
- ๋ชจ๋ ๊ฐ ์์กด์ฑ ๊ด๋ฆฌ
- ํตํฉ ํ
์คํธ์ ๋จ์ ํ
์คํธ ์ ๋ต
- ๋น๋ ์ต์ ํ์ ๋ณ๋ ฌ ์ปดํ์ผ
- ๋์ปค ์ด๋ฏธ์ง ๊ณ์ธตํ"
2. ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋น๋๊ธฐ ์ฒ๋ฆฌ
# WebFlux ๋ง์ด๊ทธ๋ ์ด์
claude "๊ธฐ์กด Spring MVC REST API๋ฅผ Spring WebFlux๋ก ๋ง์ด๊ทธ๋ ์ด์
ํด์ค.
- Mono์ Flux๋ฅผ ํ์ฉํ ๋
ผ๋ธ๋กํน ์ฒ๋ฆฌ
- R2DBC๋ก ๋ฐ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๋
- WebClient๋ก ์ธ๋ถ API ํธ์ถ ์ต์ ํ
- ๋ฐฑํ๋ ์
์ฒ๋ฆฌ์ ์๋ฌ ๋ณต๊ตฌ
- ์ฑ๋ฅ ๋ฒค์น๋งํฌ์ ๋น๊ต ๋ถ์"
# ํ์ด๋ธ๋ฆฌ๋ ์ํคํ
์ฒ
claude "Spring MVC์ WebFlux๋ฅผ ํผํฉํ ํ์ด๋ธ๋ฆฌ๋ ์์คํ
์ ๊ตฌ์ถํด์ค.
- CPU ์ง์ฝ์ ์์
์ MVC๋ก ์ฒ๋ฆฌ
- I/O ์ง์ฝ์ ์์
์ WebFlux๋ก ์ฒ๋ฆฌ
- ๊ณตํต ๋ณด์ ์ค์ ๊ณผ ์ธ์ฆ ์ฒ๋ฆฌ
- ๋ชจ๋ํฐ๋ง๊ณผ ๋ฉํธ๋ฆญ ํตํฉ
- ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ ๋ต"
Kotlin ์ํฐํ๋ผ์ด์ฆ ๊ฐ๋ฐ ํจํด
Kotlin์ Java์ ํํ๋ ฅ ๋ถ์กฑ์ ํด๊ฒฐํ๋ฉด์๋ ๊ธฐ์กด Java ์ํ๊ณ์ ์๋ฒฝํ๊ฒ ํธํ๋๋ ํ๋์ ์ธ ์ธ์ด์ ๋๋ค. ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์๋ ํนํ null ์์ ์ฑ๊ณผ ๊ฐ๊ฒฐํ ๋ฌธ๋ฒ์ด ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค.
# Java ์ฝ๋๋ฒ ์ด์ค ์ ์ง์ Kotlin ์ ํ
claude "๊ธฐ์กด Java Spring Boot ํ๋ก์ ํธ๋ฅผ ์ ์ง์ ์ผ๋ก Kotlin์ผ๋ก ์ ํํด์ค.
- ์ ๊ธฐ๋ฅ์ Kotlin์ผ๋ก ์์ฑ
- data class๋ก DTO ๊ฐ์ํ
- sealed class๋ก ์ํ ๊ด๋ฆฌ
- extension functions๋ก ์ ํธ๋ฆฌํฐ ํจ์ ์ ๋ฆฌ
- coroutines๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ฐ์ "
# Kotlin DSL ํ์ฉ
claude "Kotlin DSL์ ํ์ฉํด์ ์ค์ ๊ณผ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ์ ํด์ค.
- build.gradle.kts๋ก ๋น๋ ์คํฌ๋ฆฝํธ ํ์
์์ ์ฑ ํ๋ณด
- Spring Security DSL๋ก ๋ณด์ ์ค์ ๊ฐ์ํ
- ํ
์คํธ DSL๋ก ๊ฐ๋
์ฑ ๋์ ํ
์คํธ ์์ฑ
- ๋๋ฉ์ธ ํนํ ์ธ์ด ๊ตฌํ"
Kotlin ์ํฐํ๋ผ์ด์ฆ ์ฝ๋ ์์
// ํ์
์์ ํ ์ค์ ๊ด๋ฆฌ
@ConfigurationProperties(prefix = "app")
data class AppProperties(
val database: DatabaseProperties,
val security: SecurityProperties,
val features: FeatureFlags
) {
data class DatabaseProperties(
val url: String,
val maxPoolSize: Int = 20,
val connectionTimeout: Duration = Duration.ofSeconds(30)
)
data class SecurityProperties(
val jwtSecret: String,
val jwtExpiration: Duration = Duration.ofHours(24),
val corsAllowedOrigins: List<String> = emptyList()
)
data class FeatureFlags(
val enableNewPaymentSystem: Boolean = false,
val enableAdvancedAnalytics: Boolean = false
)
}
// ๊ฒฐ๊ณผ ํ์
์ผ๋ก ์๋ฌ ์ฒ๋ฆฌ
sealed class Result<out T> {
data class Success<T>(val value: T) : Result<T>()
data class Error(val exception: Throwable) : Result<Nothing>()
inline fun <R> map(transform: (T) -> R): Result<R> = when (this) {
is Success -> Success(transform(value))
is Error -> this
}
inline fun <R> flatMap(transform: (T) -> Result<R>): Result<R> = when (this) {
is Success -> transform(value)
is Error -> this
}
}
// ์ฝ๋ฃจํด์ ํ์ฉํ ์๋น์ค ๊ณ์ธต
@Service
class UserService(
private val userRepository: UserRepository,
private val emailService: EmailService,
private val auditService: AuditService
) {
suspend fun createUser(request: CreateUserRequest): Result<User> = runCatching {
// ๋ณ๋ ฌ ๊ฒ์ฆ
val (emailExists, usernameExists) = coroutineScope {
val emailCheck = async { userRepository.existsByEmail(request.email) }
val usernameCheck = async { userRepository.existsByUsername(request.username) }
emailCheck.await() to usernameCheck.await()
}
when {
emailExists -> throw UserAlreadyExistsException("Email already exists")
usernameExists -> throw UserAlreadyExistsException("Username already exists")
}
val user = User(
email = request.email,
username = request.username,
hashedPassword = hashPassword(request.password)
)
// ๋ณ๋ ฌ ์ฒ๋ฆฌ
coroutineScope {
val saveUser = async { userRepository.save(user) }
val sendEmail = async { emailService.sendWelcomeEmail(user.email) }
val audit = async { auditService.logUserCreation(user.id) }
saveUser.await().also {
sendEmail.await()
audit.await()
}
}
}.fold(
onSuccess = { Result.Success(it) },
onFailure = { Result.Error(it) }
)
}
// Extension functions๋ก ์ ํธ๋ฆฌํฐ ํ์ฅ
fun String.isValidEmail(): Boolean =
matches("""^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$""".toRegex())
fun <T> List<T>.chunkedParallel(size: Int, block: suspend (List<T>) -> Unit) = runBlocking {
chunked(size).map { chunk ->
async { block(chunk) }
}.awaitAll()
}
// ํ์
์์ ํ ์ฟผ๋ฆฌ ๋น๋
class UserQueryBuilder {
private val criteria = mutableListOf<String>()
private val parameters = mutableMapOf<String, Any>()
fun byEmail(email: String) = apply {
criteria.add("email = :email")
parameters["email"] = email
}
fun byAgeRange(min: Int, max: Int) = apply {
criteria.add("age BETWEEN :minAge AND :maxAge")
parameters["minAge"] = min
parameters["maxAge"] = max
}
fun activeOnly() = apply {
criteria.add("active = true")
}
fun build(): Pair<String, Map<String, Any>> {
val query = "SELECT * FROM users" +
if (criteria.isNotEmpty()) " WHERE " + criteria.joinToString(" AND ")
else ""
return query to parameters
}
}
Java/Kotlin ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
# JVM ์ฑ๋ฅ ํ๋
claude "Java/Kotlin ์ ํ๋ฆฌ์ผ์ด์
์ JVM ์ฑ๋ฅ์ ์ต์ ํํด์ค.
- G1GC vs ZGC vs Parallel GC ๋น๊ต ๋ถ์
- ํ ํฌ๊ธฐ์ ๋ฉํ์คํ์ด์ค ํ๋
- JIT ์ปดํ์ผ๋ฌ ์ต์ ํ ์ต์
- ์ค๋ ๋ ๋ก์ปฌ ํ ๋น ๋ฒํผ(TLAB) ์ค์
- Flight Recorder๋ก ์ฑ๋ฅ ํ๋กํ์ผ๋ง"
# ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
claude "๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ ํํ๊ณ GC ์๋ฐ์ ์ค์ฌ์ค.
- ๊ฐ์ฒด ํ๋ง๊ณผ ์ฌ์ฌ์ฉ ์ ๋ต
- ์คํํ ์บ์ฑ ๊ตฌํ
- WeakReference์ SoftReference ํ์ฉ
- ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์ง์ ํด๊ฒฐ
- ๋์ฉ๋ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ ์ฒ๋ฆฌ"
# ๋์์ฑ ์ต์ ํ
claude "Java/Kotlin์ ๋์์ฑ ๊ธฐ๋ฅ์ ์ต์ ํํด์ค.
- Virtual Threads (Project Loom) ํ์ฉ
- CompletableFuture vs Kotlin Coroutines ๋น๊ต
- ๋ฝํ๋ฆฌ ์๋ฃ๊ตฌ์กฐ ๊ตฌํ
- Actor ๋ชจ๋ธ๊ณผ CSP ํจํด
- ๋ฐฑํ๋ ์
์ ํ๋ก์ฐ ์ ์ด"
Java/Kotlin ์ํฐํ๋ผ์ด์ฆ CLAUDE.md ์์
๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์์ ์ข ํฉ์ ์ธ ๊ฐ๋ฐ ๊ฐ์ด๋๋ผ์ธ
# Java/Kotlin Enterprise Guidelines
## ์ธ์ด ์ ํ ๊ธฐ์ค
- **์ ๊ท ๊ฐ๋ฐ**: Kotlin ์ฐ์ , ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ํํ
- **๋ ๊ฑฐ์ ํตํฉ**: Java ์ ์ง, ์ ์ง์ Kotlin ๋์
- **์ฑ๋ฅ ํฌ๋ฆฌํฐ์ปฌ**: ํ๋กํ์ผ๋ง ํ ๊ฒฐ์
- **ํ ์ญ๋**: ํ์ต ๊ณก์ ๊ณ ๋ คํ ๋จ๊ณ์ ๋์
## Java ๊ฐ๋ฐ ๊ท์น
- **๋ฒ์ **: Java 17+ LTS ๋ฒ์ ์ฌ์ฉ
- **๊ธฐ๋ฅ ํ์ฉ**: Records, Pattern Matching, Sealed Classes
- **Null ์ฒ๋ฆฌ**: Optional ์ ๊ทน ํ์ฉ, null ๋ฆฌํด ๊ธ์ง
- **์คํธ๋ฆผ**: ์ปฌ๋ ์
์ฒ๋ฆฌ๋ Stream API ์ฌ์ฉ
- **๋ฌธ์์ด**: Text Blocks๋ก ๊ฐ๋
์ฑ ํฅ์
## Kotlin ๊ฐ๋ฐ ๊ท์น
- **Null Safety**: nullable ํ์
๋ช
์์ ์ฒ๋ฆฌ
- **๋ถ๋ณ์ฑ**: val ์ ํธ, ๋ถ๋ณ ์ปฌ๋ ์
์ฌ์ฉ
- **ํ์ฅ ํจ์**: ๊ธฐ์กด ํด๋์ค ํ์ฅ, ์ ํธ๋ฆฌํฐ ๋์ฒด
- **๋ฐ์ดํฐ ํด๋์ค**: DTO์ Value Object ํํ
- **์ฝ๋ฃจํด**: ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๊ธฐ๋ณธ ์ ํ
## Spring Boot ํจํด
```kotlin
// ์ปจํธ๋กค๋ฌ (RESTful API)
@RestController
@RequestMapping("/api/v1/users")
@Validated
class UserController(
private val userService: UserService
) {
@GetMapping("/{id}")
suspend fun getUser(
@PathVariable @Positive id: Long
): ResponseEntity<UserDto> =
userService.findById(id)
.map { ResponseEntity.ok(it) }
.getOrElse {
when (it) {
is UserNotFoundException -> ResponseEntity.notFound().build()
else -> ResponseEntity.internalServerError().build()
}
}
@PostMapping
suspend fun createUser(
@Valid @RequestBody request: CreateUserRequest
): ResponseEntity<UserDto> =
userService.createUser(request)
.map { ResponseEntity.status(201).body(it) }
.getOrElse { ResponseEntity.badRequest().build() }
}
// ์๋น์ค ๊ณ์ธต (๋น์ฆ๋์ค ๋ก์ง)
@Service
@Transactional
class UserService(
private val userRepository: UserRepository,
private val passwordEncoder: PasswordEncoder,
private val eventPublisher: ApplicationEventPublisher
) {
suspend fun createUser(request: CreateUserRequest): Result<UserDto> =
runCatching {
validateUniqueConstraints(request)
val user = User(
email = request.email,
username = request.username,
password = passwordEncoder.encode(request.password)
)
userRepository.save(user).also {
eventPublisher.publishEvent(UserCreatedEvent(it.id))
}
}.mapCatching { it.toDto() }
}
ํ ์คํธ ์ ๋ต
- ํ๋ ์์ํฌ: JUnit 5 + AssertJ + MockK(Kotlin) / Mockito(Java)
- ํตํฉ ํ ์คํธ: @SpringBootTest ์ต์ํ, TestContainers ํ์ฉ
- ์ฌ๋ผ์ด์ค ํ ์คํธ: @WebMvcTest, @DataJpaTest ๋ฑ ์ ๊ทน ํ์ฉ
- ํฝ์ค์ฒ: ๊ฐ์ฒด ์์ฑ ๋น๋ ํจํด, ํ ์คํธ ๋ฐ์ดํฐ ๋น๋
// ํ
์คํธ ์์
@ExtendWith(MockKExtension::class)
class UserServiceTest {
@MockK
private lateinit var userRepository: UserRepository
@MockK
private lateinit var passwordEncoder: PasswordEncoder
@InjectMockKs
private lateinit var userService: UserService
@Test
fun `should create user successfully`() = runTest {
// Given
val request = CreateUserRequestBuilder()
.withEmail("test@example.com")
.withUsername("testuser")
.build()
every { passwordEncoder.encode(any()) } returns "encoded_password"
coEvery { userRepository.save(any()) } returns UserBuilder().build()
// When
val result = userService.createUser(request)
// Then
result.isSuccess shouldBe true
coVerify { userRepository.save(any()) }
}
}
์ฑ๋ฅ ๊ธฐ์ค
- ์๋ต ์๊ฐ: REST API 95% ์์ฒญ 200ms ์ดํ
- ์ฒ๋ฆฌ๋: ์ด๋น 1000 ์์ฒญ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ: ํ ์ฌ์ฉ๋ฅ 80% ์ดํ ์ ์ง
- GC: Full GC 1๋ถ ์ดํ, Stop-the-world 10ms ์ดํ
๋ชจ๋ํฐ๋ง๊ณผ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ
- ๋ฉํธ๋ฆญ: Micrometer + Prometheus
- ๋ก๊น : Logback + Structured Logging
- ํธ๋ ์ด์ฑ: Spring Cloud Sleuth + Zipkin
- ํ๋กํ์ผ๋ง: Java Flight Recorder
๋ฐฐํฌ์ ์ด์
- ์ปจํ ์ด๋: Multi-stage Docker build
- JVM ์ค์ : ํ๊ฒฝ๋ณ ์ต์ ํ๋ JVM ์ต์
- ํฌ์ค์ฒดํฌ: Actuator ์๋ํฌ์ธํธ ํ์ฉ
- ๊ทธ๋ ์ด์คํ ์ ง๋ค์ด: ์งํ ์ค์ธ ์์ฒญ ์๋ฃ ํ ์ข ๋ฃ
Java/Kotlin ์ค์ ๋๋ฒ๊น ๊ณผ ๋ฌธ์ ํด๊ฒฐ
# ๋ณต์กํ ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ
claude "๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฐ์ํ๋ ๋ฐ๋๋ฝ์ ํ์งํ๊ณ ํด๊ฒฐํด์ค.
- ์ค๋ ๋ ๋คํ ๋ถ์๊ณผ ํด์
- ๋ฝ ๊ฒฝํฉ ์ง์ ์๋ณ
- ๋ฝํ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ์ ์ฉ
- Virtual Threads ๋ง์ด๊ทธ๋ ์ด์
- ์ฑ๋ฅ ๋ฒค์น๋งํฌ์ ๊ฒ์ฆ"
# ๋ฉ๋ชจ๋ฆฌ ๋์ ์ง๋จ
claude "Java ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ง๋จํ๊ณ ํด๊ฒฐํด์ค.
- ํ ๋คํ ๋ถ์๊ณผ MAT ๋๊ตฌ ํ์ฉ
- ๊ฐํ ์ฐธ์กฐ ์ฒด์ธ ์ถ์
- ๋ฆฌ์ค๋์ ์ฝ๋ฐฑ ๋์ ํ์ง
- ์คํํ ๋ฉ๋ชจ๋ฆฌ ๋์ ํ์ธ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ํจํด ์ต์ ํ"
# ํ๋ก๋์
์ด์ ๋์
claude "ํ๋ก๋์
ํ๊ฒฝ์ ์ฑ๋ฅ ์ ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ง๋จํด์ค.
- APM ๋๊ตฌ๋ก ๋ณ๋ชฉ ์ง์ ์๋ณ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ฑ๋ฅ ๋ถ์
- GC ๋ก๊ทธ ๋ถ์๊ณผ ํ๋
- JIT ์ปดํ์ผ๋ฌ ์ต์ ํ ํ์ธ
- ์๋ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ ๊ตฌํ"
6.4 Go
Go๋ ๋จ์ํจ๊ณผ ์ฑ๋ฅ์ ๋์์ ์ถ๊ตฌํ๋ ์ธ์ด๋ก, ๋ช ์์ ์ด๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ํตํด ํ์ฅ ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ค๋๋ค. ๊ฐ๋ ฅํ ๋์์ฑ ๋ชจ๋ธ๊ณผ ์ปดํ์ผ ์๋, ๊ทธ๋ฆฌ๊ณ ์ต์ํ์ ๋ฐํ์ ์์กด์ฑ์ผ๋ก ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ง์ดํฌ๋ก์๋น์ค ๊ฐ๋ฐ์ ์ด์์ ์ ๋๋ค. Claude Code๋ Go์ ๊ด์ฉ๊ตฌ์ ํจํด๊ณผ ๋์์ฑ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ํ์ฉํ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Go ํ๋ก์ ํธ ๊ตฌ์กฐ
Go ํ๋ก์ ํธ์ ์ฑ๊ณต์ ๋ช ํํ ํจํค์ง ๊ตฌ์กฐ์ ์์กด์ฑ ๊ด๋ฆฌ์์ ์์๋ฉ๋๋ค. Claude Code๋ Go ์ปค๋ฎค๋ํฐ์ ํ์ค ํ๋ก์ ํธ ๋ ์ด์์๊ณผ Clean Architecture ์์น์ ์ ์ฉํ ๊ตฌ์กฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph TD
A[Go ํ๋ก์ ํธ ๊ตฌ์กฐ] --> B[cmd/<br/>๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
<br/>์ง์
์ ๊ณผ ์คํ ํ์ผ]
A --> C[internal/<br/>๋ด๋ถ ํจํค์ง<br/>์ธ๋ถ์์ import ๋ถ๊ฐ]
A --> D[pkg/<br/>๊ณต๊ฐ ํจํค์ง<br/>์ธ๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅ]
A --> E[api/<br/>API ์ ์<br/>OpenAPI, gRPC ์คํค๋ง]
A --> F[web/<br/>์น ์ ํ๋ฆฌ์ผ์ด์
<br/>์ ์ ํ์ผ, ํ
ํ๋ฆฟ]
A --> G[configs/<br/>์ค์ ํ์ผ<br/>ํ๊ฒฝ๋ณ ๊ตฌ์ฑ]
C --> H[handler/<br/>HTTP ํธ๋ค๋ฌ]
C --> I[service/<br/>๋น์ฆ๋์ค ๋ก์ง]
C --> J[repository/<br/>๋ฐ์ดํฐ ์ ์ฅ์]
C --> K[domain/<br/>๋๋ฉ์ธ ๋ชจ๋ธ]
classDef publicStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef internalStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
class B,D,E,F,G publicStyle
class C,H,I,J,K internalStyle
claude "Go ๋ชจ๋์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด์ค.
Clean Architecture๋ฅผ ์ ์ฉํ๊ณ ,
์์กด์ฑ ์ฃผ์
๊ณผ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด์ ํ
์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค"
Go ๋์์ฑ ํจํด
1. ๊ณ ๋ฃจํด๊ณผ ์ฑ๋
claude "์ด ์์ฐจ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ๊ณ ๋ฃจํด๊ณผ ์ฑ๋์ ์ฌ์ฉํด์ ๋ณ๋ ฌํํด์ค.
์ ์ ํ ์๋ฌ ์ฒ๋ฆฌ์ ์ปจํ
์คํธ ์ทจ์๋ ๊ตฌํํด์ค"
2. ๋์์ฑ ํจํด
claude "Worker Pool ํจํด์ ๊ตฌํํด์ค.
์์
ํ, ์์ปค ๊ณ ๋ฃจํด, ๊ฒฐ๊ณผ ์์ง์ ํฌํจํ๊ณ ,
graceful shutdown๋ ์ง์ํด์ค"
Go CLAUDE.md ์์
# Go Project Guidelines
## ํ๋ก์ ํธ ๊ตฌ์กฐ
cmd/ # ๋ฉ์ธ ์ ํ๋ฆฌ์ผ์ด์
internal/ # ๋ด๋ถ ํจํค์ง
pkg/ # ๊ณต๊ฐ ํจํค์ง
api/ # API ์ ์
## ์ฝ๋ฉ ๊ท์น
- ์๋ฌ๋ ํญ์ ์ฒ๋ฆฌ
- ์ธํฐํ์ด์ค๋ ์ฌ์ฉํ๋ ์ชฝ์์ ์ ์
- ๊ณ ๋ฃจํด ๋ฆฌํฌ ๋ฐฉ์ง
## ์๋ฌ ์ฒ๋ฆฌ
```go
if err != nil {
return fmt.Errorf("failed to process: %w", err)
}
ํ ์คํธ
- ํ ์ด๋ธ ๊ธฐ๋ฐ ํ ์คํธ
- ์ธํฐํ์ด์ค๋ก ๋ชจํน
- ํตํฉ ํ ์คํธ ํฌํจ
6.5 Rust
Rust๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋์์ ๋ณด์ฅํ๋ ์์คํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, ์์ ๊ถ ์์คํ ๊ณผ ํ์ ์์คํ ์ ํตํด ์ปดํ์ผ ํ์์ ๋ง์ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. Claude Code๋ Rust์ ๋ ํนํ ์์ ๊ถ ๋ชจ๋ธ๊ณผ ํธ๋ ์ดํธ ์์คํ ์ ์ดํดํ๊ณ , ์์ ํ๋ฉด์๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
Rust ์์ ์ฑ ํ์ฉ
Rust์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋ฐํ์ ๋น์ฉ ์์ด ๋ณด์ฅํ๋ค๋ ์ ์ ๋๋ค. Claude Code๋ ์์ ๊ถ, ์ฐจ์ฉ, ์๋ช ์ฃผ๊ธฐ ๋ฑ Rust์ ํต์ฌ ๊ฐ๋ ์ ํ์ฉํ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
claude "์ด C++ ์ฝ๋๋ฅผ Rust๋ก ์ฌ์์ฑํด์ค.
์์ ๊ถ, ์๋ช
์ฃผ๊ธฐ, ํธ๋ ์ดํธ๋ฅผ ํ์ฉํด์
๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋ณด์ฅํ๋ฉด์๋ ์ฑ๋ฅ์ ์ ์งํด์ค"
Rust ์๋ฌ ์ฒ๋ฆฌ
1. Result ํ์ ํ์ฉ
claude "์ด ํจ์๋ค์ ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํด์ค.
Result ํ์
๊ณผ ? ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ณ ,
์ปค์คํ
์๋ฌ ํ์
๋ ์ ์ํด์ค"
2. ๋น๋๊ธฐ Rust
claude "Tokio๋ฅผ ์ฌ์ฉํด์ ๋น๋๊ธฐ ์น ์๋ฒ๋ฅผ ๋ง๋ค์ด์ค.
๋์ ์์ฒญ ์ฒ๋ฆฌ, ํ์์์, ๊ทธ๋ฆฌ๊ณ graceful shutdown์ ๊ตฌํํด์ค"
Rust CLAUDE.md ์์
# Rust Project Guidelines
## ์์ ์ฑ ๊ท์น
- unsafe ์ต์ํ
- unwrap() ์ฌ์ฉ ๊ธ์ง
- clippy ๊ฒฝ๊ณ ๋ชจ๋ ํด๊ฒฐ
## ์๋ฌ ์ฒ๋ฆฌ
```rust
use thiserror::Error;
#[derive(Error, Debug)]
pub enum AppError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Parse error: {0}")]
Parse(String),
}
์ฑ๋ฅ
- ๋ถํ์ํ ๋ณต์ฌ ํผํ๊ธฐ
- ์ ๋ก ์ฝ์คํธ ์ถ์ํ ํ์ฉ
- ๋ฒค์น๋งํฌ๋ก ๊ฒ์ฆ
์์กด์ฑ
- ์ต์ํ์ ํฌ๋ ์ดํธ ์ฌ์ฉ
- ๋ฒ์ ๊ณ ์
- ๋ณด์ ๊ฐ์ฌ ์ ๊ธฐ ์คํ
## ์ธ์ด ๊ฐ ์ํธ ์ด์ฉ์ฑ
ํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์์๋ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์กฐํฉํ์ฌ ๊ฐ ์ธ์ด์ ์ฅ์ ์ ํ์ฉํ๋ ๋ฉํฐ ์ธ์ด ์ํคํ
์ฒ๊ฐ ์ผ๋ฐ์ ์
๋๋ค. Claude Code๋ ์ธ์ด ๊ฐ ๊ฒฝ๊ณ๋ฅผ ๋๋๋๋ ํตํฉ ์๋ฃจ์
์ ์ค๊ณํ๊ณ , ํ์
์์ ์ฑ์ ์ ์งํ๋ฉด์ ๋ค์ํ ์ธ์ด๋ก ๊ตฌ์ฑ๋ ์์คํ
์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
### ๋ค๊ตญ์ด ํ๋ก์ ํธ
์๋ก ๋ค๋ฅธ ์ธ์ด๋ก ๊ฐ๋ฐ๋ ์ปดํฌ๋ํธ๋ค์ ํตํฉํ ๋๋ API ์ธํฐํ์ด์ค์ ์ผ๊ด์ฑ๊ณผ ํ์
์์ ์ฑ์ด ์ค์ํฉ๋๋ค. Claude Code๋ ์ด๋ฌํ ํตํฉ ๊ณผ์ ์ ์๋ํํ๊ณ ์ต์ ํํ ์ ์์ต๋๋ค.
```bash
claude "Python ๋ฐฑ์๋์ TypeScript ํ๋ก ํธ์๋๋ฅผ ์ฐ๊ฒฐํ๋
ํ์
์์ ํ API ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํด์ค.
OpenAPI ์คํ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ ์์ฑ๋๋๋ก ํด์ค"
FFI (Foreign Function Interface)
claude "Rust๋ก ์์ฑ๋ ๊ณ ์ฑ๋ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ
Python์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ์ธ๋ฉ์ ๋ง๋ค์ด์ค.
PyO3๋ฅผ ์ฌ์ฉํ๊ณ , ํ์
๋ณํ๋ ์์ ํ๊ฒ ์ฒ๋ฆฌํด์ค"
์ธ์ด๋ณ ์ต์ ํ ์ ๋ต
๊ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์๋ก ๋ค๋ฅธ ์ค๊ณ ๋ชฉํ์ ํธ๋ ์ด๋์คํ๋ฅผ ๊ฐ์ง๊ณ ์์ด, ์ธ์ด๋ณ๋ก ์ต์ ํ ์ ๊ทผ ๋ฐฉ์์ด ๋ฌ๋ผ์ผ ํฉ๋๋ค. Claude Code๋ ๊ฐ ์ธ์ด์ ํน์ฑ์ ๋ง๋ ์ต์ ํ ์ ๋ต์ ์ ์ฉํ์ฌ ์ต์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
1. ์ฑ๋ฅ ์ค์ฌ ์ธ์ด (C++, Rust, Go)
์ฑ๋ฅ์ด ํต์ฌ ์๊ตฌ์ฌํญ์ธ ์ธ์ด๋ค์ ์คํ ์๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์ฒ๋ฆฌ๋ ์ต์ ํ์ ์ง์คํด์ผ ํฉ๋๋ค. Claude Code๋ ๋ฒค์น๋งํน๊ณผ ํ๋กํ์ผ๋ง์ ํตํ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์ต์ ํ๋ฅผ ์ง์ํฉ๋๋ค.
# ๋ฒค์น๋งํฌ ๊ธฐ๋ฐ ์ต์ ํ
claude "์ด ํจ์์ ์ฑ๋ฅ์ ํ๋กํ์ผ๋งํ๊ณ ์ต์ ํํด์ค.
๋ฒค์น๋งํฌ๋ฅผ ์์ฑํ๊ณ , ๋ณ๋ชฉ ์ง์ ์ ์ฐพ์์ ๊ฐ์ ํด์ค"
2. ์์ฐ์ฑ ์ค์ฌ ์ธ์ด (Python, Ruby, JavaScript)
# ๊ฐ๋ฐ ์๋ ์ต์ ํ
claude "์ด ํ๋กํ ํ์
์ ๋น ๋ฅด๊ฒ ๊ตฌํํด์ค.
์ผ๋จ ์๋ํ๊ฒ ๋ง๋ ํ, ํ์ํ ๋ถ๋ถ๋ง ์ต์ ํํด์ค"
3. ์์ ์ฑ ์ค์ฌ ์ธ์ด (Rust, Haskell, Kotlin)
# ํ์
์์คํ
ํ์ฉ
claude "์ด ๋น์ฆ๋์ค ๋ก์ง์ ํ์
์์คํ
์ผ๋ก ๋ณด์ฅํด์ค.
๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋๋ก ์ปดํ์ผ ํ์์ ๊ฒ์ฆํด์ค"
์ค์ ํ: ์ธ์ด ์ ํ ๊ฐ์ด๋
ํ๋ก์ ํธ์ ์ ํฉํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ ํํ๋ ๊ฒ์ ํ๋ก์ ํธ ์ฑ๊ณต์ ํต์ฌ ์์์ ๋๋ค. Claude Code๋ ๋ค์ํ ์์๋ฅผ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํ์ฌ ์ต์ ์ ์ธ์ด ์ ํ์ ๋์์ค ์ ์์ต๋๋ค.
์ธ์ด ์ ํ ๊ธฐ์ค
ํจ๊ณผ์ ์ธ ์ธ์ด ์ ํ์ ์ํด์๋ ๊ธฐ์ ์ ์๊ตฌ์ฌํญ๋ฟ๋ง ์๋๋ผ ํ์ ์ญ๋, ํ๋ก์ ํธ ์ผ์ , ์ฅ๊ธฐ์ ์ ์ง๋ณด์์ฑ ๋ฑ์ ์ข ํฉ์ ์ผ๋ก ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
# ํ๋ก์ ํธ ์๊ตฌ์ฌํญ ๋ถ์
claude "์ด ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ์ ๋ถ์ํ๊ณ ,
๊ฐ์ฅ ์ ํฉํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ถ์ฒํด์ค.
์ฑ๋ฅ, ๊ฐ๋ฐ ์๋, ํ ์ญ๋, ์ํ๊ณ๋ฅผ ๊ณ ๋ คํด์ค"
์ธ์ด๋ณ ์ ํฉํ ๋๋ฉ์ธ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph LR
subgraph languages [์ธ์ด๋ณ ์ ๋ฌธ ๋ถ์ผ]
A[Python<br/>๋ฐ์ดํฐ ๊ณผํ, AI/ML<br/>์คํฌ๋ฆฝํ
]
B[JavaScript/TS<br/>์น ๊ฐ๋ฐ<br/>ํ์คํ]
C[Go<br/>๋ง์ดํฌ๋ก์๋น์ค<br/>DevOps]
D[Rust<br/>์์คํ
ํ๋ก๊ทธ๋๋ฐ<br/>WebAssembly]
E[Java/Kotlin<br/>์ํฐํ๋ผ์ด์ฆ<br/>Android]
end
subgraph strengths [ํต์ฌ ๊ฐ์ ]
F[ํ๋ถํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ<br/>๋น ๋ฅธ ํ๋กํ ํ์ดํ]
G[์ ๋๋ฒ์ค ์ธ์ด<br/>์ํ๊ณ ํตํฉ]
H[๋จ์ํจ๊ณผ ์ฑ๋ฅ<br/>๋์์ฑ ๋ชจ๋ธ]
I[์์ ์ฑ๊ณผ ์ฑ๋ฅ<br/>๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ]
J[์ฑ์ํ ์ํ๊ณ<br/>ํ๋ซํผ ์์ ์ฑ]
end
A -.-> F
B -.-> G
C -.-> H
D -.-> I
E -.-> J
classDef langStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef strengthStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C,D,E langStyle
class F,G,H,I,J strengthStyle
๋ง์น๋ฉฐ
์ธ์ด๋ณ ํน์ฑ์ ๊น์ด ์ดํดํ๊ณ ํ์ฉํ๋ ๊ฒ์ Claude Code๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ํต์ฌ์ ๋๋ค. ๊ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ๊ณ ์ ํ ์ฒ ํ๊ณผ ๊ฐ์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ต๋ํ ํ์ฉํ ๋ ์ง์ ํ ๊ฐ์น๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
ํต์ฌ ์์น ์์ฝ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
mindmap
root((ํต์ฌ ์์น))
์ธ์ด ์ฒ ํ ์กด์ค
๊ฐ์น์ ์ค๊ณ ์์น ์ดํด
์ธ์ด ๊ณ ์ ํน์ฑ ๋ฐ์
ํ๋ผ๋ค์ ์ผ๊ด์ฑ ์ ์ง
์ํ๊ณ ํ์ฉ
ํ์ค ๋๊ตฌ ์ ๊ทน ํ์ฉ
๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
ํ๋ ์์ํฌ ๋ชจ๋ฒ ์ฌ๋ก
๊ฐ๋ฐ ํจ์จ์ฑ ๊ทน๋ํ
๊ด์ฉ๊ตฌ ๋ฐ๋ฅด๊ธฐ
์ปค๋ฎค๋ํฐ ๊ฒ์ฆ ํจํด
์ผ๊ด๋ ์ฝ๋ฉ ์คํ์ผ
ํ ํ์
ํฅ์
์ ์ง๋ณด์์ฑ ํ๋ณด
๊ฐ์ ๊ทน๋ํ
๊ณ ์ ์ฅ์ ์๋ณ
์ ํฉํ ์ํคํ
์ฒ ์ ์ฉ
์ฑ๋ฅ ํน์ฑ ํ์ฉ
๋ฌธ์ ์์ญ ์ต์ ํ
- ์ธ์ด ์ฒ ํ ์กด์ค: ๊ฐ ์ธ์ด๊ฐ ์ถ๊ตฌํ๋ ๊ฐ์น์ ์ค๊ณ ์์น์ ๊น์ด ์ดํดํ๊ณ ์ฝ๋์ ๋ฐ์
- ์ํ๊ณ ํ์ฉ: ์ธ์ด๋ณ ํ์ค ๋๊ตฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ๋ฅผ ์ ๊ทน ํ์ฉํ์ฌ ๊ฐ๋ฐ ํจ์จ์ฑ ๊ทน๋ํ
- ๊ด์ฉ๊ตฌ ๋ฐ๋ฅด๊ธฐ: ์ปค๋ฎค๋ํฐ์์ ๊ฒ์ฆ๋ ์ฝ๋ฉ ์คํ์ผ๊ณผ ํจํด์ ์ค์ํ์ฌ ์ผ๊ด์ฑ ์๋ ์ฝ๋ ์์ฑ
- ๊ฐ์ ๊ทน๋ํ: ๊ฐ ์ธ์ด์ ๊ณ ์ ํ ์ฅ์ ์ ์ด๋ฆฌ๋ ์ํคํ ์ฒ์ ์ค๊ณ ํจํด ์ ์ฉ
์ค๋ฌด ์ ์ฉ ์ ๋ต
- ํ๋ก์ ํธ ์์ ์: ์๊ตฌ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ์ธ์ด ์ ํ๊ณผ ์ด๊ธฐ ์ค์ ์ต์ ํ
- ๊ฐ๋ฐ ์ค: ์ธ์ด๋ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ค์ํ๋ ์ฝ๋ ์์ฑ๊ณผ ์ง์์ ์ธ ์ฝ๋ ํ์ง ๊ด๋ฆฌ
- ์ ์ง๋ณด์: ์ธ์ด ์ํ๊ณ์ ๋ฐ์ ์ ๋ง์ถ ์ง์์ ์ธ ์ ๋ฐ์ดํธ์ ํ๋ํ
- ํ ํ์ : ์ธ์ด๋ณ ๊ฐ์ด๋๋ผ์ธ ๊ณต์ ์ ์ฝ๋ ๋ฆฌ๋ทฐ ๊ธฐ์ค ์๋ฆฝ
๋ค์ ์ฅ์์๋ ์ด๋ฌํ ์ธ์ด๋ณ ํน์ฑ์ ํ์ฉํ์ฌ ํจ์จ์ ์ธ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ ๋ฐ์ ๊ฑธ์ณ Claude Code๋ฅผ ํตํฉํ์ฌ ์์ฐ์ฑ์ ๊ทน๋ํํ๋ ์ ๋ต์ ํ๊ตฌํด๋ด ์๋ค.
[S2ST5] Frontend Design โ ํ๋ก ํธ์๋ ๋์์ธ ํ๋ฌ๊ทธ์ธ
- frontend-design ํ๋ฌ๊ทธ์ธ: ๋ ์ฐฝ์ ์ด๊ณ ํ๋ก๋์ ๊ธ ํ๋ก ํธ์๋ ์ธํฐํ์ด์ค ์์ฑ
- ui-ux-builder-core ์คํฌ: UI/UX ๋น๋ โ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ธํฐํ์ด์ค ๊ตฌ์ถ ์๋ํ
- ๋ฐ์ํ ๋์์ธ, ์ ๊ทผ์ฑ(a11y), ๋คํฌ/๋ผ์ดํธ ๋ชจ๋๋ฅผ ๊ธฐ๋ณธ ํฌํจ
[S2ST6] Laravel Boost โ Laravel ํ๋ ์์ํฌ ๋ถ์คํธ
- laravel-boost ์ธ๋ถ ํ๋ฌ๊ทธ์ธ: Laravel ํ๋ก์ ํธ ๊ฐ๋ฐ ์๋ ํฅ์
- ๋ชจ๋ธ, ์ปจํธ๋กค๋ฌ, ๋ง์ด๊ทธ๋ ์ด์ , ํ ์คํธ ์๋ ์์ฑ ๋ฐ ์ต์ ํ
[S2ST7] Books โ ์ค๊ธ ๊ตฌ์กฐ ์ค์ ํ์ต
- 1๊ถ 08ํธ: IDE ๊ฒฐํฉ๊ณผ API ์ฐ๊ฒฐ โ VS Code, JetBrains ์ค์ ํตํฉ ๊ตฌ์ฑ
- 1๊ถ 13ํธ: ์์ ํ๊ฒฝ๊ณผ ํ์ฅ ์ํ๊ณ โ MCP, Skills, Plugins ์ค์ ๊ตฌ์ฑ
- 1๊ถ 22ํธ: MCP โ MCP ์๋ฒ ์ค์ ์ฐ๋ ๋ฐ ๊ตฌ์ฑ
- 1๊ถ 23ํธ: Plugins โ ํ๋ฌ๊ทธ์ธ ์ค์ ์ค์น ๋ฐ ํ์ฉ
- 1๊ถ 26ํธ: Settings โ settings.json ์ค์ ๊ตฌ์ฑ, ๊ถํ ์ฒด๊ณ ์ค์
- 2๊ถ 08ํธ: Language โ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ค์ ์ ํ ๊ฐ์ด๋
- 2๊ถ 09ํธ: Framework โ ํ๋ ์์ํฌ ์ค์ ์ ํ ๋ฐ ๊ตฌ์ฑ
- 2๊ถ 10ํธ: Styling โ CSS/๋์์ธ ์์คํ ์ค์ ๊ตฌ์ฑ
- 2๊ถ 11ํธ: State Management โ ์ํ ๊ด๋ฆฌ ์ค์ ํจํด
- 2๊ถ 12ํธ: Database โ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ค๊ณ ๋ฐ ๊ตฌ์ฑ
- 2๊ถ 13ํธ: Hosting โ ํธ์คํ /๋ฐฐํฌ ํ๊ฒฝ ์ค์ ๊ตฌ์ฑ
- 2๊ถ 14ํธ: External Service โ ์ธ๋ถ ์๋น์ค ์ค์ ์ฐ๋
- 2๊ถ 25ํธ: HTML ์ฌํ โ HTML ๊ตฌ์กฐ ์ค๊ณ ์ค์
- 2๊ถ 26ํธ: CSS ์ฌํ โ CSS ์ํคํ ์ฒ ์ค์
- 2๊ถ 27ํธ: JavaScript ์ฌํ โ JS ํจํด ์ค์
- 2๊ถ 28ํธ: Node.js โ ์๋ฒ์ฌ์ด๋ ์ค์ ๊ตฌ์ฑ
- 2๊ถ 29ํธ: Git ์ฌํ โ Git ๊ณ ๊ธ ์ํฌํ๋ก์ฐ ์ค์
- 2๊ถ 30ํธ: Supabase ์ฌํ โ Supabase ์ค์ ๊ตฌ์ฑ (RLS, Edge Functions)
- 2๊ถ 31ํธ: ๋๋ฉ์ธ ์ฌํ โ ๋๋ฉ์ธ ์ค์ ์ค์
- 2๊ถ 32ํธ: Vercel ์ฌํ โ Vercel ๋ฐฐํฌ ์ค์ ๊ตฌ์ฑ
- 2๊ถ 33ํธ: Resend ์ฌํ โ ์ด๋ฉ์ผ ์์คํ ์ค์ ๊ตฌ์ฑ
- 3๊ถ 08ํธ: Supabase HTML Viewer โ Viewer ์ค์ ๊ตฌ์ฑ
- 3๊ถ 12ํธ: Orders Reports JSON ์์คํ โ JSON ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค์
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S2ST8] ์ค์ Tips โ DB/ํ๋ก์ ํธ/๊ฐ๋ฐ ์ค๊ธ
๋ฐ์ดํฐ๋ฒ ์ด์ค/โ Supabase CRUD ์ค์ , SQL ์ฃผ์, RLS, ์ฟผ๋ฆฌ ์ต์ ํ (4๊ฐ)ํ๋ก์ ํธ_์์/โ CLAUDE.md ์ ๋ฆฌ, Dev Package, ์์ ๋๋ ํ ๋ฆฌ ์ค์ (5๊ฐ)๊ฐ๋ฐ_์ค๋ฌด/โ ํ์ผ ์์น, ํ์ผ ์ ์ฅ, ํ์ผ๋ช , ์ธ์ฆ์ฝ๋ ๊ตฌํ ์ค์ (14๊ฐ ์ค ๊ด๋ จ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S2ST9] ์ธ๋ถ ์ฐ๋ Guide โ 5๋ ์๋น์ค ์ค๊ธ
- 01. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ โ Supabase ํ๋ก์ ํธ ์์ฑ ๋ฐ ์ฐ๊ฒฐ
- 02. ํ์์ธ์ฆ ์ค์ โ OAuth Provider ์ค์ , ์ด๋ฉ์ผ ์ธ์ฆ
- 03. ์ด๋ฉ์ผ ์์คํ ์ค์ โ Resend ์ฐ๋ ๋ฐ ๊ตฌ์ฑ
- 04. ๋ฐฐํฌ ๋๋ฉ์ธ ์ค์ โ Vercel ๋ฐฐํฌ ๋ฐ ๋๋ฉ์ธ ์ฐ๊ฒฐ
- 05. ๊ฒฐ์ ์์คํ ์ค์ โ Toss Payments ์ฐ๋
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /์ธ๋ถ_์ฐ๋_์ค์ _Guide/
[S2ST10] .claude References โ ADK ์ํคํ ์ฒ
- references:
MOAI_ADK_Hooks_์ฐธ๊ณ .mdโ Hooks ๊ธฐ๋ฐ ์ด๋ฒคํธ ์ฐ๋ ์ค์ ํจํด - references:
MOAI_ADK_Skills_์ฐธ๊ณ .mdโ Skills ๋ฐํ์ ์ค์ ํ์ฉ ๊ธฐ๋ฒ
๐ ๊ฒฝ๋ก: .claude/references/
S2WF โ ์ํฌํ๋ก์ฐ (Workflow)
[S2WF1(์น์ 06b)] ํ๋กฌํํ ๊ณ ๊ธ ๊ธฐ๋ฒ
7.2 ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD) ์ค์ฒ
ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD)์ ๋์ ํ์ง์ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฒ์ฆ๋ ๋ฐฉ๋ฒ๋ก ์ ๋๋ค. Claude Code๋ TDD์ ๊ฐ ๋จ๊ณ์์ ์ ์ ํ ํ ์คํธ ์ผ์ด์ค ์์ฑ, ์ต์ ๊ตฌํ, ๊ทธ๋ฆฌ๊ณ ๋ฆฌํฉํ ๋ง์ ์ง์ํ์ฌ ๊ฐ๋ฐ์๊ฐ TDD ์์น์ ํจ๊ณผ์ ์ผ๋ก ์ค์ฒํ ์ ์๋๋ก ๋์์ค๋๋ค.
TDD ์ฌ์ดํด
TDD์ Red-Green-Refactor ์ฌ์ดํด์ ์ฝ๋ ํ์ง๊ณผ ์ค๊ณ์ ์ ์ง์ ๊ฐ์ ์ ํตํด ๊ฒฌ๊ณ ํ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ๊ธฐ๋ฐ์ด ๋ฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
flowchart LR
A[Red<br/>์คํจํ๋ ํ
์คํธ ์์ฑ] --> B[Green<br/>์ต์ ๊ตฌํ์ผ๋ก ํต๊ณผ]
B --> C[Refactor<br/>์ฝ๋ ํ์ง ๊ฐ์ ]
C --> A
subgraph activities [TDD ํ๋]
D[ํ
์คํธ ์ผ์ด์ค ์ ์<br/>์ฃ์ง ์ผ์ด์ค ๊ณ ๋ ค<br/>์คํจ ํ์ธ]
E[์ต์ํ์ ์ฝ๋<br/>ํ
์คํธ ํต๊ณผ ์ง์ค<br/>์ฑ๋ฅ์ ๋์ค์]
F[์ค๋ณต ์ ๊ฑฐ<br/>๊ฐ๋
์ฑ ํฅ์<br/>์ค๊ณ ๊ฐ์ ]
end
A -.-> D
B -.-> E
C -.-> F
classDef cycleStyle fill:#e2e8f0,stroke:#334155,stroke-width:3px,color:#1e293b
classDef activityStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C cycleStyle
class D,E,F activityStyle
TDD with Claude Code
1. Red Phase - ์คํจํ๋ ํ ์คํธ ์์ฑ
claude "calculateDiscount ํจ์๋ฅผ ์ํ ํ
์คํธ๋ฅผ ๋จผ์ ์์ฑํด์ค.
๋ค์ ์๋๋ฆฌ์ค๋ฅผ ํฌํจํด์ผ ํด
- ์ผ๋ฐ ํ ์ธ (10%)
- VIP ํ ์ธ (20%)
- ์ต๋ ํ ์ธ ํ๋
- ์ฃ์ง ์ผ์ด์ค (์์, 0, null)"
2. Green Phase - ์ต์ ๊ตฌํ
claude "์์ฑํ ํ
์คํธ๋ฅผ ํต๊ณผํ๋ ์ต์ํ์ ์ฝ๋๋ฅผ ๊ตฌํํด์ค.
์์ง ์ต์ ํ๋ ํ์ง ๋ง๊ณ , ํ
์คํธ ํต๊ณผ์๋ง ์ง์คํด์ค"
3. Refactor Phase - ๊ฐ์
claude "์ด์ ํ
์คํธ๋ ์ ์งํ๋ฉด์ ์ฝ๋๋ฅผ ๊ฐ์ ํด์ค.
์ค๋ณต ์ ๊ฑฐ, ๊ฐ๋
์ฑ ํฅ์, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์งํํด์ค"
TDD ์ค์ ์์
# ์ฌ์ฉ์ ์คํ ๋ฆฌ
claude "์ฌ์ฉ์ ์คํ ๋ฆฌ: '์ฌ์ฉ์๋ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค'
์ด๋ฅผ ์ํ TDD ์ฌ์ดํด์ ์์ํด์ค"
# Claude์ ์๋ต ๊ณผ์
# 1. ํ
์คํธ ์ผ์ด์ค ์ ์
# 2. API ์๋ํฌ์ธํธ ํ
์คํธ ์์ฑ
# 3. ์๋น์ค ๋ ์ด์ด ํ
์คํธ ์์ฑ
# 4. ์ค์ ๊ตฌํ
# 5. ๋ฆฌํฉํ ๋ง
- feature-dev ํ๋ฌ๊ทธ์ธ: ๊ธฐ๋ฅ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ ์๋ํ โ ํ์โ๊ณํโ๊ตฌํโ๊ฒ์ฆ ๋จ๊ณ ์๋ ์งํ
[S2WF2(์น์ 21)] ํ๋กฌํํธ ํ ํ๋ฆฟ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ค์ : ๊ธฐ์กด ์์คํ
์ดํด
โ SAL Grid Edition
claude "ํ์ฌ ์ฃผ๋ฌธ ์์คํ ์ด ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋์ง ๋ถ์ํด์ค"
์คํ: ๊ฒฐ์ ๊ธฐ๋ฅ ์ค๊ณ
โ SAL Grid Edition
claude "Stripe๋ฅผ ์ฌ์ฉํ ๊ฒฐ์ ๊ธฐ๋ฅ์ ์ค๊ณํด์ค.
๋ณด์, ์๋ฌ ์ฒ๋ฆฌ, ์ฌ์๋ ๋ก์ง์ ๊ณ ๋ คํด์ค"
### Day 2: ๊ตฌํ
```bash
# ์ค์ : ๋ฐฑ์๋ ๊ตฌํ
claude "๊ฒฐ์ API ์๋ํฌ์ธํธ๋ฅผ TDD๋ก ๊ตฌํํด์ค"
# ์คํ: ํ๋ก ํธ์๋ ๊ตฌํ
claude "๊ฒฐ์ UI๋ฅผ ๊ตฌํํด์ค.
์นด๋ ์ ๋ณด ์
๋ ฅ, ๊ฒ์ฆ, ๋ก๋ฉ ์ํ๋ฅผ ํฌํจํด์ค"
Day 3: ํตํฉ๊ณผ ํ ์คํธ
# ์ค์ : ํตํฉ ํ
์คํธ
claude "๊ฒฐ์ ํ๋ก์ฐ ์ ์ฒด๋ฅผ ํ
์คํธํ๋ E2E ํ
์คํธ๋ฅผ ์์ฑํด์ค"
# ์คํ: ๋ฌธ์ํ์ ๋ฐฐํฌ
claude "๊ฒฐ์ ๊ธฐ๋ฅ ์ฌ์ฉ ๊ฐ์ด๋๋ฅผ ์์ฑํ๊ณ ,
๋ฐฐํฌ ์ฒดํฌ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด์ค"
์ํฌํ๋ก์ฐ ์ต์ ํ ํ
1. ์ปจํ ์คํธ ๊ด๋ฆฌ
# ๊ธด ์์
์ ์ปจํ
์คํธ ์ ์ฅ
claude "์ง๊ธ๊น์ง์ ์์
์ ์์ฝํ๊ณ ,
๋ค์์ ํด์ผ ํ ์ผ์ ์ ๋ฆฌํด์ค"
# ์ปจํ
์คํธ ๋ณต์
claude "์ด์ ์ ์์
ํ๋ ๊ฒฐ์ ๊ธฐ๋ฅ ๊ตฌํ์ ๊ณ์ํด์ค.
๋ง์ง๋ง์ผ๋ก ์์
ํ ๋ถ๋ถ๋ถํฐ ์์ํด์ค"
2. ๋ณ๋ ฌ ์์
# ๋
๋ฆฝ์ ์ธ ์์
์๋ณ
claude "์ด ๊ธฐ๋ฅ๋ค ์ค ๋์์ ์งํํ ์ ์๋ ์์
์ ์ฐพ์์ค"
# ๋ฉํฐ ์ธ์คํด์ค ํ์ฉ
# Terminal 1: ๋ฐฑ์๋ ๊ฐ๋ฐ
# Terminal 2: ํ๋ก ํธ์๋ ๊ฐ๋ฐ
# Terminal 3: ํ
์คํธ ์์ฑ
3. ์๋ํ ์คํฌ๋ฆฝํธ
claude "๋ฐ๋ณต์ ์ธ ์์
์ ์๋ํํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ค
- ์ ์ปดํฌ๋ํธ ์์ฑ
- ํ
์คํธ ํ์ผ ์์ฑ
- ๋ฐฐํฌ ์ ์ฒดํฌ
- ์ฑ๋ฅ ์ธก์ "
์ํฌํ๋ก์ฐ CLAUDE.md ์์
# Development Workflow
## ๊ธฐ๋ฅ ๊ฐ๋ฐ ํ๋ก์ธ์ค
1. ์ด์ ์์ฑ ๋ฐ ๋ธ๋์น ์์ฑ
2. ํ์: ๊ด๋ จ ์ฝ๋ ๋ถ์ (30๋ถ)
3. ๊ณํ: ๊ตฌํ ์ ๋ต ์๋ฆฝ (30๋ถ)
4. ๊ตฌํ: TDD๋ก ๊ฐ๋ฐ (2-4์๊ฐ)
5. ๋ฆฌ๋ทฐ: ์์ฒด ์ฝ๋ ๋ฆฌ๋ทฐ (30๋ถ)
6. PR ์์ฑ ๋ฐ ๋ฆฌ๋ทฐ ์์ฒญ
## ์ผ์ผ ๋ฃจํด
- 09:00: ์ด์ ํ์ธ ๋ฐ ์ฐ์ ์์ ์ ๋ฆฌ
- 09:30: ์ง์ค ์ฝ๋ฉ (ํฌ๋ชจ๋๋ก ๊ธฐ๋ฒ)
- 14:00: ์ฝ๋ ๋ฆฌ๋ทฐ
- 16:00: ๋ฌธ์ ์
๋ฐ์ดํธ
- 17:00: ๋ค์ ๋ ๊ณํ
## ํ์ง ์ฒดํฌ๋ฆฌ์คํธ
- [ ] ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 80% ์ด์
- [ ] ๋ชจ๋ ํจ์์ JSDoc
- [ ] ์ฑ๋ฅ ํ๋กํ์ผ๋ง ์๋ฃ
- [ ] ์ ๊ทผ์ฑ ๊ฒ์ฌ ํต๊ณผ
- [ ] ๋ณด์ ์ค์บ ํต๊ณผ
[S2WF3(์น์ 05b)] ์ปจํ ์คํธ ๊ด๋ฆฌ ์ ๋ต
8.5 ํจ์จ์ ์ธ ์ปจํ ์คํธ ๊ด๋ฆฌ
์ปจํ ์คํธ ์ค์์นญ ์ต์ ํ
์์ ์ปจํ ์คํธ ์ ์ฅ
# Terminal 1์์ ์์
์ค๋จ ์
claude "ํ์ฌ ์์
์ํฉ์ ์์ฝํด์ค.
๋ค์์ ๋ค์ ์์ํ ๋ ํ์ํ ์ ๋ณด๋ฅผ ํฌํจํด์ค"
์ปจํ ์คํธ ๋ณต์
# ๋ค์ ์์
์์ ์
claude "์ด์ ์ ์์
ํ๋ ์ฌ์ฉ์ ์ธ์ฆ ๊ธฐ๋ฅ์ ๊ณ์ํด์ค.
๋ง์ง๋ง ์ํ๋ถํฐ ์ด์ด์ ์งํํด์ค"
๋ธ๋์น๋ณ ์ปจํ ์คํธ ๊ด๋ฆฌ
# ๋ธ๋์น ์ ํ ์ ์ปจํ
์คํธ ์๋ ๋ก๋
claude "ํ์ฌ ๋ธ๋์น(feature/user-auth)์ ์ปจํ
์คํธ๋ฅผ ๋ก๋ํด์ค.
๊ด๋ จ ํ์ผ๋ค๊ณผ ์์
๊ธฐ๋ก์ ํ์ธํด์ค"
์ธ์คํด์ค ๊ฐ ์ ๋ณด ๊ณต์
๊ณตํต ๋ฌธ์ ํ์ฉ
# shared/context.md
## ํ์ฌ ์งํ ์ํฉ
- Frontend: ๋ก๊ทธ์ธ ์ปดํฌ๋ํธ 50% ์๋ฃ
- Backend: ์ธ์ฆ API 80% ์๋ฃ
- Database: ์คํค๋ง ์๋ฃ, ๋ง์ด๊ทธ๋ ์ด์
ํ์
- Testing: ๋จ์ ํ
์คํธ ์์ฑ ์ค
## ๊ณตํต ๊ฒฐ์ ์ฌํญ
- JWT ํ ํฐ ๋ง๋ฃ ์๊ฐ: 1์๊ฐ
- API ์๋ต ํ์: { success, data, message }
- ์๋ฌ ์ฝ๋ ์ฒด๊ณ: HTTP ์ํ ์ฝ๋ + ์ปค์คํ
์ฝ๋
8.6 ๋ณ๋ ฌ ์ฒ๋ฆฌ ์ค์ ์์
์๋๋ฆฌ์ค: ์ ์์๊ฑฐ๋ ํ๋ซํผ ๊ตฌ์ถ
ํ๋ก์ ํธ ๊ตฌ์กฐ
ecommerce/
โโโ frontend/ # React ์ฑ
โโโ backend/ # Node.js API
โโโ admin-panel/ # ๊ด๋ฆฌ์ ํ์ด์ง
โโโ mobile-app/ # React Native
โโโ infrastructure/ # Docker, K8s
ํ ๊ตฌ์ฑ๊ณผ ์ธ์คํด์ค ๋ฐฐ์น
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph LR
subgraph devA [๊ฐ๋ฐ์ A: ํ๋ก ํธ์๋]
A1[Terminal A1<br/>Frontend ๊ฐ๋ฐ<br/>React + TypeScript]
A2[Terminal A2<br/>Mobile App ๊ฐ๋ฐ<br/>React Native]
end
subgraph devB [๊ฐ๋ฐ์ B: ๋ฐฑ์๋]
B1[Terminal B1<br/>Backend API ๊ฐ๋ฐ<br/>Node.js + Express]
B2[Terminal B2<br/>Infrastructure ๊ด๋ฆฌ<br/>Docker + K8s]
end
subgraph devC [๊ฐ๋ฐ์ C: ๊ด๋ฆฌ ๋ฐ ํ์ง]
C1[Terminal C1<br/>Admin Panel ๊ฐ๋ฐ<br/>Next.js + Dashboard]
C2[Terminal C2<br/>์ ์ฒด ํ
์คํธ ๋ฐ QA<br/>Jest + Cypress]
end
subgraph shared [๊ณต์ ๋ฆฌ์์ค]
S1[๊ณตํต API ์คํ<br/>OpenAPI]
S2[๊ณต์ ์ปดํฌ๋ํธ<br/>Design System]
S3[ํตํฉ ๋ฌธ์<br/>Architecture Docs]
end
A1 --> S1
A1 --> S2
A2 --> S1
A2 --> S2
B1 --> S1
B2 --> S3
C1 --> S2
C1 --> S3
C2 --> S3
classDef devStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef sharedStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A1,A2,B1,B2,C1,C2 devStyle
class S1,S2,S3 sharedStyle
1์ฃผ์ฐจ: ํ๋ก์ ํธ ์ค์
Day 1-2: ๊ธฐ๋ฐ ๊ตฌ์กฐ
# Terminal A1 (Frontend)
claude "React + TypeScript + Vite ํ๋ก์ ํธ๋ฅผ ์ค์ ํด์ค.
์ํ ๊ด๋ฆฌ, ๋ผ์ฐํ
, UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌํจํด์ค"
# Terminal B1 (Backend)
claude "Express + TypeScript + Prisma ํ๋ก์ ํธ๋ฅผ ์ค์ ํด์ค.
์ธ์ฆ, ๋ก๊น
, ์๋ฌ ํธ๋ค๋ง์ ํฌํจํด์ค"
# Terminal B2 (Infrastructure)
claude "Docker Compose๋ก ๊ฐ๋ฐ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ค.
PostgreSQL, Redis, Nginx๋ฅผ ํฌํจํด์ค"
Day 3-5: ํต์ฌ ๊ธฐ๋ฅ
# ๋ณ๋ ฌ ๊ฐ๋ฐ ์์
# Terminal A1: ์ ํ ๋ชฉ๋ก ์ปดํฌ๋ํธ
# Terminal A2: ๋ชจ๋ฐ์ผ ๋ค๋น๊ฒ์ด์
# Terminal B1: ์ ํ API
# Terminal B2: ์ธ์ฆ ์์คํ
# Terminal C1: ๊ด๋ฆฌ์ ๋์๋ณด๋
2์ฃผ์ฐจ: ํตํฉ๊ณผ ํ ์คํธ
# Terminal A1: ํ๋ก ํธ์๋ ํตํฉ ํ
์คํธ
claude "React Testing Library๋ก ํต์ฌ ํ๋ก์ฐ๋ฅผ ํ
์คํธํด์ค"
# Terminal B1: API ํตํฉ ํ
์คํธ
claude "Jest + Supertest๋ก API ์๋ํฌ์ธํธ๋ฅผ ํ
์คํธํด์ค"
# Terminal C2: E2E ํ
์คํธ
claude "Playwright๋ก ์ ์ฒด ์ฌ์ฉ์ ํ๋ก์ฐ๋ฅผ ํ
์คํธํด์ค"
๋ฉํฐํ์คํน ์ต์ ํ ํ
[S2WF5] Skills ์ํ๊ณ โ ๊ฒ์, ์ค์น, ์์ฑ
- find-skills-core ์คํฌ: skills.sh ์คํ ์ํ๊ณ์์ ํ์ํ ์คํฌ ๊ฒ์ ๋ฐ ์ค์น
- skill-creator ์คํฌ: ๋๋ง์ ์ปค์คํ ์คํฌ ์์ฑ ๋ฐ ๋ฐฐํฌ
[S2WF6] Plugin ๊ฐ๋ฐ โ 7๊ฐ ํ์ ์คํฌ
- plugin-dev ํ๋ฌ๊ทธ์ธ: ํ๋ฌ๊ทธ์ธ ๊ฐ๋ฐ ์ ์ฉ ๋๊ตฌ โ ์์ฑ, ํ ์คํธ, ๋ฐฐํฌ 7๋จ๊ณ ์ํฌํ๋ก์ฐ
- MCP ์๋ฒ + ์ปค์คํ ๋ช ๋ น์ด + ์์ด์ ํธ๋ฅผ ํ๋์ ํจํค์ง๋ก ๋ฌถ์ด ๋ฐฐํฌ
[S2WF7] Code Simplifier โ ์ฝ๋ ๋จ์ํ
- code-simplifier ํ๋ฌ๊ทธ์ธ: ๋ณต์กํ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ฆฌํฉํ ๋ง
- ์ํ ๋ณต์ก๋ ๊ฐ์, ์ค๋ณต ์ ๊ฑฐ, ๋ถํ์ํ ์ถ์ํ ์ ๋ฆฌ ์๋ ์ํ
[S2WF8] Commit Commands โ ์ปค๋ฐ ๋ช ๋ น์ด ์๋ํ
- commit-commands ํ๋ฌ๊ทธ์ธ: ์ปค๋ฐ ๋ฉ์์ง ์๋ ์์ฑ ๋ฐ ์ปค๋ฐ ์ํฌํ๋ก์ฐ ์๋ํ
- Conventional Commits ๊ท์น ์๋ ์ ์ฉ, ์ค์ฝํ ์๋ ์ถ๋ก
[S2WF9] Ralph Loop โ ๋ฐ๋ณต ๊ฐ์ ๋ฃจํ
- ralph-loop ํ๋ฌ๊ทธ์ธ: ์ฝ๋โ๋ฆฌ๋ทฐโ์์ โ์ฌ๋ฆฌ๋ทฐ ๋ฐ๋ณต ๊ฐ์ ๋ฃจํ ์๋ํ
- ํ์ง ๊ธฐ์ค ๋๋ฌ๊น์ง ์๋ ๋ฐ๋ณต ์คํ
[S2WF10] Create Image โ ์ด๋ฏธ์ง ์์ฑ ์์คํ
- create-image-core ์คํฌ: SVG/HTML/Mermaid/Pillow ๊ธฐ๋ฐ ์ด๋ฏธ์ง ์์ฑ ์ข ํฉ ์์คํ
- ๋ค์ด์ด๊ทธ๋จ, ์์ด์ฝ, ๋ฐฐ๋, ์ฐจํธ ๋ฑ ๋ค์ํ ์๊ฐ ์๋ฃ ์๋ ์์ฑ
[S2WF11] Slideshow Web โ ์ฌ๋ผ์ด๋์ผ ์นํ์ด์ง ์์ฑ
- slideshow-web-core ์คํฌ: PPT ์ฌ๋ผ์ด๋์ผ๋ฅผ ์นํ์ด์ง๋ก ๋ณํ + GitHub ๊ณต์
- ๋ฐ์ํ ๋์์ธ, ํค๋ณด๋ ๋ค๋น๊ฒ์ด์ , ๋คํฌ/๋ผ์ดํธ ๋ชจ๋ ์ง์
[S2WF12] Books โ ์ค๊ธ ์ํฌํ๋ก์ฐ ํ์ต
- 1๊ถ 15ํธ: ํ์ผ ๋ค๋ฃจ๊ธฐ โ ํ์ผ ๋๊ตฌ ์ค์ ํ์ฉ ์ฌํ
- 1๊ถ 16ํธ: ๋ช ๋ น ์คํ โ Bash ๋๊ตฌ ์ค์ ํ์ฉ ์ฌํ
- 1๊ถ 18ํธ: Commands โ ์ฌ์ฉ์ ์ ์ ๋ช ๋ น์ด ์ค์ ์์ฑ
- 1๊ถ 19ํธ: Skills โ ์คํฌ ์ ์ ๋ฐ ์ค์ ๋ฐฐํฌ
- 1๊ถ 21ํธ: Hooks โ Pre-commit Hook, ์๋ํ ํธ๋ฆฌ๊ฑฐ ์ค์
- 1๊ถ 28ํธ: ์๋ํ ์ฝ๋ ์์ฑ โ ์ฝ๋ ์๋ ์์ฑ ์ค์ ํจํด
- 1๊ถ 29ํธ: ๋ ธ์ฝ๋ ์๋ํ ๋๊ตฌ โ ๋ ธ์ฝ๋ ์ํฌํ๋ก์ฐ ์ค์ ๊ตฌ์ถ
- 1๊ถ 32ํธ: ํ๋กฌํํธ ์์ง๋์ด๋ง ๊ธฐ์ด โ ํ๋กฌํํ ์ค์ ์ ์ฉ
- 1๊ถ 33ํธ: ํ๋กฌํํธ ์์ง๋์ด๋ง ์ฌํ โ ๊ณ ๊ธ ํ๋กฌํํ ์ค์ ์ ๋ต
- 3๊ถ 04ํธ: Task ์์ฑ๊ณผ ์์กด์ฑ ๊ด๋ฆฌ โ Task ์์ฑ ์ค์ ์ํฌํ๋ก์ฐ
- 3๊ถ 05ํธ: Task Instruction ์์ฑ๋ฒ โ ์ง์นจ์ ์์ฑ ์ค์
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S2WF13] ์ค์ Tips โ ์ฌ์ฉ๋ฒ/๊ฐ๋ฐ/ํธ๋ฌ๋ธ์ํ /์ํต ์ค๊ธ
Claude_Code_์ฌ์ฉ๋ฒ/โ 5ํ ๋๋ฒ๊น ๊ท์น ์ค์ ์ ์ฉ, /status ๊ธฐ๋ฐ ๋ณ๋ชฉ ์ง๋จ, ๋์ผ ๋ชจ๋ ์ ํ ํ๋จ ๊ธฐ์ค (3๊ฐ)๊ฐ๋ฐ_์ค๋ฌด/โ 3๋จ๊ณ ๋ฐฉ๋ฒ๋ก ์ค์ ์ ์ฉ, ๊ท์น ๊ธฐ๋ฐ ์๋ํ ๊ตฌํ, ๋ฐ์ํ ๋ ์ด์์ ํจํด (14๊ฐ ์ค ์ค์ ์ค์ฌ)ํธ๋ฌ๋ธ์ํ /โ CORS/CSP ์ค์ ํด๊ฒฐ, ์๋ฒ ํฌํธ ์ถฉ๋ ์ง๋จ, ๋ฐํ์ ์๋ฌ ๋๋ฒ๊น ํจํด (4๊ฐ)ํจ์จ์ ์ธ_์ํต/โ ์ปจํ ์คํธ ์ต์ ํ ์ง๋ฌธ๋ฒ, ๋ค๋จ๊ณ ์์ฒญ ์ฒด์ด๋, ๊ฒฐ๊ณผ๋ฌผ ๊ธฐ๋ฐ ํผ๋๋ฐฑ ๋ฃจํ (5๊ฐ)์์ _๊ธฐ๋ก_๋ฐฑ์ /โ Orders/Reports JSON ๊ตฌ์กฐ ์ด์ฉ, work_logs ์๋ ๊ฐฑ์ ํจํด (6๊ฐ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S2WF14] .claude ์ฐธ๊ณ โ Methods/Commands ์ค๊ธ
- methods:
01_supabase-crud.mdโ REST API ๊ธฐ๋ฐ CRUD ์ค์ ํธ๋ฌ๋ธ์ํ - methods:
03_login-error.mdโ OAuth ์ฝ๋ฐฑ ์ค์ ์ง๋จ ๋ฐ ์ฆ์๋ณ ๋์ - commands:
commit,debug,deploy,review,testโ ๊ฐ๋ฐ ์ฌ์ดํด ํต์ฌ ๋ช ๋ น์ด ์กฐํฉ ์ด์ฉ
๐ ๊ฒฝ๋ก:.claude/methods/,.claude/commands/
S2TO โ ํ์ด์ฉ (Team Operations)
[S2TO1(์น์ 07b)] ์๋ธ์์ด์ ํธ ๋ณ๋ ฌ ๊ฐ๋ฐ
# Terminal 1 (Frontend Studio)
cd frontend/
claude "๋น์ ์ ํ๋ก ํธ์๋ UX ์ ๋ฌธ๊ฐ์
๋๋ค.
๋ค์ ์ญํ ์ ์ง์คํด์ฃผ์ธ์
- React/Vue/Angular ์ปดํฌ๋ํธ ์ํคํ
์ฒ ์ค๊ณ
- ๋ฐ์ํ ๋์์ธ๊ณผ ์ ๊ทผ์ฑ ์ต์ ํ
- ์ฑ๋ฅ ์ค์ฌ์ ์ํ ๊ด๋ฆฌ ๊ตฌํ
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ๊ณผ Progressive Web App ๊ธฐ๋ฅ
- ์ฌ์ฉ์ ์ธํฐ๋์
ํจํด๊ณผ ์ ๋๋ฉ์ด์
์ต์ ํ
ํ์ฌ ํ๋ก์ ํธ: [ํ๋ก์ ํธ๋ช
]
๊ธฐ์ ์คํ: React 18 + TypeScript + Vite
ํ์ง ๊ธฐ์ค: Lighthouse 95+ ์ ์ ์ ์ง"
๊ณ ๊ธ ํ๋ก ํธ์๋ ํจํด ์์
# ์ปดํฌ๋ํธ ์ํคํ
์ฒ ์ค๊ณ
claude "์ํฐํ๋ผ์ด์ฆ๊ธ ๋์์ธ ์์คํ
์ ๊ตฌ์ถํด์ค
- Atomic Design ๋ฐฉ๋ฒ๋ก ์ ์ฉ
- ํ์
์์ ํ ํ
๋ง ์์คํ
- ์๋ํ๋ ์คํ ๋ฆฌ๋ถ ๋ฌธ์ํ
- ์ปดํฌ๋ํธ ์ฑ๋ฅ ๋ฒค์น๋งํน
- ์๊ฐ์ ํ๊ท ํ
์คํธ ํตํฉ"
# ์ํ ๊ด๋ฆฌ ์ต์ ํ
claude "๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์
์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํด์ค
- ์๋ฒ ์ํ์ ํด๋ผ์ด์ธํธ ์ํ ๋ถ๋ฆฌ
- ์ตํฐ๋ฏธ์คํฑ ์
๋ฐ์ดํธ ํจํด
- ๋ฐฑ๊ทธ๋ผ์ด๋ ๋๊ธฐํ ์ ๋ต
- ์คํ๋ผ์ธ ๋ชจ๋ ์ง์
- ์ค์๊ฐ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ"
Backend Engine (์ธ์คํด์ค #2) - ์์คํ ์ํคํ ์ฒ ๋ง์คํฐ
๋ฐฑ์๋ ์ธ์คํด์ค๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์์ ํ ์๋ฒ ์์คํ ์ ๊ตฌ์ถํ๋ ์ ๋ฌธ๊ฐ๋ก์ ์ด์๋ฉ๋๋ค.
# Terminal 2 (Backend Engine)
cd backend/
claude "๋น์ ์ ๋ฐฑ์๋ ์์คํ
์ํคํ
ํธ์
๋๋ค.
๋ค์ ์์ญ์ ์ ๋ฌธ์ฑ์ ๋ฐํํด์ฃผ์ธ์
- ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ์ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ
- RESTful/GraphQL API ์ค๊ณ์ ๋ฒ์ ๊ด๋ฆฌ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ต์ ํ์ ์บ์ฑ ์ ๋ต
- ๋ณด์, ์ธ์ฆ, ๊ถํ ๊ด๋ฆฌ ์์คํ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ฉ์์ง ํ ์ํคํ
์ฒ
- ๋ชจ๋ํฐ๋ง, ๋ก๊น
, ์๋ฆผ ์์คํ
ํ์ฌ ํ๊ฒฝ: Node.js/Python + PostgreSQL + Redis
์ฑ๋ฅ ๋ชฉํ: 99.9% ๊ฐ์ฉ์ฑ, 200ms ์ดํ ์๋ต์๊ฐ
๋ณด์ ๊ธฐ์ค: OWASP Top 10 ์์ ์ค์"
์ํฐํ๋ผ์ด์ฆ ๋ฐฑ์๋ ํจํด
# ๋ง์ดํฌ๋ก์๋น์ค ์ค๊ณ
claude "ํ์ฅ ๊ฐ๋ฅํ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ
์ฒ๋ฅผ ์ค๊ณํด์ค
- ์๋น์ค ๊ฒฝ๊ณ์ ๋ฐ์ดํฐ ์์ ๊ถ ์ ์
- API Gateway์ ์๋น์ค ๋ฉ์ ๊ตฌ์ฑ
- ๋ถ์ฐ ํธ๋์ญ์
๊ณผ ์ฌ๊ฐ ํจํด
- ์ํท ๋ธ๋ ์ด์ปค์ ๋ฒํฌํค๋ ํจํด
- ์ด๋ฒคํธ ์์ฑ๊ณผ CQRS ์ ์ฉ"
# ๊ณ ์ฑ๋ฅ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
claude "๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํด์ค
- ์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ (Kafka/RabbitMQ)
- ๋ฐฐ์น ์ฒ๋ฆฌ ์ต์ ํ์ ๋ณ๋ ฌํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋ฉ๊ณผ ๋ ํ๋ฆฌ์ผ์ด์
- ์บ์ ๊ณ์ธตํ ์ ๋ต (L1/L2/L3)
- ์ค์๊ฐ ๋ถ์๊ณผ ๋ฉํธ๋ฆญ ์์ง"
DevOps Pipeline (์ธ์คํด์ค #3) - ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ๋ฌธ๊ฐ
์ธํ๋ผ ์ธ์คํด์ค๋ ํ๋์ ์ธ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์ ๊ตฌ์ถ๊ณผ ์ด์์ ์ ๋ดํฉ๋๋ค.
# Terminal 3 (DevOps Pipeline)
cd infrastructure/
claude "๋น์ ์ DevOps์ ํด๋ผ์ฐ๋ ์ํคํ
์ฒ ์ ๋ฌธ๊ฐ์
๋๋ค.
๋ค์ ์์ญ์ ๋ด๋นํด์ฃผ์ธ์
- Infrastructure as Code (Terraform/Pulumi)
- ์ปจํ
์ด๋ ์ค์ผ์คํธ๋ ์ด์
(Kubernetes/Docker Swarm)
- CI/CD ํ์ดํ๋ผ์ธ ์๋ํ (GitLab CI/GitHub Actions)
- ํด๋ผ์ฐ๋ ํ๋ซํผ ์ต์ ํ (AWS/GCP/Azure)
- ๋ณด์ ๊ฐํ์ ์ปดํ๋ผ์ด์ธ์ค ๊ด๋ฆฌ
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง๊ณผ ์๋ ์ค์ผ์ผ๋ง
- ์ฌํด ๋ณต๊ตฌ์ ๋ฐฑ์
์ ๋ต
๋ชฉํ ํ๊ฒฝ: Production-Ready Kubernetes Cluster
๊ฐ์ฉ์ฑ ๋ชฉํ: 99.99% uptime
๋ณด์ ๊ธฐ์ค: SOC 2 Type II ์ค์"
๊ณ ๊ธ DevOps ํจํด
# GitOps ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
claude "์์ ์๋ํ๋ GitOps ํ์ดํ๋ผ์ธ์ ๊ตฌํํด์ค
- ๋ฉํฐ ํ๊ฒฝ ๋ฐฐํฌ ์ ๋ต (dev/staging/prod)
- ๋ธ๋ฃจ-๊ทธ๋ฆฐ ๋ฐฐํฌ์ ์นด๋๋ฆฌ ๋ฆด๋ฆฌ์ค
- ์๋ ๋กค๋ฐฑ๊ณผ ํฌ์ค์ฒดํฌ ์์คํ
- ์ํฌ๋ฆฟ ๊ด๋ฆฌ์ ์ํธํ (Vault/Sealed Secrets)
- ์ฝ๋ ํ์ง ๊ฒ์ดํธ์ ๋ณด์ ์ค์บ
- ์ฑ๋ฅ ํ
์คํธ ์๋ํ"
# ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ ํ๋ซํผ
claude "์ข
ํฉ์ ์ธ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ ํ๋ซํผ์ ๊ตฌ์ถํด์ค
- ๋ฉํธ๋ฆญ ์์ง๊ณผ ์๊ฐํ (Prometheus/Grafana)
- ๋ถ์ฐ ์ถ์ (Jaeger/Zipkin)
- ๊ตฌ์กฐํ๋ ๋ก๊น
(ELK/Fluentd)
- ์๋ฆผ๊ณผ ์ธ์๋ํธ ๊ด๋ฆฌ (PagerDuty/Slack)
- SLI/SLO ์ ์์ ์๋ฌ ๋ฒ์ง ๊ด๋ฆฌ"
QA & Monitoring (์ธ์คํด์ค #4) - ํ์ง ๋ณด์ฆ ์ ๋ฌธ๊ฐ
QA ์ธ์คํด์ค๋ ์ํํธ์จ์ด ํ์ง์ ๋ชจ๋ ์ธก๋ฉด์ ์ฑ ์์ง๋ ์ ๋ฌธ๊ฐ์ ๋๋ค.
# Terminal 4 (QA & Monitoring)
claude "๋น์ ์ ํ์ง ๋ณด์ฆ๊ณผ ํ
์คํธ ์๋ํ ์ ๋ฌธ๊ฐ์
๋๋ค.
๋ค์ ํ์ง ์์ญ์ ๋ด๋นํด์ฃผ์ธ์
- ํ
์คํธ ํผ๋ผ๋ฏธ๋ ์ ๋ต (Unit/Integration/E2E)
- ์ฑ๋ฅ ํ
์คํธ์ ๋ถํ ํ
์คํธ (JMeter/k6)
- ๋ณด์ ํ
์คํธ์ ์ทจ์ฝ์ ์ค์บ (OWASP ZAP)
- ์ ๊ทผ์ฑ ํ
์คํธ์ ์ฌ์ฉ์ฑ ํ๊ฐ
- ๋ธ๋ผ์ฐ์ ํธํ์ฑ๊ณผ ํฌ๋ก์ค ํ๋ซํผ ํ
์คํธ
- ํ
์คํธ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ํ๊ฒฝ ๊ตฌ์ฑ
- ํ์ง ๋ฉํธ๋ฆญ ์์ง๊ณผ ๋ฆฌํฌํ
ํ์ง ๋ชฉํ: ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง 90%+
์ฑ๋ฅ ๊ธฐ์ค: ์๋ต์๊ฐ 200ms ์ดํ
๋ณด์ ์์ค: Zero known vulnerabilities"
๊ณ ๊ธ QA ์๋ํ ํจํด
# ์ง๋ฅํ ํ
์คํธ ์๋ํ
claude "AI ๊ธฐ๋ฐ ํ
์คํธ ์๋ํ ์์คํ
์ ๊ตฌ์ถํด์ค
- ์๊ฐ์ ํ๊ท ํ
์คํธ (Applitools/Percy)
- ์๋ ํ
์คํธ ์ผ์ด์ค ์์ฑ๊ณผ ์ ์ง๋ณด์
- ํ๋ ์ดํค ํ
์คํธ ํ์ง์ ํด๊ฒฐ
- ํ
์คํธ ์คํ ์ต์ ํ์ ๋ณ๋ ฌํ
- ์คํจ ๋ถ์๊ณผ ์๋ ๋ฒ๊ทธ ๋ฆฌํฌํ
"
# ํ๋ก๋์
๋ชจ๋ํฐ๋ง
claude "์ค์๊ฐ ํ์ง ๋ชจ๋ํฐ๋ง ์์คํ
์ ๊ตฌํํด์ค
- ์ค์ฌ์ฉ์ ๋ชจ๋ํฐ๋ง (RUM)
- ํฉ์ฑ ํธ๋์ญ์
๋ชจ๋ํฐ๋ง
- ์๋ฌ ์ถ์ ๊ณผ ํฌ๋์ ๋ฆฌํฌํ
- A/B ํ
์คํธ ํ๋ซํผ
- ์ฌ์ฉ์ ํผ๋๋ฐฑ ์์ง๊ณผ ๋ถ์"
์ปจํ ์คํธ ํนํ
๊ฐ ์ธ์คํด์ค์ ํนํ๋ CLAUDE.md ์ค์
frontend/CLAUDE.md
# Frontend Development Context
## ์ฃผ์ ๊ธฐ์ ์คํ
- React 18 + TypeScript
- Tailwind CSS
- React Query + Zustand
## ์ปดํฌ๋ํธ ๊ท์น
- ํจ์ํ ์ปดํฌ๋ํธ๋ง ์ฌ์ฉ
- Props๋ ์ธํฐํ์ด์ค๋ก ์ ์
- Storybook ์คํ ๋ฆฌ ํ์
## ์ฑ๋ฅ ์ต์ ํ
- React.memo ์ ๊ทน ํ์ฉ
- ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ
- ์ด๋ฏธ์ง ์ต์ ํ
backend/CLAUDE.md
# Backend Development Context
## ์ฃผ์ ๊ธฐ์ ์คํ
- Node.js + Express + TypeScript
- PostgreSQL + Prisma
- Redis for caching
## API ์ค๊ณ ์์น
- RESTful ์ค๊ณ
- ์ผ๊ด๋ ์๋ฌ ์๋ต
- Rate limiting ์ ์ฉ
## ๋ณด์ ์๊ตฌ์ฌํญ
- JWT ํ ํฐ ์ธ์ฆ
- ์
๋ ฅ ๊ฒ์ฆ ํ์
- SQL Injection ๋ฐฉ์ง
Integration Hub (์ธ์คํด์ค #5) - ์ํคํ ์ฒ ์กฐ์ ์
ํตํฉ ํ๋ธ๋ ๋ชจ๋ ์ธ์คํด์ค ๊ฐ์ ์ผ๊ด์ฑ๊ณผ ํ์ ์ ๋ณด์ฅํ๋ ์ค์ ์กฐ์ ์ญํ ์ ์ํํฉ๋๋ค.
# Terminal 5 (Integration Hub)
claude "๋น์ ์ ์์คํ
ํตํฉ๊ณผ ์ํคํ
์ฒ ์กฐ์ ์ ๋ฌธ๊ฐ์
๋๋ค.
๋ค์ ํตํฉ ์์ญ์ ๋ด๋นํด์ฃผ์ธ์
- ํฌ๋ก์ค ๋๋ฉ์ธ ์ด์ ํด๊ฒฐ๊ณผ ์์ฌ๊ฒฐ์
- ์ํคํ
์ฒ ์ผ๊ด์ฑ ๊ฒ์ฆ๊ณผ ๊ฐ์ด๋๋ผ์ธ ์ ์ฉ
- ํ ๊ฐ ์ปค๋ฎค๋์ผ์ด์
๊ณผ ์ง์ ๊ณต์
- ๊ธฐ์ ๋ถ์ฑ ๊ด๋ฆฌ์ ๋ฆฌํฉํ ๋ง ๊ณํ
- ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ๋ถ์๊ณผ ์ต์ ํ ๋ฐฉํฅ
- ํ๋ก์ ํธ ๋ก๋๋งต๊ณผ ์ฐ์ ์์ ์กฐ์
์ฑ
์ ๋ฒ์: ์ ์ฒด ์์คํ
์ํคํ
์ฒ
๋ชฉํ: ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ๊ฐ๋ฐ์ ๊ฒฝํ
์์น: ๋จ์์ฑ, ํ์ฅ์ฑ, ์ ์ง๋ณด์์ฑ"
[S2WF4(์น์ 10)] ํ๋ฌ๊ทธ์ธ & ํ์ฅ ์ํ๊ณ โ MCP ์๋ฒ ํตํฉ
11.8 ๊ณ ๊ธ ์ปค์คํฐ๋ง์ด์ ์ด์
Claude Code Action์ ์ง์ ํ ๊ฐ์น๋ ์กฐ์ง์ ํน์ํ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊น์ด ์๋ ์ปค์คํฐ๋ง์ด์ ์ด์ ์ ํตํด ์คํ๋ฉ๋๋ค. MCP(Model Context Protocol) ์๋ฒ ํตํฉ, ์ปค์คํ ๋๊ตฌ ๊ฐ๋ฐ, ๊ทธ๋ฆฌ๊ณ ์กฐ์ง๋ณ ์ํฌํ๋ก์ฐ ์ต์ ํ๋ฅผ ํตํด Claude๋ฅผ ํ์ ์ ์ฉ AI ์ด์์คํดํธ๋ก ๋ฐ์ ์ํฌ ์ ์์ต๋๋ค.
MCP ์๋ฒ ํตํฉ๊ณผ ํ์ฅ
MCP(Model Context Protocol)๋ Claude์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์กฐ์ง์ ๋ด๋ถ ์์คํ , ๋ฐ์ดํฐ๋ฒ ์ด์ค, API์์ ํตํฉ์ ํตํด Claude๊ฐ ๋ ํ๋ถํ ์ปจํ ์คํธ๋ก ์์ ํ ์ ์๊ฒ ํฉ๋๋ค.
๊ธฐ๋ณธ MCP ์๋ฒ ํตํฉ
# Sequential Thinking MCP ์๋ฒ ํตํฉ
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
mcp_config: |
{
"mcpServers": {
"sequential-thinking": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sequential-thinking"
]
}
}
}
allowed_tools: "mcp__sequential-thinking__sequentialthinking"
๊ณ ๊ธ MCP ์๋ฒ ์ค์ - ๋ด๋ถ ์์คํ ํตํฉ
# ์กฐ์ง ํนํ MCP ์๋ฒ ์ค๊ณ
claude "์ฐ๋ฆฌ ์กฐ์ง์ ์ํ ์ปค์คํ
MCP ์๋ฒ๋ค์ ์ค๊ณํด์ค.
๋ค์ ์์คํ
๊ณผ์ ํตํฉ์ด ํ์ํด
๋ด๋ถ ์์คํ
์ฐ๋
- JIRA API: ์ด์ ํธ๋ํน๊ณผ ํ๋ก์ ํธ ๊ด๋ฆฌ
- Confluence: ๋ฌธ์์ ์ง์ ๋ฒ ์ด์ค ์ ๊ทผ
- Slack API: ํ ์ปค๋ฎค๋์ผ์ด์
๊ณผ ์๋ฆผ
- Jenkins: CI/CD ํ์ดํ๋ผ์ธ ์ํ
- DataDog: ๋ชจ๋ํฐ๋ง๊ณผ ์ฑ๋ฅ ๋ฉํธ๋ฆญ
์ธ๋ถ ์๋น์ค ํตํฉ
- AWS API: ์ธํ๋ผ ์ํ์ ๋ฆฌ์์ค ๊ด๋ฆฌ
- Kubernetes API: ์ปจํ
์ด๋ ์ค์ผ์คํธ๋ ์ด์
- Database connections: ์คํค๋ง ์ ๋ณด์ ์ฟผ๋ฆฌ ์คํ
- Security scanners: ์ทจ์ฝ์ ๊ฒ์ฌ ๊ฒฐ๊ณผ
๊ฐ MCP ์๋ฒ์ ๊ตฌํ ๋ฐฉ๋ฒ๊ณผ ๋ณด์ ์ค์ ์ ํฌํจํด์ค."
์ํฐํ๋ผ์ด์ฆ MCP ์๋ฒ ๊ตฌ์ฑ ์์
# ์ข
ํฉ์ ์ธ MCP ์๋ฒ ์ค์
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
mcp_config: |
{
"mcpServers": {
"jira-integration": {
"command": "node",
"args": ["./scripts/mcp-jira-server.js"],
"env": {
"JIRA_URL": "${{ secrets.JIRA_URL }}",
"JIRA_TOKEN": "${{ secrets.JIRA_TOKEN }}",
"JIRA_PROJECT_KEY": "${{ vars.JIRA_PROJECT_KEY }}"
}
},
"database-inspector": {
"command": "python",
"args": ["./scripts/mcp-db-server.py"],
"env": {
"DB_CONNECTION_STRING": "${{ secrets.DB_READ_ONLY_CONNECTION }}",
"DB_TYPE": "postgresql"
}
},
"security-scanner": {
"command": "npx",
"args": ["-y", "@company/security-mcp-server"],
"env": {
"SCANNER_API_KEY": "${{ secrets.SECURITY_SCANNER_API_KEY }}",
"SCAN_LEVEL": "comprehensive"
}
},
"monitoring-integration": {
"command": "node",
"args": ["./scripts/mcp-monitoring-server.js"],
"env": {
"DATADOG_API_KEY": "${{ secrets.DATADOG_API_KEY }}",
"GRAFANA_URL": "${{ secrets.GRAFANA_URL }}",
"GRAFANA_TOKEN": "${{ secrets.GRAFANA_TOKEN }}"
}
}
}
}
allowed_tools: |
mcp__jira-integration__create-issue,
mcp__jira-integration__update-issue,
mcp__jira-integration__search-issues,
mcp__database-inspector__query-schema,
mcp__database-inspector__explain-query,
mcp__security-scanner__scan-code,
mcp__security-scanner__check-vulnerabilities,
mcp__monitoring-integration__get-metrics,
mcp__monitoring-integration__create-alert
์กฐ์ง๋ณ ์ปค์คํ ๋๊ตฌ ๊ฐ๋ฐ
์ฝ๋ ํ์ง ๊ฒ์ฌ ๋๊ตฌ
# ์กฐ์ง ํนํ ์ฝ๋ ํ์ง ๋๊ตฌ
claude "์ฐ๋ฆฌ ํ์ ์ฝ๋ฉ ํ์ค์ ์๋์ผ๋ก ๊ฒ์ฌํ๋ ์ปค์คํ
๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ค.
๋ค์ ๊ฒ์ฌ ํญ๋ชฉ์ ํฌํจํด์ค
์ฝ๋ฉ ํ์ค ๊ฒ์ฌ
- ํจ์ ๋ค์ด๋ฐ ๊ท์น (camelCase, ๋์ฌ๋ก ์์)
- ํ์ผ ๊ตฌ์กฐ ๊ท์น (feature/component ๊ธฐ๋ฐ)
- ์ฝ๋ฉํธ ์์ฑ ๊ท์น (JSDoc, docstring)
- ์๋ฌ ์ฒ๋ฆฌ ํจํด ์ผ๊ด์ฑ
- ๋ก๊น
ํ์ ํ์คํ
์ฑ๋ฅ ๊ฒ์ฌ
- ๋ฉ๋ชจ๋ฆฌ ๋์ ํจํด ๊ฐ์ง
- ๋นํจ์จ์ ์ธ ๋ฃจํ์ ์ฟผ๋ฆฌ
- ๋ถํ์ํ ๋ ๋๋ง ๊ฐ์ง
- ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ ๊ธฐํ
๋ณด์ ๊ฒ์ฌ
- ํ๋์ฝ๋ฉ๋ ์ํฌ๋ฆฟ ํ์ง
- SQL ์ธ์ ์
์ทจ์ฝ์
- XSS ๊ณต๊ฒฉ ๋ฒกํฐ
- ๊ถํ ๋ถ์ฌ ๋๋ฝ"
์๋ ๋ฌธ์ํ ๋๊ตฌ
# ์ปค์คํ
๋ฌธ์ํ ์๋ํ
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
custom_instructions: |
๋น์ ์ ์ฐ๋ฆฌ ์กฐ์ง์ ๋ฌธ์ํ ์ ๋ฌธ๊ฐ์
๋๋ค.
๋ค์ ๋ฌธ์ํ ํ์ค์ ์ค์ํด์ฃผ์ธ์
API ๋ฌธ์ํ
- OpenAPI 3.0 ์คํ ์ค์
- ์์ฒญ/์๋ต ์์ ํฌํจ
- ์๋ฌ ์ฝ๋์ ๋ฉ์์ง ์ค๋ช
- ๋ฒ์ ๊ด๋ฆฌ ์ ๋ณด
์ฝ๋ ๋ฌธ์ํ
- ํจ์๋ณ JSDoc/docstring
- ๋ณต์กํ ๋ก์ง ์ธ๋ผ์ธ ์ฃผ์
- README ์
๋ฐ์ดํธ
- ์ํคํ
์ฒ ๋ค์ด์ด๊ทธ๋จ
์ฌ์ฉ์ ๋ฌธ์ํ
- ์ค์น์ ์ค์ ๊ฐ์ด๋
- ์ฌ์ฉ ์์์ ํํ ๋ฆฌ์ผ
- ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋
- FAQ ์น์
allowed_tools: |
Edit,Replace,GitLog,GitDiff,
mcp__docs-generator__create-api-docs,
mcp__docs-generator__update-readme,
mcp__docs-generator__generate-diagrams
์ํฌํ๋ก์ฐ ์ต์ ํ์ ์๋ํ
์ง๋ฅํ ์ํฌํ๋ก์ฐ ๋ผ์ฐํ
# ์ปจํ
์คํธ ๊ธฐ๋ฐ ์ํฌํ๋ก์ฐ ์๋ํ
claude "PR ๋ด์ฉ์ ๋ถ์ํด์ ์๋์ผ๋ก ์ ์ ํ ์ํฌํ๋ก์ฐ๋ฅผ ์ ํํ๋ ์์คํ
์ ๋ง๋ค์ด์ค.
๋ค์ ๋ถ๋ฅ ๊ธฐ์ค์ ์ฌ์ฉํด์ค
๋ณ๊ฒฝ ์ ํ ๋ถ์
- ๊ธฐ๋ฅ ์ถ๊ฐ (feature): ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ
- ๋ฒ๊ทธ ์์ (bugfix): ๊ธฐ์กด ๊ธฐ๋ฅ ์ค๋ฅ ์์
- ๋ฆฌํฉํ ๋ง (refactor): ์ฝ๋ ๊ตฌ์กฐ ๊ฐ์
- ๋ฌธ์ํ (docs): ๋ฌธ์ ์
๋ฐ์ดํธ
- ์ค์ (config): ์ค์ ํ์ผ ๋ณ๊ฒฝ
- ํ
์คํธ (test): ํ
์คํธ ์ฝ๋ ๊ด๋ จ
์ํฅ๋ ๋ถ์
- Critical: ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง ๋ณ๊ฒฝ
- High: ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ํฅ
- Medium: ๋ด๋ถ ๋ก์ง ๊ฐ์
- Low: ๋ฌธ์๋ ์ฃผ์ ์
๋ฐ์ดํธ
๊ฐ ๋ถ๋ฅ์ ๋ฐ๋ฅธ ์๋ํ ์ํฌํ๋ก์ฐ
- ํ์ํ ๋ฆฌ๋ทฐ์ด ์๋ ํ ๋น
- ์ ์ ํ ํ
์คํธ ์ ๋ต ์ ํ
- ๋ฐฐํฌ ์น์ธ ํ๋ก์ธ์ค ๊ฒฐ์
- ๋ชจ๋ํฐ๋ง ์์ค ์ค์ "
๋์ ํ์ง ๊ฒ์ดํธ
# ์ง๋ฅํ ํ์ง ๊ฒ์ดํธ ์์คํ
name: Adaptive Quality Gates
on:
pull_request:
types: [opened, synchronize]
jobs:
analyze-changes:
runs-on: ubuntu-latest
outputs:
risk_level: ${{ steps.analysis.outputs.risk_level }}
test_strategy: ${{ steps.analysis.outputs.test_strategy }}
review_requirements: ${{ steps.analysis.outputs.review_requirements }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: anthropics/claude-code-action@beta
id: analysis
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
direct_prompt: |
์ด PR์ ๋ณ๊ฒฝ์ฌํญ์ ๋ถ์ํ๊ณ ๋ค์์ ๊ฒฐ์ ํด์ฃผ์ธ์
1. ์ํ๋ ํ๊ฐ (low/medium/high/critical)
2. ํ์ํ ํ
์คํธ ์ ๋ต (unit/integration/e2e/performance)
3. ๋ฆฌ๋ทฐ ์๊ตฌ์ฌํญ (standard/senior/architect/security)
๋ถ์ ๊ธฐ์ค
- ๋ณ๊ฒฝ๋ ํ์ผ์ ์์ ์ค์๋
- ๋น์ฆ๋์ค ๋ก์ง ๋ณ๊ฒฝ ์ฌ๋ถ
- ๋ณด์ ๊ด๋ จ ์ฝ๋ ์์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ
- API ์ธํฐํ์ด์ค ๋ณ๊ฒฝ
- ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ ๋ณ๊ฒฝ
๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํ์์ผ๋ก GitHub Actions output์ ์ค์ ํด์ฃผ์ธ์
echo "risk_level=medium" >> $GITHUB_OUTPUT
echo "test_strategy=integration,e2e" >> $GITHUB_OUTPUT
echo "review_requirements=senior,security" >> $GITHUB_OUTPUT
quality-gate-low:
needs: analyze-changes
if: needs.analyze-changes.outputs.risk_level == 'low'
runs-on: ubuntu-latest
steps:
- name: Fast Track Review
run: echo "Low risk changes - fast track approved"
quality-gate-high:
needs: analyze-changes
if: contains(fromJson('["high", "critical"]'), needs.analyze-changes.outputs.risk_level)
runs-on: ubuntu-latest
steps:
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
direct_prompt: |
์ด๋ ๋์ ์ํ๋์ ๋ณ๊ฒฝ์ฌํญ์
๋๋ค.
๋ค์ ๊ฐํ๋ ๊ฒํ ๋ฅผ ์ํํด์ฃผ์ธ์
1. ์ธ๋ถ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ
2. ๋ณด์ ์ทจ์ฝ์ ์ ์ฒด ๊ฒ์ฌ
3. ์ฑ๋ฅ ์ํฅ ๋ถ์
4. ๋กค๋ฐฑ ๊ณํ ์๋ฆฝ
5. ๋ชจ๋ํฐ๋ง ๊ณํ ์ ์
์ถ๊ฐ๋ก ๋ค์ ํ๋ค์ ๋ฆฌ๋ทฐ์ ํฌํจ์์ผ์ฃผ์ธ์
@security-team @architecture-team @senior-engineers
[S2TO2] Asana ์ฐ๋ โ ํ๋ก์ ํธ ๊ด๋ฆฌ ํตํฉ
- asana ์ธ๋ถ ํ๋ฌ๊ทธ์ธ: Asana ํ์คํฌ ์กฐํ/์์ฑ/์ ๋ฐ์ดํธ๋ฅผ Claude Code์์ ์ง์ ์ํ
- ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ๋ฅผ ํ๋๋ก ํตํฉ
[S2TO3] Linear ์ฐ๋ โ ์ด์ ๊ด๋ฆฌ ํตํฉ
- linear ์ธ๋ถ ํ๋ฌ๊ทธ์ธ: Linear ์ด์ ๊ด๋ฆฌ๋ฅผ Claude Code์์ ์ง์ ์ฐ๋
- ์ด์ ์์ฑ, ์ํ ๋ณ๊ฒฝ, ์ฝ๋ฉํธ ์ถ๊ฐ๋ฅผ ์ฝ๋ฉ ์์ ์ค ์๋ ์ํ
[S2TO4] Firebase ์ฐ๋ โ BaaS ํตํฉ
- firebase ์ธ๋ถ ํ๋ฌ๊ทธ์ธ: Firebase Auth, Firestore, Cloud Functions ์ฐ๋
- BaaS(Backend as a Service) ๊ธฐ๋ฐ ํ๋ก์ ํธ์์ ๋ฐฑ์๋ ์์ ์๋ํ
[S2TO5] Context7 โ ๋ฌธ๋งฅ ๊ด๋ฆฌ ๋๊ตฌ
- context7 ์ธ๋ถ ํ๋ฌ๊ทธ์ธ: ํ๋ก์ ํธ ๋ฌธ๋งฅ(context) ๊ด๋ฆฌ ๋ฐ ๊ณต์ ๋๊ตฌ
- ํ์ ๊ฐ ์์ ๋งฅ๋ฝ ์ ๋ฌ, ์ธ์ ๊ฐ ์ปจํ ์คํธ ์ง์์ฑ ๊ฐํ
[S2TO6] Books 1๊ถ โ ์ค๊ธ ํ์ด์ฉ ํ์ต
- 1๊ถ 20ํธ: Subagents โ ์๋ธ์์ด์ ํธ ๋ณ๋ ฌ ๊ฐ๋ฐ ์ค์ ํจํด
- 1๊ถ 22ํธ: MCP โ MCP ์๋ฒ ์ค์ ์ฐ๋ ๋ฐ ํ์ฉ
- 1๊ถ 27ํธ: GitHub Actions์ Agent SDK โ GitHub Actions ์๋ํ ์ค์
- 1๊ถ 30ํธ: ๋ณตํฉ AI ํ์ฉ ์ ๋ต โ ๋ฉํฐ AI ํ์ ์ค์ ํจํด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S2TO7] ์ค์ Tips โ Multi-Role/์๋ธ์์ด์ ํธ/MCP ์ค๊ธ
๋๊ตฌ_ํ์ฉ/Multi-Role_AI_์์คํ ๊ณผ_Multi-Agent_์์คํ _๋น๊ต.mdโ ์์คํ ์ํคํ ์ฒ ์ค์ ๋น๊ต๋๊ตฌ_ํ์ฉ/์๋ธ์์ด์ ํธ_ํจ๊ณผ์ ์ผ๋ก_ํ์ฉํ๊ธฐ.mdโ ์๋ธ์์ด์ ํธ ์ค์ ํ์ฉ ๊ณ ๊ธ ํจํด๋๊ตฌ_ํ์ฉ/MCP_์๋ฒ_์ค์ ๊ณผ_ํ์ฉ.mdโ MCP ์๋ฒ ์ค์ ์ค์
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/๋๊ตฌ_ํ์ฉ/
[S2TO8] .claude ์ฐธ๊ณ โ Subagents/Skills ์ค๊ธ
- subagents: ์ค์ ํ์ฉ ์ฃผ์ ์์ด์ ํธ โ
backend-developer,frontend-developer,code-reviewer,test-engineer,debugger - skills: ์ค์ ํ์ฉ ์ฃผ์ ์คํฌ โ
fullstack-dev,api-builder,test-runner,deployment
๐ ๊ฒฝ๋ก:.claude/subagents/,.claude/skills/
S2QC โ ํ์ง๊ด๋ฆฌ (Quality Control)
[S2QC1(์น์ 11)] ๋ณด์ ์ํ & ์ฒดํฌ๋ฆฌ์คํธ
10.8 ๋ณด์ ๊ฐํ
๋ณด์์ ํ์ ๋๊ตฌ์์ ๊ฐ์ฅ ์ค์ํ ์์ ์ค ํ๋์ ๋๋ค. ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ณดํธ, ์ธ์ฆ/์ธ๊ฐ ์์คํ , ์ ์ฑ ๊ณต๊ฒฉ ๋ฐฉ์ง๋ฅผ ํตํด ์ ๋ขฐํ ์ ์๋ ์๋น์ค๋ฅผ ๊ตฌ์ถํด์ผ ํฉ๋๋ค.
์ธ์ฆ/์ธ๊ฐ ๋ณด์
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๋ค์ธต์ ๋ฐฉ์ด ์ฒด๊ณ๋ฅผ ํตํด ๊ตฌ์ถ๋์ด์ผ ํฉ๋๋ค. ๊ฐ๊ฐ์ ๋ณด์ ์ํ์ ๋ํด ์ ์ ํ ๋์์ฑ ์ ๋ง๋ จํ์ฌ ์์คํ ์ ์ ๋ฐ์ ์ธ ๋ณด์ ์์ค์ ํฅ์์ํต๋๋ค.
claude "๋ณด์์ ๊ฐํํด์ค.
CSRF ๋ฐฉ์ง, Rate limiting,
์
๋ ฅ ๊ฒ์ฆ, SQL Injection ๋ฐฉ์ง,
XSS ๋ฐฉ์ง๋ฅผ ๊ตฌํํด์ค"
ํต์ฌ ๋ณด์ ์์
- CSRF ๋ฐฉ์ง: ํฌ๋ก์ค ์ฌ์ดํธ ์์ฒญ ์์กฐ ๊ณต๊ฒฉ ์ฐจ๋จ
- Rate Limiting: ๋ฌด์ฐจ๋ณ ๋์ ๊ณต๊ฒฉ๊ณผ DDoS ๊ณต๊ฒฉ ๋ฐฉ์ง
- ์ ๋ ฅ ๊ฒ์ฆ: ๋ชจ๋ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ํ ์๊ฒฉํ ๊ฒ์ฆ๊ณผ ์ ์
- SQL Injection ๋ฐฉ์ง: ๋งค๊ฐ๋ณ์ํ๋ ์ฟผ๋ฆฌ์ ORM ํ์ฉ
- XSS ๋ฐฉ์ง: ์ถ๋ ฅ ์ธ์ฝ๋ฉ๊ณผ ์ฝํ ์ธ ๋ณด์ ์ ์ฑ ์ ์ฉ
์ถ๊ฐ ๋ณด์ ๊ณ ๋ ค์ฌํญ
- HTTPS ๊ฐ์ : ๋ชจ๋ ํต์ ์ ์ํธํ ์ ์ฉ
- ์ธ์ ๊ด๋ฆฌ: ์์ ํ ์ธ์ ์์ฑ๊ณผ ๋ง๋ฃ ์ฒ๋ฆฌ
- ๊ถํ ๋ถ๋ฆฌ: ์ต์ ๊ถํ ์์น๊ณผ ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด
- ๋ณด์ ํค๋: HSTS, X-Frame-Options ๋ฑ ๋ณด์ ํค๋ ์ค์
์ค์๊ฐ ํต์ ๋ณด์
์ค์๊ฐ ํต์ ์ ์ง์์ ์ธ ์ฐ๊ฒฐ๊ณผ ๋น๋ฒํ ๋ฐ์ดํฐ ๊ตํ์ผ๋ก ์ธํด ํน๋ณํ ๋ณด์ ๊ณ ๋ ค์ฌํญ์ด ํ์ํฉ๋๋ค. ์ฐ๊ฒฐ ์ธ์ฆ, ๋ฉ์์ง ๊ฒ์ฆ, ์ ์ฉ ๋ฐฉ์ง๋ฅผ ํตํด ์์ ํ ์ค์๊ฐ ํ๊ฒฝ์ ๊ตฌ์ถํฉ๋๋ค.
claude "Socket.io ๋ณด์์ ๊ฐํํด์ค.
๋ค์์คํ์ด์ค๋ณ ๊ถํ ๊ฒ์ฌ, ๋ฉ์์ง ๊ฒ์ฆ,
์คํธ ๋ฐฉ์ง, ์
์ฑ ์ฌ์ฉ์ ์ฐจ๋จ์ ๊ตฌํํด์ค"
์ค์๊ฐ ํต์ ๋ณด์ ์ ๋ต
- ์ฐ๊ฒฐ ์ธ์ฆ: Socket.io ์ฐ๊ฒฐ ์ JWT ํ ํฐ ๊ฒ์ฆ
- ๊ถํ ๊ฒ์ฌ: ๋ค์์คํ์ด์ค์ ๋ฃธ๋ณ ์ ๊ทผ ๊ถํ ํ์ธ
- ๋ฉ์์ง ๊ฒ์ฆ: ์ค์๊ฐ ๋ฉ์์ง์ ํ์๊ณผ ๋ด์ฉ ๊ฒ์ฆ
- ์คํธ ๋ฐฉ์ง: ๋ฉ์์ง ๋น๋ ์ ํ๊ณผ ํจํด ๋ถ์
- ์ ์ฑ ์ฌ์ฉ์ ์ฐจ๋จ: ์ค์๊ฐ ๋ชจ๋ํฐ๋ง๊ณผ ์๋ ์ฐจ๋จ ์์คํ
11.6 ๋ณด์๊ณผ ๊ถํ ๊ด๋ฆฌ
Claude Code Action์ ์์ ํ๊ฒ ์ด์ํ๊ธฐ ์ํด์๋ ์ฒ ์ ํ ๋ณด์ ์ค๊ณ์ ๊ถํ ๊ด๋ฆฌ๊ฐ ํ์์ ๋๋ค. ํนํ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์๋ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ๋ณดํธ, ์ ๊ทผ ์ ์ด, ๊ฐ์ฌ ์ถ์ ์ด ์ค์ํ ์๊ตฌ์ฌํญ์ ๋๋ค.
API ํค ๋ณด์๊ณผ ์ํฌ๋ฆฟ ๊ด๋ฆฌ
๊ณ์ธตํ๋ ์ํฌ๋ฆฟ ๊ด๋ฆฌ ์ ๋ต
# ์ํฐํ๋ผ์ด์ฆ ์ํฌ๋ฆฟ ๊ด๋ฆฌ ์ ๋ต
claude "Claude Code Action์ ์ํ ํฌ๊ด์ ์ธ ์ํฌ๋ฆฟ ๊ด๋ฆฌ ์ ๋ต์ ์ค๊ณํด์ค.
๋ค์ ์์๋ฅผ ํฌํจํด์ค
์ํฌ๋ฆฟ ๊ณ์ธต ๊ตฌ์กฐ
- Organization level secrets (์ ์ฌ ๊ณตํต)
- Repository level secrets (ํ๋ก์ ํธ๋ณ)
- Environment level secrets (ํ๊ฒฝ๋ณ)
๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก
- ์ํฌ๋ฆฟ ๋กํ
์ด์
์ ์ฑ
(30-90์ผ)
- ์ ๊ทผ ๊ถํ ์ต์ํ ์์น
- ์ํธํ์ ์ ์ก ๋ณด์
- ๊ฐ์ฌ ๋ก๊ทธ์ ๋ชจ๋ํฐ๋ง
- ์ฌ๊ณ ๋์ ์ ์ฐจ
๊ท์ ์ค์
- SOC 2 Type II ์๊ตฌ์ฌํญ
- GDPR ๊ฐ์ธ์ ๋ณด ๋ณดํธ
- HIPAA ๋ณด๊ฑด์๋ฃ ๊ท์
- ์
๊ณ๋ณ ํน์ ์๊ตฌ์ฌํญ"
API ํค ๋ณด์ ๊ฐํ
# ๊ณ ๊ธ ์ํฌ๋ฆฟ ๋ณด์ ์ค์
name: Secure Claude Action
on:
issue_comment:
types: [created]
jobs:
security-validation:
runs-on: ubuntu-latest
environment: production
steps:
- name: API Key Validation
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
run: |
# API ํค ํ์ ๊ฒ์ฆ
if [[ ! "$ANTHROPIC_API_KEY" =~ ^sk-ant-api03- ]]; then
echo "Invalid API key format"
exit 1
fi
# API ํค ํ์ฑํ ์ํ ํ์ธ
response=$(curl -s -H "x-api-key: $ANTHROPIC_API_KEY" \
https://api.anthropic.com/v1/models)
if [[ $? -ne 0 ]]; then
echo "API key validation failed"
exit 1
fi
- name: Rate Limiting Check
run: |
# API ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง
echo "Checking current API usage..."
# ์ฌ์ฉ๋์ด ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ์ค๋จ
- name: Security Context Validation
run: |
# ์์ฒญ์ ๊ถํ ํ์ธ
if [[ "${{ github.actor }}" == "dependabot[bot]" ]]; then
echo "Bot users not allowed"
exit 1
fi
# ๋ฏผ๊ฐํ ํ์ผ ๋ณ๊ฒฝ ๊ฐ์ง
if git diff --name-only | grep -E "(secrets|keys|config)" > /dev/null; then
echo "Sensitive files detected - additional approval required"
# ์ถ๊ฐ ์น์ธ ํ๋ก์ธ์ค ํธ๋ฆฌ๊ฑฐ
fi
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
timeout_minutes: 30 # ์คํ ์๊ฐ ์ ํ
disallowed_tools: "WebFetch,FileDelete,Bash(rm),Bash(curl)"
์ ๊ทผ ์ ์ด์ ๊ถํ ์ต์ํ
์ธ๋ฐํ ๊ถํ ์ ์ด ์์คํ
# ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด (RBAC) ์ค๊ณ
claude "Claude Code Action์ ์ํ RBAC ์์คํ
์ ์ค๊ณํด์ค.
๋ค์ ์ญํ ๊ณผ ๊ถํ์ ์ ์ํด์ค
์ญํ ์ ์
- Admin: ์ ์ฒด ์ค์ ๊ณผ ์ํฌ๋ฆฟ ๊ด๋ฆฌ
- Senior Developer: ๋ชจ๋ ์ฝ๋ ๋ณ๊ฒฝ ๊ถํ
- Developer: ์ ํ๋ ์ฝ๋ ๋ณ๊ฒฝ ๊ถํ
- Reviewer: ์ฝ๊ธฐ ์ ์ฉ ๋ฆฌ๋ทฐ ๊ถํ
- External Contributor: ์ต์ํ์ ์ํธ์์ฉ
๊ถํ ๋งคํธ๋ฆญ์ค
- ํ์ผ ์ฝ๊ธฐ/์ฐ๊ธฐ ๊ถํ
- ๋ธ๋์น๋ณ ์ ๊ทผ ์ ์ด
- ๋ฏผ๊ฐํ ๋๋ ํ ๋ฆฌ ๋ณดํธ
- ์์คํ
๋ช
๋ น์ด ์คํ ๊ถํ
- ์ธ๋ถ API ํธ์ถ ๊ถํ
๊ตฌํ ๋ฐฉ๋ฒ
- GitHub Team ๊ธฐ๋ฐ ๊ถํ ๋งคํ
- ๋์ ๊ถํ ๊ฒ์ฆ ๋ก์ง
- ๊ฐ์ฌ ๋ก๊ทธ ์๋ ์์ฑ
- ๊ถํ ์์ค์ปฌ๋ ์ด์
ํ๋ก์ธ์ค"
๋ฏผ๊ฐํ ํ์ผ๊ณผ ๋ฐ์ดํฐ ๋ณดํธ
# ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ๋ณดํธ ์ค์
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
# ์ ๊ทผ ๊ธ์ง ํ์ผ ํจํด
disallowed_paths: |
- "**/.env*"
- "**/secrets/**"
- "**/keys/**"
- "**/*password*"
- "**/*secret*"
- "**/config/production.yaml"
# ํ์ฉ๋ ๋๊ตฌ๋ง ์ฌ์ฉ
allowed_tools: "Edit,Replace,GitLog,GitDiff"
disallowed_tools: "Bash,WebFetch,FileDelete,NetworkAccess"
# ์ปค์คํ
๋ณด์ ์ง์นจ
custom_instructions: |
๋ณด์ ์ง์นจ
1. ์ ๋๋ก ์ํฌ๋ฆฟ์ด๋ ํจ์ค์๋๋ฅผ ์ฝ๋์ ํ๋์ฝ๋ฉํ์ง ๋ง์ธ์
2. ๋ชจ๋ ์ธ๋ถ ์
๋ ฅ์ ๊ฒ์ฆํด์ผ ํฉ๋๋ค.
3. ๋ฏผ๊ฐํ ์ ๋ณด๋ ๋ก๊ทธ์ ๋จ๊ธฐ์ง ๋ง์ธ์
4. ๋ณด์ ๊ด๋ จ ๋ณ๊ฒฝ์ฌํญ์ ๋ณ๋ ์น์ธ์ด ํ์ํฉ๋๋ค.
5. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ ๋ณด๋ ํ๊ฒฝ ๋ณ์๋ก๋ง ๊ด๋ฆฌํ์ธ์
๊ฐ์ฌ์ ๋ชจ๋ํฐ๋ง
ํฌ๊ด์ ์ธ ๊ฐ์ฌ ์ถ์ ์์คํ
# ๊ฐ์ฌ ๋ก๊ทธ ์์คํ
์ค๊ณ
claude "Claude Code Action์ ๋ชจ๋ ํ๋์ ์ถ์ ํ๋ ๊ฐ์ฌ ์์คํ
์ ์ค๊ณํด์ค.
๋ค์ ์์๋ฅผ ํฌํจํด์ค
๋ก๊ทธ ์์ง ๋์
- ๋ชจ๋ API ํธ์ถ๊ณผ ์๋ต
- ํ์ผ ๋ณ๊ฒฝ๊ณผ ์ปค๋ฐ ๋ด์ญ
- ๊ถํ ์์ฒญ๊ณผ ์น์ธ/๊ฑฐ๋ถ
- ์๋ฌ์ ์์ธ ์ํฉ
- ์ฑ๋ฅ๊ณผ ๋ฆฌ์์ค ์ฌ์ฉ๋
๋ก๊ทธ ํ์๊ณผ ๊ตฌ์กฐ
- ๊ตฌ์กฐํ๋ JSON ๋ก๊ทธ
- ํ์์คํฌํ์ ์๊ด๊ด๊ณ ID
- ์ฌ์ฉ์์ ์ก์
์ปจํ
์คํธ
- ๋น์ฆ๋์ค ์ํฅ๋ ๋ถ๋ฅ
- ๋ณด์ ์ด๋ฒคํธ ๋งํน
์ ์ฅ๊ณผ ๋ถ์
- ์ค์ํ๋ ๋ก๊ทธ ์์ง (ELK Stack)
- ์ค์๊ฐ ์๋ฆผ๊ณผ ๋์๋ณด๋
- ์ด์ ํจํด ์๋ ๊ฐ์ง
- ๊ท์ ์ค์ ๋ฆฌํฌํ
- ์ฅ๊ธฐ ๋ณด์กด ์ ์ฑ
"
์ค์๊ฐ ๋ณด์ ๋ชจ๋ํฐ๋ง
# ๋ณด์ ๋ชจ๋ํฐ๋ง ์ํฌํ๋ก์ฐ
name: Security Monitoring
on:
workflow_run:
workflows: ["Claude AI Assistant"]
types: [completed]
jobs:
security-audit:
runs-on: ubuntu-latest
steps:
- name: Audit Log Collection
run: |
# Claude Action ์คํ ๋ก๊ทธ ์์ง
echo "Collecting audit logs..."
# ๋ณด์ ์ด๋ฒคํธ ๊ฐ์ง
if grep -i "security\|password\|secret" $GITHUB_EVENT_PATH; then
echo "Security-related activity detected"
# ์๋ฆผ ๋ฐ์ก
fi
- name: Anomaly Detection
run: |
# ๋น์ ์์ ์ธ ํจํด ๊ฐ์ง
# - ๋น์ ์์ ์ผ๋ก ๋ง์ ํ์ผ ๋ณ๊ฒฝ
# - ๋ฏผ๊ฐํ ํ์ผ์ ๋ํ ์ ๊ทผ ์๋
# - ํ์์ ๋ค๋ฅธ ์๊ฐ๋์ ํ๋
- name: Compliance Reporting
run: |
# ๊ท์ ์ค์ ๋ฆฌํฌํธ ์์ฑ
echo "Generating compliance report..."
- security-guidance ํ๋ฌ๊ทธ์ธ: ๋ณด์ ๊ฐ์ด๋๋ผ์ธ ์๋ ์ ์ฉ โ OWASP Top 10 ์ฒดํฌ ํฌํจ
[S2QC2(์น์ 13b)] Git ์ ๋ต โ ์ปค๋ฐ & ๋ธ๋์น
๋ธ๋์น ์ ๋ต
์ฒด๊ณ์ ์ธ Git ๋ธ๋์น ๊ด๋ฆฌ๋ฅผ ์ํ ์ ๋ต๊ณผ ๊ท์น์ ์ ์ํฉ๋๋ค. Git Flow๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ค์ฉ์ ์ธ ๋ธ๋์น ์ ๋ต์ ์๊ฐํฉ๋๋ค.
Git ๋ธ๋์น ์ ๋ต
๋ธ๋์น ๋ช ๋ช ๊ท์น
- feature/๊ธฐ๋ฅ๋ช : ์ ๊ธฐ๋ฅ ๊ฐ๋ฐ
- fix/์ด์๋ฒํธ: ๋ฒ๊ทธ ์์
- hotfix/์ค๋ช : ๊ธด๊ธ ์์
- refactor/๋์: ๋ฆฌํฉํ ๋ง
๋ธ๋์น ํ๋ก์ฐ
main
โโโ develop
โ โโโ feature/user-auth
โ โโโ feature/payment
โ โโโ fix/123
โโโ hotfix/critical-bug
๋จธ์ง ์ ๋ต
- feature โ develop: Squash merge
- develop โ main: Merge commit
- hotfix โ main: Cherry-pick
### 4๋จ๊ณ: Commit (์ปค๋ฐ)
**์ฝ๋ ๊ฒ์ฆ**
```bash
# ์๋ ๊ฒ์ฆ
claude "์ปค๋ฐํ๊ธฐ ์ ์ ๋ค์์ ํ์ธํด์ค
- ๋ชจ๋ ํ
์คํธ ํต๊ณผ
- ๋ฆฐํ
๊ท์น ์ค์
- ํ์
์ฒดํฌ ํต๊ณผ
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ํ์ธ"
# ์ปค๋ฐ ๋ฉ์์ง ์์ฑ
claude "๋ณ๊ฒฝ์ฌํญ์ ๋ถ์ํด์ ์๋ฏธ ์๋ ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํด์ค.
conventional commits ํ์์ ๋ฐ๋ฅด๊ณ ,
๋ณ๊ฒฝ ์ด์ ์ ์ํฅ์ ๋ช
ํํ ์ค๋ช
ํด์ค"
[S2QC3(์น์ 22)] ๋๋ฒ๊น ๋ง์คํฐ ์ ๋ต
3.4 ํ ์คํธ ์คํ๊ณผ ๋๋ฒ๊น
ํ ์คํธ ์์ฑ
ํ์ง ๋์ ์ํํธ์จ์ด๋ฅผ ์ํ ์ฒด๊ณ์ ์ธ ํ ์คํธ ์์ฑ ๋ฐฉ๋ฒ์ ๋๋ค.
# ๋จ์ ํ
์คํธ
claude "calculateDiscount ํจ์์ ๋ํ ๋จ์ ํ
์คํธ๋ฅผ ์์ฑํด์ค"
# ํตํฉ ํ
์คํธ
claude "์ฌ์ฉ์ ๋ฑ๋ก API์ ๋ํ ํตํฉ ํ
์คํธ๋ฅผ ์์ฑํด์ค"
# ์ฃ์ง ์ผ์ด์ค
claude "์ด ํจ์์ ์ฃ์ง ์ผ์ด์ค๋ฅผ ์ฐพ์์ ํ
์คํธ๋ฅผ ์ถ๊ฐํด์ค"
# ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง
claude "ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ์ธํ๊ณ ๋๋ฝ๋ ๋ถ๋ถ์ ํ
์คํธ๋ฅผ ์ถ๊ฐํด์ค"
๋๋ฒ๊น ์ ๋ต
๋ฌธ์ ๋ฐ์ ์ ํจ๊ณผ์ ์ผ๋ก ์์ธ์ ํ์ ํ๊ณ ํด๊ฒฐํ๋ ์ฒด๊ณ์ ์ธ ์ ๊ทผ๋ฒ์ ๋๋ค.
1. ์ค๋ฅ ๋ฉ์์ง ๋ถ์
claude "์ด ์ค๋ฅ ๋ฉ์์ง๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์ค๋ช
ํ๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์ํด์ค
TypeError: Cannot read property 'name' of undefined"
2. ๋ก๊ทธ ์ถ๊ฐ
claude "๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ ๋ถ๋ถ์ ๋๋ฒ๊ทธ ๋ก๊ทธ๋ฅผ ์ถ๊ฐํด์ค"
3. ๋จ๊ณ๋ณ ์ถ์
claude "์ด ํจ์์ ์คํ ํ๋ฆ์ ๋จ๊ณ๋ณ๋ก ์ถ์ ํ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ ํด์ค"
4. ์ฑ๋ฅ ๋ถ์
claude "์ด ์ฝ๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ์ง์ ์ ์ฐพ์์ ์ต์ ํํด์ค"
์ค์๊ฐ ๋๋ฒ๊น ์ธ์
๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ํํ์ผ๋ก ํด๊ฒฐํ๋ ๊ณผ์ ์ ์์์ ๋๋ค. ์ค์ ๋๋ฒ๊น ์๋๋ฆฌ์ค๋ฅผ ํตํด Claude Code์์ ํจ๊ณผ์ ์ธ ํ์ ๋ฐฉ๋ฒ์ ์์๋ด ์๋ค.
์๋๋ฆฌ์ค 1: ์๋ฒ ์์ ์ค๋ฅ ํด๊ฒฐ
# ๋ํํ ๋๋ฒ๊น
์์
claude
> ์๋ฒ๊ฐ ์์๋์ง ์์. ํฌํธ 3000์์ ์ด๋ฏธ ์ฌ์ฉ ์ค์ด๋ผ๋ ์ค๋ฅ๊ฐ ๋์.
< ํฌํธ 3000์ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค๋ฅผ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค. ๋ค์ ๋ช
๋ น์ ์คํํด๋๋ฆด๊ฒ์
lsof -i :3000
> ํ์ธํ๋๋ ์ด์ ์ ์คํํ node ํ๋ก์ธ์ค๊ฐ PID 12345๋ก ์คํ ์ค์ด์ผ.
< ํด๋น ํ๋ก์ธ์ค๋ฅผ ์์ ํ๊ฒ ์ข
๋ฃํ๊ณ , ํฅํ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด๋๋ฆฌ๊ฒ ์ต๋๋ค.
1. ํ๋ก์ธ์ค ์ข
๋ฃ ์คํฌ๋ฆฝํธ ์์ฑ
2. package.json์ ์ฌ์์ ์คํฌ๋ฆฝํธ ์ถ๊ฐ
3. graceful shutdown ์ฝ๋ ๊ตฌํ
> ์ข์, ์งํํด์ค. ๊ทธ๋ฆฌ๊ณ ์ ์๋ฒ๊ฐ ์ ๋๋ก ์ข
๋ฃ๋์ง ์์๋์ง๋ ์๊ณ ์ถ์ด.
< ์๋ฒ ์ฝ๋๋ฅผ ๋ถ์ํด๋ณด๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
1. SIGTERM ์๊ทธ๋ ํธ๋ค๋ฌ๊ฐ ์์ด์ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ข
๋ฃ๋จ
2. ํ์ฑ ์ฐ๊ฒฐ์ด ์ ๋ฆฌ๋์ง ์๊ณ ์์
3. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ์ด ๋ซํ์ง ์์
์ด์ ์ด ๋ฌธ์ ๋ค์ ํ๋์ฉ ํด๊ฒฐํด๋๋ฆฌ๊ฒ ์ต๋๋ค...
์๋๋ฆฌ์ค 2: ๋ฉ๋ชจ๋ฆฌ ๋์ ์ถ์
claude
> ์๋ฒ๊ฐ ๋ฉฐ์น ๋์ ์คํ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๊ณ์ ์ฆ๊ฐํด. ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์๋ ๊ฒ ๊ฐ์.
< ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ค์ ๋จ๊ณ๋ก ์งํํ๊ฒ ์ต๋๋ค.
1. ํ์ฌ ์ฝ๋์์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ๋ฅ์ฑ์ด ์๋ ํจํด ๊ฒ์
2. ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ ์ค์
3. ์์ฌ๋๋ ์ฝ๋ ์์ญ์ ๋ชจ๋ํฐ๋ง ์ถ๊ฐ
> ์ด๋ค ํจํด๋ค์ด ์ํํ๊ฐ?
< ๋ค์๊ณผ ๊ฐ์ ํจํด๋ค์ ๋ฐ๊ฒฌํ์ต๋๋ค.
- ์ด๋ฒคํธ ๋ฆฌ์ค๋๊ฐ ์ ๊ฑฐ๋์ง ์๋ ๊ณณ 3๊ฐ
- ์ ์ญ ๋ณ์์ ๊ณ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ ์บ์
- ์ํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฐ์ฒด ๊ตฌ์กฐ
๊ฐ๊ฐ ์์ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆด๊น์?
7.4 ๋ฆฌํฉํ ๋ง๊ณผ ์ฝ๋ ํ์ง ๊ฐ์
๋ฆฌํฉํ ๋ง์ ์ฝ๋์ ์ธ๋ถ ๋์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ ์ค์ํ ํ๋์ ๋๋ค. Claude Code๋ ์ฝ๋ ์ค๋ฉ์ ์๋์ผ๋ก ํ์งํ๊ณ , ์์ ํ ๋ฆฌํฉํ ๋ง ์ ๋ต์ ์ ์ํ๋ฉฐ, ์ง์์ ์ธ ์ฝ๋ ํ์ง ํฅ์์ ์ง์ํฉ๋๋ค.
์ฒด๊ณ์ ์ธ ๋ฆฌํฉํ ๋ง
ํจ๊ณผ์ ์ธ ๋ฆฌํฉํ ๋ง์ ๋จ์ํ ์ฝ๋ ์ ๋ฆฌ๋ฅผ ๋์ด์, ์์คํ ์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ํฌ๊ฒ ํฅ์์ํค๋ ์ ๋ต์ ํ๋์ ๋๋ค.
1. ์ฝ๋ ์ค๋ฉ ํ์ง
claude "์ด ์ฝ๋๋ฒ ์ด์ค์์ ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ถ๋ถ์ ์ฐพ์์ค.
๋ค์์ ์ค์ ์ ์ผ๋ก ํ์ธํด์ค
- ์ค๋ณต ์ฝ๋
- ๊ธด ํจ์
- ๋ณต์กํ ์กฐ๊ฑด๋ฌธ
- ๋ถ์ ์ ํ ์ด๋ฆ"
2. ๋จ๊ณ๋ณ ๋ฆฌํฉํ ๋ง
# 1๋จ๊ณ: ํ
์คํธ ํ๋ณด
claude "๋ฆฌํฉํ ๋ง ์ ์ ํ์ฌ ๋์์ ๋ณด์ฅํ๋ ํ
์คํธ๋ฅผ ์์ฑํด์ค"
# 2๋จ๊ณ: ์์ ๋จ์๋ก ๊ฐ์
claude "ํ ๋ฒ์ ํ๋์ฉ ๋ฆฌํฉํ ๋ง์ ์งํํด์ค.
๊ฐ ๋จ๊ณ๋ง๋ค ํ
์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํด์ค"
# 3๋จ๊ณ: ์ฑ๋ฅ ๊ฒ์ฆ
claude "๋ฆฌํฉํ ๋ง ์ ํ์ ์ฑ๋ฅ์ ๋น๊ตํด์ค.
๋ฒค์น๋งํฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํด์ค"
์ฝ๋ ํ์ง ๋ฉํธ๋ฆญ
claude "์ฝ๋ ํ์ง์ ์ธก์ ํ๊ณ ๊ฐ์ ๋ฐฉ์์ ์ ์ํด์ค
- ์ํ ๋ณต์ก๋
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง
- ๊ธฐ์ ๋ถ์ฑ
- ์์กด์ฑ ๋ณต์ก๋"
- fixer-agent: ์ฝ๋ ์์ ์ ๋ฌธ ์์ด์ ํธ ์ญํ โ ๋๋ฒ๊น ๊ฒฐ๊ณผ ๊ธฐ๋ฐ ์๋ ์์ ์ํ
[S2QC4] QA Review Agent โ QA ์ ๋ฌธ ์์ด์ ํธ
- qa-review-agent: QA ์ ๋ฌธ ์์ด์ ํธ ์ญํ ์ ์ โ ํ ์คํธ ๊ณํ ์๋ฆฝ, ํ ์คํธ ์ผ์ด์ค ์์ฑ, ๊ฒฐํจ ๋ถ๋ฅ
- ์๋ํ๋ QA ํ์ดํ๋ผ์ธ ๊ตฌ์ถ ์ ํต์ฌ ์์ด์ ํธ๋ก ํ์ฉ
[S2QC5] Books โ ์ค๊ธ ํ์ง๊ด๋ฆฌ ํ์ต
- 1๊ถ 34ํธ: AI ํ์ฉ ์ ์ฃผ์์ฌํญ๊ณผ ํ๊ณ โ ์ค๋ฌด ๋ณด์ ์ํ ๋์ ๋ฐ ํ๊ณ ๊ด๋ฆฌ
- 2๊ถ 05ํธ: Git๊ณผ GitHub โ Git ์ํฌํ๋ก์ฐ ๊ธฐ๋ฐ ํ์ง ๊ด๋ฆฌ (๋ธ๋์น ์ ๋ต, PR ๋ฆฌ๋ทฐ)
- 2๊ถ 22ํธ: SEO ์ต์ ํ โ ๊ฒ์์์ง ์ต์ ํ ์ค์ ์ ์ฉ
- 2๊ถ 23ํธ: ์น ์ ๊ทผ์ฑ โ ์ ๊ทผ์ฑ ์ค์ ์ค์ ์ฒดํฌ๋ฆฌ์คํธ
- 2๊ถ 24ํธ: ์ฑ๋ฅ ์ต์ ํ โ ์ฑ๋ฅ ์ธก์ ๋ฐ ๊ฐ์ ์ค์ ๊ธฐ๋ฒ
- 3๊ถ 06ํธ: Verification Instruction ์์ฑ๋ฒ โ ์ค์ ๊ฒ์ฆ ์ง์นจ ์์ฑ
- 3๊ถ 07ํธ: ๊ฒ์ฆ ์์คํ ๊ณผ Stage Gate โ Stage Gate ์ค์ ์ด์
- 3๊ถ 11ํธ: AI ์์ 6๋ ๊ท์น โ ๊ท์น ๊ธฐ๋ฐ ํ์ง ๊ด๋ฆฌ ์ค์
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S2QC6] ์ค์ Tips โ ๋ณด์/๊ฒ์ฆ/SAL Grid/Git ์ค๊ธ
๋ณด์/โ API ํค ๋กํ ์ด์ ์ค์ , OWASP ์ทจ์ฝ์ ์ง๋จ ์ ์ฉ, RLS ์ ์ฑ ํ ์คํธ, ํ๊ฒฝ๋ณ์ Vercel ์ฐ๋ (4๊ฐ)๊ฒ์ฆ_๋ฌธ์ํ/โ ์๋ธ์์ด์ ํธ ๊ฒ์ฆ ๊ฒฐ๊ณผ ํด์, ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ์ฒดํฌ, ์๋ ๋ฌธ์ํ ํ์ดํ๋ผ์ธ, CLAUDE.md ๋ฒ์ ๊ด๋ฆฌ (4๊ฐ)SAL_Grid/โ Phase Gate ํต๊ณผ ๊ธฐ์ค ์ค์ ์ ์ฉ, ์์กด์ฑ ๊ธฐ๋ฐ Task ์ฌ๋ถํ , ๊ฒ์ฆ ๋ฆฌํฌํธ ํ ํ๋ฆฟ (5๊ฐ)Git_GitHub/Feature_๋ธ๋์น_์ ๋ต.mdโ Feature ๋ธ๋์น ๊ธฐ๋ฐ PR ๋ฆฌ๋ทฐ + ํ์ง ๊ฒ์ดํธ ํตํฉ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S2QC7] .claude ์ฐธ๊ณ โ Rules/Compliance ์ค๊ธ
- rules:
06_verification.mdโ ์ํ ์ ์ด ๊ท์น(ExecutedโVerifiedโCompleted) ์ค์ ์ด์ฉ - compliance:
AI_12_COMPLIANCE.mdโ ์ค์์ฌํญ ์๋ฐ ์ฌ๋ก ๋ถ์ ๋ฐ ์ค์ ๋์ ํจํด
๐ ๊ฒฝ๋ก:.claude/rules/,.claude/compliance/
S2CM โ ๋น์ฉ๊ด๋ฆฌ (Cost Management)
[S2CM1(์น์ 24)] ๋ชจ๋ํฐ๋ง & ์ฑ๋ฅ ์ต์ ํ ์ ๋ต
11.9 ๋ชจ๋ํฐ๋ง๊ณผ ์ฑ๋ฅ ์ต์ ํ
Claude Code Action์ ์์ ์ ์ธ ์ด์์ ์ํด์๋ ํฌ๊ด์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ์ง์์ ์ธ ์ฑ๋ฅ ์ต์ ํ๊ฐ ํ์์ ๋๋ค. ์์คํ ์ ๊ฑด๊ฐ์ฑ์ ์ค์๊ฐ์ผ๋ก ์ถ์ ํ๊ณ , ๋ณ๋ชฉ ์ง์ ์ ์ฌ์ ์ ์๋ณํ๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ ์ฒด๊ณ์ ์ธ ์ ๊ทผ์ด ํ์ํฉ๋๋ค.
์ข ํฉ์ ์ธ ๋ชจ๋ํฐ๋ง ์์คํ
๋ค์ธต์ ๋ชจ๋ํฐ๋ง ์ํคํ ์ฒ
# ์ํฐํ๋ผ์ด์ฆ ๋ชจ๋ํฐ๋ง ์ ๋ต
claude "Claude Code Action์ ์ํ ์ข
ํฉ์ ์ธ ๋ชจ๋ํฐ๋ง ์์คํ
์ ์ค๊ณํด์ค.
๋ค์ ๊ณ์ธต๋ณ ๋ชจ๋ํฐ๋ง์ ํฌํจํด์ค
์ธํ๋ผ ๊ณ์ธต
- GitHub Actions ๋ฌ๋ ๋ฆฌ์์ค ์ฌ์ฉ๋
- API ์๋ต ์๊ฐ๊ณผ ์ฒ๋ฆฌ๋
- ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ๊ณผ ํจํท ์์ค
- ์ ์ฅ์ I/O ์ฑ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ฉ ํจํด
์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต
- Claude API ํธ์ถ ์ฑ๊ณต๋ฅ ๊ณผ ์ง์ฐ ์๊ฐ
- ์ํฌํ๋ก์ฐ ์คํ ์๊ฐ๊ณผ ์ฑ๊ณต๋ฅ
- ์ค๋ฅ ๋ฐ์ ๋น๋์ ํจํด
- ์ฌ์ฉ์ ์์ฒญ ์ฒ๋ฆฌ ์ํ
- ์บ์ ํํธ์จ๊ณผ ํจ์จ์ฑ
๋น์ฆ๋์ค ๊ณ์ธต
- ์ฌ์ฉ์ ๋ง์กฑ๋์ ํผ๋๋ฐฑ
- ์ฝ๋ ํ์ง ๊ฐ์ ์งํ
- ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์ ์ธก์
- ๋น์ฉ ํจ์จ์ฑ๊ณผ ROI
- ํ ํ์
ํจ๊ณผ์ฑ
๋ชจ๋ํฐ๋ง ๋๊ตฌ ํตํฉ
- Prometheus + Grafana ๋์๋ณด๋
- DataDog APM๊ณผ ๋ก๊ทธ ๋ถ์
- AWS CloudWatch (Bedrock ์ฌ์ฉ ์)
- Google Cloud Monitoring (Vertex ์ฌ์ฉ ์)
- ์ปค์คํ
๋ฉํธ๋ฆญ ์์ง๊ณผ ์๋ฆผ"
์ค์๊ฐ ๋์๋ณด๋์ ์๋ฆผ ์์คํ
# ๋ชจ๋ํฐ๋ง ์ํฌํ๋ก์ฐ
name: Claude Action Monitoring
on:
schedule:
- cron: '*/5 * * * *' # 5๋ถ๋ง๋ค ์คํ
workflow_run:
workflows: ["Claude AI Assistant"]
types: [completed, requested, in_progress]
jobs:
health-check:
runs-on: ubuntu-latest
steps:
- name: API Health Check
id: health
run: |
# Anthropic API ์ํ ํ์ธ
ANTHROPIC_STATUS=$(curl -s -w "%{http_code}" -H "x-api-key: ${{ secrets.ANTHROPIC_API_KEY }}" \
https://api.anthropic.com/v1/models -o /dev/null)
# API ์๋ต ์๊ฐ ์ธก์
RESPONSE_TIME=$(curl -w "%{time_total}" -s -o /dev/null \
-H "x-api-key: ${{ secrets.ANTHROPIC_API_KEY }}" \
https://api.anthropic.com/v1/models)
echo "api_status=$ANTHROPIC_STATUS" >> $GITHUB_OUTPUT
echo "response_time=$RESPONSE_TIME" >> $GITHUB_OUTPUT
- name: Usage Metrics Collection
run: |
# API ์ฌ์ฉ๋ ์์ง
echo "Collecting usage metrics..."
# GitHub Actions ์ฌ์ฉ๋ ํ์ธ
gh api /repos/${{ github.repository }}/actions/workflows \
--jq '.workflows[] | select(.name == "Claude AI Assistant") | .id' > workflow_id.txt
# ์ต๊ทผ ์คํ ํต๊ณ ์์ง
WORKFLOW_ID=$(cat workflow_id.txt)
gh api "/repos/${{ github.repository }}/actions/workflows/$WORKFLOW_ID/runs?per_page=100" \
--jq '.workflow_runs | group_by(.conclusion) | map({conclusion: .[0].conclusion, count: length})'
- name: Performance Analysis
run: |
# ์ฑ๋ฅ ์งํ ๋ถ์
echo "Analyzing performance metrics..."
# ํ๊ท ์คํ ์๊ฐ ๊ณ์ฐ
# ์ฑ๊ณต๋ฅ ๊ณ์ฐ
# ์๋ฌ ํจํด ๋ถ์
- name: Alert on Issues
if: steps.health.outputs.api_status != '200' || steps.health.outputs.response_time > '2.0'
run: |
# Slack ์๋ฆผ ๋ฐ์ก
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"๐จ Claude Code Action Alert: API issues detected"}' \
${{ secrets.SLACK_WEBHOOK_URL }}
์ฑ๋ฅ ์ต์ ํ ์ ๋ต
์ง๋ฅํ ์บ์ฑ๊ณผ ์์ฒญ ์ต์ ํ
# ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ์
claude "Claude Code Action์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ์ ๋ต์ ์๋ฆฝํด์ค.
๋ค์ ์์ญ๋ณ ์ต์ ํ๋ฅผ ํฌํจํด์ค
API ํธ์ถ ์ต์ ํ
- ์์ฒญ ๋ฐฐ์นญ๊ณผ ๋ณ๋ ฌ ์ฒ๋ฆฌ
- ๊ฒฐ๊ณผ ์บ์ฑ ์ ๋ต (Redis, Memcached)
- ์ง๋ฅํ ์ฌ์๋ ๋ก์ง
- ๋ถ๋ถ ์๋ต๊ณผ ์คํธ๋ฆฌ๋ฐ
- ์ปจํ
์คํธ ์์ถ๊ณผ ์ต์ ํ
์ํฌํ๋ก์ฐ ์ต์ ํ
- ์กฐ๊ฑด๋ถ ์คํ๊ณผ ์คํต ๋ก์ง
- ์์กด์ฑ ์ต์ ํ์ ๋ณ๋ ฌํ
- ์ํฐํฉํธ ์บ์ฑ๊ณผ ์ฌ์ฌ์ฉ
- ํ๊ฒฝ ์ค๋น ์๊ฐ ๋จ์ถ
- ๋ฆฌ์์ค ํจ์จ์ ํ ๋น
์ฝ๋ ๋ถ์ ์ต์ ํ
- ์ฆ๋ถ ๋ถ์ (๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง)
- ์ง๋ฅํ ํํฐ๋ง (๊ด๋ จ ํ์ผ๋ง)
- ์ฌ์ ์ปดํ์ผ๋ ๋ถ์ ๊ฒฐ๊ณผ ํ์ฉ
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ์ฒ๋ฆฌ
- ์์ธก์ ํ๋ฆฌํ์นญ
๋ชจ๋ธ ํ์ฉ ์ต์ ํ
- ์ ์ ํ ๋ชจ๋ธ ์ ํ (์์
๋ณ)
- ํ๋กฌํํธ ์ต์ ํ์ ์์ถ
- ์ปจํ
์คํธ ์๋์ฐ ๊ด๋ฆฌ
- ํ ํฐ ์ฌ์ฉ๋ ์ต์ ํ
- ์๋ต ํ์ง vs ์๋ ๊ท ํ"
์ค๋งํธ ๋ฆฌ์์ค ๊ด๋ฆฌ
# ์ ์์ ๋ฆฌ์์ค ๊ด๋ฆฌ
name: Adaptive Resource Management
on:
schedule:
- cron: '0 */6 * * *' # 6์๊ฐ๋ง๋ค.
jobs:
resource-optimization:
runs-on: ubuntu-latest
steps:
- name: Analyze Usage Patterns
id: analysis
run: |
# ์ฌ์ฉ ํจํด ๋ถ์
PEAK_HOURS=$(gh api "/repos/${{ github.repository }}/actions/workflows" \
--jq '.workflows[] | select(.name == "Claude AI Assistant") | .id' | \
xargs -I {} gh api "/repos/${{ github.repository }}/actions/workflows/{}/runs" \
--jq '.workflow_runs[0:50] | group_by(.created_at[11:13]) |
map({hour: .[0].created_at[11:13], count: length}) |
sort_by(.count) | reverse | .[0:3] | map(.hour) | join(",")')
echo "peak_hours=$PEAK_HOURS" >> $GITHUB_OUTPUT
- name: Optimize Configuration
run: |
# ์ฌ์ฉ ํจํด์ ๋ฐ๋ฅธ ์ค์ ์ต์ ํ
echo "Peak hours: ${{ steps.analysis.outputs.peak_hours }}"
# ๋ฌ๋ ํ์
์กฐ์
# ํ์์์ ์ค์ ์ต์ ํ
# ๋ชจ๋ธ ์ ํ ์ ๋ต ์
๋ฐ์ดํธ
- name: Update Scaling Policy
run: |
# ์๋ ์ค์ผ์ผ๋ง ์ ์ฑ
์
๋ฐ์ดํธ
echo "Updating scaling policies based on usage patterns..."
๋น์ฉ ๋ชจ๋ํฐ๋ง๊ณผ ์ต์ ํ
์ง๋ฅํ ๋น์ฉ ๊ด๋ฆฌ
# ๋น์ฉ ์ต์ ํ ์ ๋ต
claude "Claude Code Action์ ์ด์ ๋น์ฉ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ต์ ํํ๋ ์์คํ
์ ๋ง๋ค์ด์ค.
๋ค์ ์์๋ฅผ ํฌํจํด์ค
๋น์ฉ ์ถ์
- API ํธ์ถ ๋น์ฉ (ํ ํฐ ์ฌ์ฉ๋ ๊ธฐ๋ฐ)
- GitHub Actions ๋ฐํ์ ๋น์ฉ
- ํด๋ผ์ฐ๋ ์ธํ๋ผ ๋น์ฉ (Bedrock/Vertex)
- ์คํ ๋ฆฌ์ง์ ๋คํธ์ํฌ ๋น์ฉ
- ๋ชจ๋ํฐ๋ง ๋๊ตฌ ๋น์ฉ
๋น์ฉ ์ต์ ํ
- ํ ํฐ ํจ์จ์ ์ธ ํ๋กฌํํธ ์ค๊ณ
- ์บ์ฑ์ ํตํ ์ค๋ณต ํธ์ถ ๋ฐฉ์ง
- ์ค๋งํธ ๋ชจ๋ธ ์ ํ (๋น์ฉ vs ์ฑ๋ฅ)
- ์์ฝ ์ธ์คํด์ค์ ํ ์ธ ํ์ฉ
- ์๋ ์ค์ผ์ผ๋ง๊ณผ ๋ฆฌ์์ค ํด์
์์ฐ ๊ด๋ฆฌ
- ํ๋ณ/ํ๋ก์ ํธ๋ณ ๋น์ฉ ํ ๋น
- ์์ฐ ์๊ณ๊ฐ๊ณผ ์๋ฆผ ์ค์
- ์๋ณ ๋น์ฉ ์์ธก๊ณผ ๊ณํ
- ๋น์ฉ ๋๋น ํจ๊ณผ ์ธก์
- ์์ฐ ์ด๊ณผ ๋ฐฉ์ง ๋ฉ์ปค๋์ฆ
๋ฆฌํฌํ
๊ณผ ๋ถ์
- ์ค์๊ฐ ๋น์ฉ ๋์๋ณด๋
- ์ฌ์ฉ ํจํด๋ณ ๋น์ฉ ๋ถ์
- ROI ๊ณ์ฐ๊ณผ ๋น์ฆ๋์ค ๊ฐ์น
- ๋น์ฉ ํธ๋ ๋์ ์์ธก
- ์ต์ ํ ๊ธฐํ ์๋ณ"
[S2CM2] Books 1๊ถ โ ์ค๊ธ ๋น์ฉ๊ด๋ฆฌ ํ์ต
- 1๊ถ 14ํธ: ๊ตฌ๋ ํ๋๊ณผ ์๊ธ ์ฒด๊ณ โ Pro/Team ํ๋ ์์ธ ๋น๊ต ๋ฐ ์ค๋ฌด ๋น์ฉ ๊ณ์ฐ
- 1๊ถ 24ํธ: Memory์ ์ปจํ ์คํธ ๊ด๋ฆฌ โ ํ ํฐ ์ ์ฝ ์ค์ ์ ๋ต, ์ปจํ ์คํธ ์์ถ ๊ธฐ๋ฒ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S2CM3] ์ค์ Tips โ AI ๋น์ฉ ํ์ฉ๋ฒ ์ค๊ธ
๋๊ตฌ_ํ์ฉ/AI๋ณ_์น๊ฒ์_๋น์ฉ๊ณผ_ํจ์จ์ _ํ์ฉ๋ฒ.mdโ ์น๊ฒ์ ๋น์ฉ ์ค์ ๋น๊ต ๋ฐ ์ ๊ฐ ํจํด
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/๋๊ตฌ_ํ์ฉ/
S3 ๊ณ ๊ธ (Advanced)
S3CO โ ๊ฐ๋ (Concept)
[S3CO1] Books โ ๊ณ ๊ธ ๊ฐ๋ ํ์ต
- 1๊ถ 01ํธ: Anthropic ์ฐฝ์ ๊ณผ ์ฒ ํ โ AI ์์ ์ฑ ์ฒ ํ์ ์ค๋ฌด ์ ์ฉ
- 1๊ถ 09ํธ: Claude ์ํ๊ณ ์ ์ฒด ๊ตฌ์กฐ โ ์ํ๊ณ ์ํคํ ์ฒ ๊ณ ๊ธ ์ค๊ณ
- 3๊ถ 01ํธ: SAL Grid ๊ฐ์์ ํต์ฌ ๊ฐ๋ โ SAL Grid ๊ณ ๊ธ ๊ฐ๋ ๋ฐ ์ปค์คํฐ๋ง์ด์ง ์ ๋ต
- 2๊ถ ๋ถ๋ก: ์ฉ์ด์ฌ์ โ ํ์คํ ๊ณ ๊ธ ์ฉ์ด ์ด์ ๋ฆฌ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S3CO2] ์ค์ Tips โ ์น๊ฐ๋ฐ ๊ธฐ์ด๊ฐ๋ ๊ณ ๊ธ
์น๊ฐ๋ฐ_๊ธฐ์ด๊ฐ๋ /โ ํ์คํ ์ํคํ ์ฒ ๊ณ ๊ธ ๊ฐ๋ (3๊ฐ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/์น๊ฐ๋ฐ_๊ธฐ์ด๊ฐ๋
/
S3ST โ ์คํธ๋ญ์ฒ (Structure)
[S3ST1(์น์ 23)] Git Worktree ๊ณ ๊ธ ํตํฉ & ๋ณ๋ ฌ ๊ฐ๋ฐ ์ ๋ต
8.2 Git Worktree์์ ๊ณ ๊ธ ํตํฉ ์ ๋ต
์ํฐํ๋ผ์ด์ฆ๊ธ Worktree ์ํคํ ์ฒ
Git Worktree๋ฅผ ํ์ฉํ ๋ณ๋ ฌ ๊ฐ๋ฐ์ ๋จ์ํ ๋ธ๋์น ๋ถ๋ฆฌ๋ฅผ ๋์ด์ ๊ฐ ์์ ์์ญ์ ๋ ๋ฆฝ์ฑ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๋ ์ ๋ต์ ์ ๊ทผ์ด ํ์ํฉ๋๋ค.
# ์ํฐํ๋ผ์ด์ฆ๊ธ ์ํฌํธ๋ฆฌ ์ํคํ
์ฒ ๊ตฌ์ฑ
# 1. ๊ธฐ๋ฅ๋ณ ๊ฒฉ๋ฆฌ๋ ๊ฐ๋ฐ ํ๊ฒฝ
git worktree add ../project-auth-service feature/auth-microservice
git worktree add ../project-payment-gateway feature/payment-integration
git worktree add ../project-user-dashboard feature/dashboard-redesign
git worktree add ../project-mobile-api feature/mobile-optimization
git worktree add ../project-security-audit hotfix/security-vulnerabilities
# 2. ๊ฐ ์ํฌํธ๋ฆฌ์ ํนํ๋ Claude ์ค์
cd ../project-auth-service
echo "# Authentication Service Context" > CLAUDE.md
echo "Focus: OAuth2/JWT implementation, security best practices" >> CLAUDE.md
echo "Tech Stack: Node.js + Express + Passport" >> CLAUDE.md
echo "Security Level: CRITICAL - all inputs must be validated" >> CLAUDE.md
claude "๋น์ ์ ๋ณด์ ์ธ์ฆ ์์คํ
์ ๋ฌธ๊ฐ์
๋๋ค.
OAuth2์ JWT๋ฅผ ํ์ฉํ ์ํฐํ๋ผ์ด์ฆ๊ธ ์ธ์ฆ ์์คํ
์ ๊ตฌ์ถํด์ฃผ์ธ์.
๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก์ OWASP ๊ฐ์ด๋๋ผ์ธ์ ์๊ฒฉํ ์ค์ํด์ฃผ์ธ์."
cd ../project-payment-gateway
echo "# Payment Gateway Context" > CLAUDE.md
echo "Focus: PCI DSS compliance, payment processing" >> CLAUDE.md
echo "Tech Stack: Python + FastAPI + Stripe/PayPal" >> CLAUDE.md
echo "Compliance: PCI DSS Level 1, SOX compliance required" >> CLAUDE.md
claude "๋น์ ์ ๊ฒฐ์ ์์คํ
์ ๋ฌธ๊ฐ์
๋๋ค.
PCI DSS ์ค์์ ๊ธ์ต ๋ณด์ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํ๋
์์ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด๋ฅผ ๊ตฌํํด์ฃผ์ธ์."
cd ../project-user-dashboard
echo "# User Dashboard Context" > CLAUDE.md
echo "Focus: React performance, user experience" >> CLAUDE.md
echo "Tech Stack: React 18 + TypeScript + Tailwind" >> CLAUDE.md
echo "Performance: Lighthouse 95+, Core Web Vitals optimized" >> CLAUDE.md
claude "๋น์ ์ ํ๋ก ํธ์๋ UX ์ ๋ฌธ๊ฐ์
๋๋ค.
์ฌ์ฉ์ ์ค์ฌ์ ๋์๋ณด๋๋ฅผ ์ค๊ณํ๊ณ ๊ตฌํํด์ฃผ์ธ์.
์ฑ๋ฅ ์ต์ ํ์ ์ ๊ทผ์ฑ์ ์ต์ฐ์ ์ผ๋ก ๊ณ ๋ คํด์ฃผ์ธ์."
์ง๋ฅํ Worktree ๊ด๋ฆฌ ์์คํ
Worktree ๊ด๋ฆฌ๋ฅผ ์๋ํํ์ฌ ๊ฐ๋ฐ์์ ์ธ์ง ๋ถ๋ด์ ์ค์ด๊ณ ์ผ๊ด๋ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ณด์ฅํฉ๋๋ค.
# ๊ณ ๊ธ ์ํฌํธ๋ฆฌ ๊ด๋ฆฌ ์๋ํ
claude "์ํฐํ๋ผ์ด์ฆ๊ธ Git Worktree ๊ด๋ฆฌ ์์คํ
์ ๊ตฌ์ถํด์ค
์ฃผ์ ๊ธฐ๋ฅ
1. ๊ธฐ๋ฅ๋ณ ํ
ํ๋ฆฟ ๊ธฐ๋ฐ ์ํฌํธ๋ฆฌ ์์ฑ
2. ํ๊ฒฝ๋ณ CLAUDE.md ์๋ ์ค์
3. ์์กด์ฑ ์ถฉ๋ ํ์ง์ ํด๊ฒฐ
4. ์์
์งํ๋ฅ ์ถ์ ๊ณผ ๋ฆฌํฌํ
5. ์๋ ์ ๋ฆฌ์ ์์นด์ด๋น
6. ํ ํ์
์ ์ํ ์ํฌํธ๋ฆฌ ๊ณต์
๊ธฐ์ ์๊ตฌ์ฌํญ
- Shell scripting with error handling
- JSON/YAML ์ค์ ํ์ผ ์ง์
- ํฌ๋ก์ค ํ๋ซํผ ํธํ์ฑ (Linux/macOS/Windows)
- ๋ก๊น
๊ณผ ๊ฐ์ฌ ์ถ์
- ๋ฐฑ์
๊ณผ ๋ณต๊ตฌ ๋ฉ์ปค๋์ฆ"
์์ฑ๋๋ ์คํฌ๋ฆฝํธ ์์
#!/bin/bash
# new-feature.sh
FEATURE_NAME=$1
WORKTREE_PATH="../project-$FEATURE_NAME"
# ๋ธ๋์น ์์ฑ
git checkout -b "feature/$FEATURE_NAME"
# Worktree ์ถ๊ฐ
git worktree add "$WORKTREE_PATH" "feature/$FEATURE_NAME"
# ์ ํฐ๋ฏธ๋์์ Claude ์์
cd "$WORKTREE_PATH"
osascript -e "tell app \"Terminal\" to do script \"cd $WORKTREE_PATH && claude\""
echo "Feature branch 'feature/$FEATURE_NAME' created in $WORKTREE_PATH"
8.3 ๋ง์ดํฌ๋ก์๋น์ค ๋์ ๊ฐ๋ฐ
์๋น์ค๋ณ ๊ฐ๋ฐ ํ๊ฒฝ ๋ถ๋ฆฌ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph TB
subgraph project [๋ง์ดํฌ๋ก์๋น์ค ํ๋ก์ ํธ ๊ตฌ์กฐ]
A[user-service<br/>Terminal 1<br/>์ฌ์ฉ์ ๊ด๋ฆฌ]
B[product-service<br/>Terminal 2<br/>์ํ ๊ด๋ฆฌ]
C[order-service<br/>Terminal 3<br/>์ฃผ๋ฌธ ์ฒ๋ฆฌ]
D[payment-service<br/>Terminal 4<br/>๊ฒฐ์ ์ฒ๋ฆฌ]
E[api-gateway<br/>Terminal 5<br/>ํตํฉ ๊ด๋ฆฌ]
end
subgraph terminals [๋ณ๋ ฌ ๊ฐ๋ฐ ํ๊ฒฝ]
T1[Claude Instance 1<br/>์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ํ๋กํ]
T2[Claude Instance 2<br/>์ํ ์นดํ๋ก๊ทธ ๋ฐ ๊ฒ์]
T3[Claude Instance 3<br/>์ฃผ๋ฌธ ์ํฌํ๋ก์ฐ]
T4[Claude Instance 4<br/>๊ฒฐ์ ํตํฉ]
T5[Claude Instance 5<br/>API ๋ผ์ฐํ
๋ฐ ๋ณด์]
end
A -.-> T1
B -.-> T2
C -.-> T3
D -.-> T4
E -.-> T5
T1 --> T5
T2 --> T5
T3 --> T5
T4 --> T5
classDef serviceStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef terminalStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C,D,E serviceStyle
class T1,T2,T3,T4,T5 terminalStyle
์๋น์ค ๊ฐ ํต์ ๊ด๋ฆฌ
API ๊ฒ์ดํธ์จ์ด ๊ฐ๋ฐ
# Terminal 1 (API Gateway)
claude "API Gateway๋ฅผ ๊ตฌํํด์ค.
๋ผ์ฐํ
, ์ธ์ฆ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ๋ชจ๋ํฐ๋ง์ ํฌํจํด์ค"
๊ฐ๋ณ ์๋น์ค ๊ฐ๋ฐ
# Terminal 2 (User Service)
claude "์ฌ์ฉ์ ๊ด๋ฆฌ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ฐ๋ฐํด์ค.
ํ์๊ฐ์
, ๋ก๊ทธ์ธ, ํ๋กํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํฌํจํด์ค"
# Terminal 3 (Product Service)
claude "์ํ ๊ด๋ฆฌ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ฐ๋ฐํด์ค.
์ํ CRUD, ์ฌ๊ณ ๊ด๋ฆฌ, ๊ฒ์ ๊ธฐ๋ฅ์ ํฌํจํด์ค"
์๋น์ค ๊ฐ ๊ณ์ฝ ๊ด๋ฆฌ
# OpenAPI ์คํ ๋๊ธฐํ
claude "๊ฐ ์๋น์ค์ OpenAPI ์คํ์ ์์ฑํ๊ณ ,
API Gateway์์ ํตํฉ ๋ฌธ์๋ฅผ ๋ง๋ค์ด์ค"
8.4 ํ๋ก ํธ์๋-๋ฐฑ์๋ ๋ณ๋ ฌ ์์
API ์ฐ์ ๊ฐ๋ฐ
1๋จ๊ณ: API ์คํ ์ ์
# ๊ณตํต ์์
claude "์ฌ์ฉ์ ๊ด๋ฆฌ API์ OpenAPI ์คํ์ ์ ์ํด์ค.
์๋ํฌ์ธํธ, ์์ฒญ/์๋ต ์คํค๋ง, ์๋ฌ ์ฝ๋๋ฅผ ํฌํจํด์ค"
2๋จ๊ณ: ๋ณ๋ ฌ ๊ฐ๋ฐ
# Terminal 1 (Backend)
claude "์ ์๋ API ์คํ์ ๋ฐ๋ผ ๋ฐฑ์๋๋ฅผ ๊ตฌํํด์ค.
Mock ๋ฐ์ดํฐ๋ก ๋จผ์ ๋์ํ๊ฒ ๋ง๋ค์ด์ค"
# Terminal 2 (Frontend)
claude "API ์คํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก ํธ์๋๋ฅผ ๊ตฌํํด์ค.
MSW๋ฅผ ์ฌ์ฉํด์ API๋ฅผ ๋ชจํนํด์ค"
ํ์ ๊ณต์ ์ ๋ต
# ๊ณตํต ํ์
์ ์
claude "๋ฐฑ์๋์ ํ๋ก ํธ์๋์์ ๊ณต์ ํ ํ์
์ ์๋ฅผ ๋ง๋ค์ด์ค.
Zod ์คํค๋ง์์ TypeScript ํ์
์ ์๋ ์์ฑํ๋๋ก ํด์ค"
์ค์๊ฐ ๋๊ธฐํ
# API ๋ณ๊ฒฝ ์ ์๋ ์
๋ฐ์ดํธ
claude "๋ฐฑ์๋ API๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํ๋ก ํธ์๋ ํ์
๋
์๋์ผ๋ก ์
๋ฐ์ดํธํ๋ ์์คํ
์ ๊ตฌ์ถํด์ค"
[S3ST3] ๋ฉํฐ์ธ์ โ ์ปจํ ์คํธ ๊ด๋ฆฌ & ์ค์ ์์
๊ณ ๊ธ ๋ฉํฐ์ธ์ ์ํคํ ์ฒ
์ํฐํ๋ผ์ด์ฆ๊ธ ์ธ์ ๊ด๋ฆฌ ์ ๋ต
๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ๋จ์ผ ์ธ์ ์ผ๋ก ๋ชจ๋ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ฌ๋ฌ ์ธ์ ์ ์ฒด๊ณ์ ์ผ๋ก ์ด์ํ๋ ๊ณ ๊ธ ์ ๋ต์ด ํ์ํฉ๋๋ค.
์ธ์ ๋ถ๋ฆฌ ํจํด
# ํจํด 1: ์ญํ ๋ณ ์ธ์
๋ถ๋ฆฌ
Terminal 1: claude --session "architect" # ์ค๊ณ/๊ตฌ์กฐ ์ ๋ด
Terminal 2: claude --session "implementer" # ๊ตฌํ ์ ๋ด
Terminal 3: claude --session "reviewer" # ๋ฆฌ๋ทฐ/๊ฒ์ฆ ์ ๋ด
# ํจํด 2: ๋ ์ด์ด๋ณ ์ธ์
๋ถ๋ฆฌ
Terminal 1: claude --session "frontend" # UI/UX ์์
Terminal 2: claude --session "backend" # API/DB ์์
Terminal 3: claude --session "infra" # DevOps/๋ฐฐํฌ ์์
์ปจํ ์คํธ ์ ๋ฌ ๊ธฐ๋ฒ
์ธ์ ๊ฐ ์ปจํ ์คํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๋ฌํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ:
1. CLAUDE.md ๊ธฐ๋ฐ ๊ณต์ ์ปจํ ์คํธ
# CLAUDE.md์ ์ธ์
๊ฐ ๊ณต์ ์ ๋ณด ๊ธฐ๋ก
## ํ์ฌ ์์
์ํ
- Frontend: ๋ก๊ทธ์ธ UI ์๋ฃ, ๋์๋ณด๋ ์งํ ์ค
- Backend: Auth API ์๋ฃ, Payment API ์งํ ์ค
- ๊ณต์ ๊ท์น: API ์๋ต์ { success, data, error } ํ์
2. ํ์ผ ๊ธฐ๋ฐ ์ปจํ ์คํธ ์ ๋ฌ
# ์ธ์
A์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ์ ์ฅ
claude "API ์คํ์ api-spec.md๋ก ์ ๋ฆฌํด์ค"
# ์ธ์
B์์ ํ์ผ ์ฐธ์กฐ
claude "api-spec.md๋ฅผ ์ฝ๊ณ ํ๋ก ํธ์๋ API ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌํํด์ค"
3. Git ๊ธฐ๋ฐ ์ปจํ ์คํธ ๋๊ธฐํ
# ์ธ์
A: ์์
์๋ฃ ํ ์ปค๋ฐ
git commit -m "feat: auth API ์๋ฃ"
# ์ธ์
B: ์ต์ ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ์์
git pull && claude "์ต๊ทผ ์ปค๋ฐ๋ auth API๋ฅผ ํ์ธํ๊ณ ํ๋ก ํธ์๋ ์ฐ๋ํด์ค"
์ปจํ ์คํธ ์๋์ฐ ์ต์ ํ
| ์ ๋ต | ๋ฐฉ๋ฒ | ํจ๊ณผ | |
|---|---|---|---|
| ํ๋กฌํํธ ์์ถ | /compact ๋ช
๋ น ์ฃผ๊ธฐ์ ์ฌ์ฉ | ํ ํฐ 50% ์ ๊ฐ | |
| ์ ํ์ ๋ก๋ฉ | ํ์ํ ํ์ผ๋ง @ ์ฐธ์กฐ | ๋ถํ์ํ ์ปจํ ์คํธ ์ ๊ฑฐ | |
| ์ธ์ ์ฌ์์ | ์์ ์ ํ ์ ์ ์ธ์ ์์ | ์ด์ ์ปจํ ์คํธ ์ค์ผ ๋ฐฉ์ง | |
| CLAUDE.md ์ต์ ํ | 200์ค ์ด๋ด๋ก ํต์ฌ๋ง ๊ธฐ๋ก | ์๋ ๋ก๋ฉ ๋น์ฉ ์ต์ํ |
๋๊ท๋ชจ ํ๋ก์ ํธ ์ค์ ์์
ํ๋ก์ ํธ: 10,000+ ํ์ผ SaaS ์ ํ๋ฆฌ์ผ์ด์
์ธ์
๊ตฌ์ฑ:
โโโ ์ธ์
1 (์ค๊ณ): ์ํคํ
์ฒ ๊ฒฐ์ , ์์กด์ฑ ๊ด๋ฆฌ
โ โโโ CLAUDE.md + ์ํคํ
์ฒ ๋ฌธ์ ์ฐธ์กฐ
โโโ ์ธ์
2 (ํ๋ก ํธ): React ์ปดํฌ๋ํธ ๊ฐ๋ฐ
โ โโโ ์ปดํฌ๋ํธ ๋๋ ํ ๋ฆฌ๋ง ์ค์ฝํ
โโโ ์ธ์
3 (๋ฐฑ์๋): API + DB ๋ง์ด๊ทธ๋ ์ด์
โ โโโ api/ + database/ ๋๋ ํ ๋ฆฌ ์ค์ฝํ
โโโ ์ธ์
4 (ํ
์คํธ): E2E + ๋จ์ ํ
์คํธ
โ โโโ tests/ ๋๋ ํ ๋ฆฌ + ํ
์คํธ ์ค์
โโโ ์ธ์
5 (๋ฆฌ๋ทฐ): ์ฝ๋ ๋ฆฌ๋ทฐ + ํ์ง ๊ฒ์ฆ
โโโ git diff ๊ธฐ๋ฐ ๋ณ๊ฒฝ ์ฌํญ๋ง ๊ฒํ
๋๊ธฐํ ํฌ์ธํธ:
- ๋งค ๊ธฐ๋ฅ ์๋ฃ ์ git commit
- API ์คํ ๋ณ๊ฒฝ ์ api-spec.md ์
๋ฐ์ดํธ
- ์ํคํ
์ฒ ๋ณ๊ฒฝ ์ CLAUDE.md ์
๋ฐ์ดํธ
๐ก ํต์ฌ ์์น: ์ธ์ ์ ๊ฐ๋ณ๊ฒ, ์ปจํ ์คํธ๋ ํ์ผ๋ก ๊ณต์ ํ๊ณ , ๋๊ธฐํ๋ Git์ผ๋ก.
[S3ST2] Hooks ์ค์ ๊ตฌ์กฐ
- Hooks ์ ์ ์์น:
.claude/settings.json๋๋~/.claude/settings.json - ์ด๋ฒคํธ ํ์
:
PreToolUse,PostToolUse,Notification๋ฑ - ๊ตฌ์กฐ:
{ "hooks": { "์ด๋ฒคํธ๋ช ": [{ "matcher": "ํจํด", "command": "๋ช ๋ น์ด" }] } } - Hook์ shell ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉฐ, exit code๋ก ํ์ฉ/์ฐจ๋จ ๊ฒฐ์
[S3ST4] TeammateMode โ ํ์ ๋ชจ๋ ์ค์
- teammateMode ์ธํ๋ผ ์ค์ : ์์ด์ ํธ๊ฐ ํ์ ์ญํ ๋ก ๋์ํ๋ ๋ชจ๋ ๊ตฌ์ฑ
- SendMessage, TaskCreate/Update ๋ฑ ํ ํ์ ๋๊ตฌ ์๋ ํ์ฑํ
- Agent Teams์ ์ฐ๊ณํ์ฌ ๋ฉํฐ ์์ด์ ํธ ํ ์ธํ๋ผ ๊ตฌ์ถ
[S3ST5] Books โ ๊ณ ๊ธ ๊ตฌ์กฐ ์ค์ ํ์ต
- 1๊ถ 22ํธ: MCP โ MCP ์๋ฒ ์ปค์คํ ๊ฐ๋ฐ ๋ฐ ์ํคํ ์ฒ ์ค๊ณ
- 1๊ถ 23ํธ: Plugins โ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ ํ์ฅ ๋ฐ ์ปค์คํ ๊ฐ๋ฐ
- 1๊ถ 26ํธ: Settings โ ๋๊ท๋ชจ ํ ์ค์ ๊ด๋ฆฌ, ๊ถํ ์ฒด๊ณ ๊ณ ๊ธ ์ค๊ณ
- 2๊ถ 30ํธ: Supabase ์ฌํ โ ๊ณ ๊ธ Supabase ์ํคํ ์ฒ (RLS, Edge Functions)
- 3๊ถ 02ํธ: 22๊ฐ ์์ฑ ์ ์ โ SAL Grid ์์ฑ ์ฒด๊ณ ์ปค์คํฐ๋ง์ด์ง
- 3๊ถ 03ํธ: 5x11 Matrix โ Matrix ํ์ฅ ๋ฐ ์ปค์คํ Area/Stage ์ค๊ณ
- 3๊ถ 12ํธ: Orders Reports JSON ์์คํ โ JSON ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ณ ๊ธ ์ค๊ณ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S3ST6] ์ค์ Tips โ DB/ํ๋ก์ ํธ/๊ฐ๋ฐ ๊ณ ๊ธ
๋ฐ์ดํฐ๋ฒ ์ด์ค/โ Supabase CRUD ๊ณ ๊ธ, RLS ์ฌํ, ์ฟผ๋ฆฌ ์ต์ ํ (4๊ฐ)ํ๋ก์ ํธ_์์/โ CLAUDE.md ๊ณ ๊ธ ์ค๊ณ, ๋๊ท๋ชจ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ (5๊ฐ)๊ฐ๋ฐ_์ค๋ฌด/โ ํ์ผ ์ ์ฅ ์์น ๊ณ ๊ธ ๊ด๋ฆฌ, ์ธ์ฆ์ฝ๋ ๊ตฌ์กฐ ์ฌํ (14๊ฐ ์ค ์ฌํ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S3ST7] .claude ์ฐธ๊ณ โ Rules/Methods/Compliance ๊ณ ๊ธ
- rules: 7๊ฐ ๊ท์น ํ์ผ ์ปค์คํฐ๋ง์ด์ง โ ํ๋ก์ ํธ ํน์ฑ์ ๋ง์ถ ๊ท์น ํ์ฅยท์ค๋ฒ๋ผ์ด๋ ์ค๊ณ
- methods: 3๊ฐ ๋ฉ์๋ ์๋ํ ์ฒด๊ณ โ
01_supabase-crud.md(CRUD ํ์ดํ๋ผ์ธ),02_builder-id.md(ID ์ฑ๋ฒ ๋ก์ง),03_login-error.md(์๋ฌ ์๋ ์ง๋จ) - compliance:
AI_12_COMPLIANCE.mdโ ์ค์์ฌํญ ๊ธฐ๋ฐ ์๋ ๊ฐ์ฌ ์ฒด๊ณ ์ค๊ณ
๐ ๊ฒฝ๋ก:.claude/rules/,.claude/methods/,.claude/compliance/
S3WF โ ์ํฌํ๋ก์ฐ (Workflow)
[S3WF1(์น์ 09)] Hooks ์์คํ
9.1 ์ง๋ฅํ Headless ๋ชจ๋ ์ํคํ ์ฒ
์ํฐํ๋ผ์ด์ฆ๊ธ Headless ํตํฉ ์ ๋ต
Claude Code์ Headless ๋ชจ๋๋ ๋จ์ํ ๋ช ๋ นํ ๋๊ตฌ๋ฅผ ๋์ด์ ์ํฐํ๋ผ์ด์ฆ๊ธ ์๋ํ ์ํ๊ณ์ ํต์ฌ ์ธํ๋ผ๋ก ๊ธฐ๋ฅํฉ๋๋ค. ์ด ๋ชจ๋๋ ๋ค์ํ ์๋ํ ์๋๋ฆฌ์ค์ ๋ง์ถฐ ์ ์ฐํ๊ฒ ํ์ฅ๋๋ฉฐ, ๋๊ท๋ชจ ๊ฐ๋ฐ ์กฐ์ง์ ๋ณต์กํ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph TD
A[Headless ๋ชจ๋] --> B[ํ๊ฒฝ ๊ฐ์ง]
A --> C[์ปจํ
์คํธ ๋ถ์]
A --> D[์ ๋ต ์๋ฆฝ]
B --> E[Production<br/>์ต๊ณ ํ์ง ๋ชจ๋ธ]
B --> F[Staging<br/>ํ์ค ๊ฒ์ฆ]
B --> G[Development<br/>๋น ๋ฅธ ํผ๋๋ฐฑ]
C --> H[ํ๋ก์ ํธ ๊ท๋ชจ]
C --> I[๊ธฐ์ ์คํ]
C --> J[ํ ๊ตฌ์กฐ]
D --> K[๋ถ์ ๊น์ด]
D --> L[์ฐ์ ์์ ์์ญ]
D --> M[๋ฆฌ์์ค ํ ๋น]
E --> N[์ข
ํฉ ํ์ง ๋ถ์]
F --> O[ํ์ค ๊ฒ์ฆ ํ๋ก์ธ์ค]
G --> P[๋น ๋ฅธ ํผ๋๋ฐฑ ๋ฃจํ]
classDef envStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef analysisStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C,D envStyle
class E,F,G,H,I,J,K,L,M,N,O,P analysisStyle
์ง๋ฅํ ์ปจํ ์คํธ ์ธ์ ์์คํ
Headless ๋ชจ๋๋ ์คํ ํ๊ฒฝ, ํ๋ก์ ํธ ์ํ, ํ ๊ท์น์ ์๋์ผ๋ก ๊ฐ์งํ์ฌ ์ต์ ํ๋ ๋ถ์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋จ์ํ ๋ช ๋ น ์คํ์ ๋์ด์ ํ๋ก์ ํธ์ ์ ์ฒด์ ์ธ ๋งฅ๋ฝ์ ์ดํดํ๊ณ ์ ์ ํ ํ๋จ์ ๋ด๋ฆฌ๋ ์ง๋ฅํ ์์คํ ์ ๋๋ค.
๊ณ ๊ธ Headless ์คํ ํจํด
# ํ๊ฒฝ๋ณ ์ ์ํ ๋ถ์
claude --headless --context production \
"ํ๋ก๋์
๋ฐฐํฌ๋ฅผ ์ํ ์ข
ํฉ ์ํ๋ ํ๊ฐ๋ฅผ ์ํํด์ฃผ์ธ์.
๋ณด์, ์ฑ๋ฅ, ์์ ์ฑ, ๋น์ฆ๋์ค ์ํฉํธ๋ฅผ ์ข
ํฉ ๋ถ์ํ๊ณ
๋ฐฐํฌ ์น์ธ ์ฌ๋ถ๋ฅผ JSON ํํ๋ก ์ ๊ณตํด์ฃผ์ธ์."
# ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๋ถ์
claude --headless --stream --output-format json \
"๋์ฉ๋ ์ฝ๋ ๋ณ๊ฒฝ์ฌํญ์ ์ค์๊ฐ์ผ๋ก ๋ถ์ํ๋ฉฐ
์ค์ํ ์ด์ ๋ฐ๊ฒฌ ์ ์ฆ์ ์๋ฆผ์ ์ ๊ณตํด์ฃผ์ธ์."
# ์ง๋ฅํ ์กฐ๊ฑด๋ถ ์คํ
#!/bin/bash
# advanced-quality-gate.sh
set -euo pipefail
# ํ๊ฒฝ ๊ฐ์ง ๋ฐ ์ค์
DETECT_ENV=$(claude --headless --quiet \
"ํ์ฌ Git ๋ธ๋์น์ ๋ณ๊ฒฝ์ฌํญ์ ๋ถ์ํ์ฌ
์ ์ ํ ํ์ง ๊ฒ์ฆ ์์ค์ ๊ฒฐ์ ํด์ฃผ์ธ์ (minimal/standard/strict)")
case $DETECT_ENV in
"strict")
QUALITY_THRESHOLD=95
SECURITY_SCAN=true
PERFORMANCE_TEST=true
;;
"standard")
QUALITY_THRESHOLD=85
SECURITY_SCAN=true
PERFORMANCE_TEST=false
;;
"minimal")
QUALITY_THRESHOLD=75
SECURITY_SCAN=false
PERFORMANCE_TEST=false
;;
esac
# ์ ์ํ ํ์ง ๋ถ์
QUALITY_RESULT=$(claude --headless --output quality-report.json \
"์ฝ๋ ํ์ง์ $QUALITY_THRESHOLD% ๊ธฐ์ค์ผ๋ก ๋ถ์ํด์ฃผ์ธ์.
๊ธฐ์ค: ๋ณต์ก๋, ์ค๋ณต๋, ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง, ๋ฌธ์ํ ์์ค
๊ฒฐ๊ณผ: pass/fail๊ณผ ์์ธ ๊ฐ์ ๋ฐฉ์")
# ์กฐ๊ฑด๋ถ ๋ณด์ ์ค์บ
if [ "$SECURITY_SCAN" = true ]; then
SECURITY_RESULT=$(claude --headless --output security-report.json \
"OWASP Top 10๊ณผ SANS Top 25 ๊ธฐ์ค์ผ๋ก
๋ณด์ ์ทจ์ฝ์ ์ ์ข
ํฉ ๋ถ์ํด์ฃผ์ธ์.
์ฌ๊ฐ๋๋ณ ๋ถ๋ฅ์ ์์ ์ฐ์ ์์ ํฌํจ")
fi
# ์ง๋ฅํ ์์ฌ๊ฒฐ์
DECISION=$(claude --headless \
"ํ์ง ๋ฆฌํฌํธ์ ๋ณด์ ๋ฆฌํฌํธ๋ฅผ ์ข
ํฉํ์ฌ
๋ฐฐํฌ ์น์ธ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ฃผ์ธ์.
๊ฒฐ์ ๊ทผ๊ฑฐ์ ํจ๊ป ๋ช
ํํ approve/reject ๋ต๋ณ")
if [[ $DECISION == *"approve"* ]]; then
echo "โ
ํ์ง ๊ฒ์ดํธ ํต๊ณผ - ๋ฐฐํฌ ์น์ธ"
exit 0
else
echo "โ ํ์ง ๊ฒ์ดํธ ์คํจ - ๊ฐ์ ํ์"
claude --headless "๊ฐ์ ๋ฐฉ์๊ณผ ์์ ์์ ์๊ฐ์ ์ ์ํด์ฃผ์ธ์"
exit 1
fi
์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ ๊ตฌ์ฑ ๊ด๋ฆฌ
๋ค์ธต ๊ตฌ์ฑ ์์คํ
# ๊ธฐ๋ณธ ํ๊ฒฝ ๋ณ์ (๋ชจ๋ ํ๊ฒฝ ๊ณตํต)
export CLAUDE_API_KEY="sk-ant-..."
export CLAUDE_MODEL="claude-3-sonnet-20240229" # ๋น์ฉ ํจ์จ์ ๊ธฐ๋ณธ ๋ชจ๋ธ
export CLAUDE_HEADLESS=true
export CLAUDE_TIMEOUT=300 # 5๋ถ ํ์์์
export CLAUDE_RETRY_COUNT=3
export CLAUDE_LOG_LEVEL="info"
# ํ๊ฒฝ๋ณ ์ธ๋ถ ๊ตฌ์ฑ
case "$ENVIRONMENT" in
"production")
export CLAUDE_MODEL="claude-3-opus-20240229" # ์ต๊ณ ํ์ง
export CLAUDE_OUTPUT_FORMAT="structured-json"
export CLAUDE_VALIDATION_STRICT=true
export CLAUDE_AUDIT_ENABLED=true
;;
"staging")
export CLAUDE_MODEL="claude-3-sonnet-20240229"
export CLAUDE_OUTPUT_FORMAT="json"
export CLAUDE_VALIDATION_STANDARD=true
;;
"development")
export CLAUDE_MODEL="claude-3-haiku-20240307" # ๋น ๋ฅธ ๋ฐ์
export CLAUDE_OUTPUT_FORMAT="markdown"
export CLAUDE_VALIDATION_MINIMAL=true
;;
esac
# ํ๋ก์ ํธ๋ณ ์ปจํ
์คํธ ๊ตฌ์ฑ
export CLAUDE_PROJECT_TYPE="web-application"
export CLAUDE_TECH_STACK="react,node,typescript,postgresql"
export CLAUDE_TEAM_SIZE="12"
export CLAUDE_COMPLIANCE_LEVEL="SOC2" # SOC2, HIPAA, PCI-DSS ๋ฑ
export CLAUDE_QUALITY_GATES="security,performance,accessibility"
# ๊ณ ๊ธ ๊ธฐ๋ฅ ์ค์
export CLAUDE_CACHE_ENABLED=true
export CLAUDE_CACHE_TTL=3600 # 1์๊ฐ
export CLAUDE_PARALLEL_ANALYSIS=true
export CLAUDE_MAX_CONCURRENT=4
export CLAUDE_MEMORY_LIMIT="2GB"
# ๋ณด์ ๋ฐ ๊ท์ ์ค์
export CLAUDE_DATA_RESIDENCY="us-east-1"
export CLAUDE_PII_DETECTION=true
export CLAUDE_SENSITIVE_DATA_MASKING=true
export CLAUDE_AUDIT_LOG_RETENTION="90d"
๋์ ๊ตฌ์ฑ ๋ก๋
#!/bin/bash
# claude-config-loader.sh
# ํ๋ก์ ํธ๋ณ ๋์ ๊ตฌ์ฑ ๋ก๋
load_claude_config() {
local project_root="$(git rev-parse --show-toplevel)"
local config_file="$project_root/.claude/ci-config.json"
if [[ -f "$config_file" ]]; then
# JSON ๊ตฌ์ฑ ํ์ผ์์ ํ๊ฒฝ ๋ณ์ ๋ก๋
eval "$(jq -r 'to_entries[] | "export CLAUDE_\(.key | ascii_upcase)=\(.value)"' "$config_file")"
fi
# Git ๋ฉํ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์๋ ์ค์
export CLAUDE_GIT_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
export CLAUDE_GIT_COMMIT="$(git rev-parse HEAD)"
export CLAUDE_GIT_AUTHOR="$(git log -1 --pretty=format:'%an')"
# ํ๋ก์ ํธ ๊ท๋ชจ ์๋ ํ์ง
local file_count=$(find . -name "*.ts" -o -name "*.js" -o -name "*.py" | wc -l)
if (( file_count > 1000 )); then
export CLAUDE_PROJECT_SCALE="large"
export CLAUDE_ANALYSIS_DEPTH="comprehensive"
elif (( file_count > 100 )); then
export CLAUDE_PROJECT_SCALE="medium"
export CLAUDE_ANALYSIS_DEPTH="standard"
else
export CLAUDE_PROJECT_SCALE="small"
export CLAUDE_ANALYSIS_DEPTH="focused"
fi
}
# ์ฌ์ฉ๋ฒ
load_claude_config
- hookify ํ๋ฌ๊ทธ์ธ: Hook ๊ท์น ์๋ ์์ฑ โ PreToolUse/PostToolUse ํจํด ์์ฑ
[S3WF2(์น์ 17)] ๊ณ ๊ธ ๊ฟํ & ์ํฌํ๋ก์ฐ
7.3 ๋น์ฃผ์ผ ๋์์ธ ๊ตฌํ ์ํฌํ๋ก์ฐ
๋น์ฃผ์ผ ๋์์ธ์ ์ ํํ๊ณ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ก ๊ตฌํํ๋ ๊ฒ์ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํต์ฌ ์ญ๋์ ๋๋ค. Claude Code๋ ๋์์ธ ์๋๋ฅผ ์ ํํ ํ์ ํ๊ณ , ๋ฐ์ํ ๋ ์ด์์๊ณผ ์ธํฐ๋์ ๊น์ง ๊ณ ๋ คํ ์์ฑ๋ ๋์ ๊ตฌํ์ ์ง์ํฉ๋๋ค.
๋์์ธ์ ์ฝ๋๋ก
์ฒด๊ณ์ ์ธ ๋์์ธ ๊ตฌํ ์ํฌํ๋ก์ฐ๋ ๋์์ด๋์ ๊ฐ๋ฐ์ ๊ฐ์ ํ์ ์ ์ํํ๊ฒ ํ๊ณ , ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
1. ์คํฌ๋ฆฐ์ท ๊ธฐ๋ฐ ๊ฐ๋ฐ
# ๋์์ธ ํ์ผ ์ ๊ณต
claude "์ด Figma ๋์์ธ ์คํฌ๋ฆฐ์ท์ ๋ณด๊ณ
React ์ปดํฌ๋ํธ๋ก ๊ตฌํํด์ค.
๋ฐ์ํ ๋์์ธ๊ณผ ๋คํฌ ๋ชจ๋๋ ์ง์ํด์ผ ํด"
2. ๋ฐ๋ณต์ ๊ฐ์
# ์ด๊ธฐ ๊ตฌํ
claude "๊ธฐ๋ณธ ๋ ์ด์์๊ณผ ์คํ์ผ์ ๋จผ์ ๊ตฌํํด์ค"
# ์ธ๋ถ ์กฐ์
claude "ํจ๋ฉ์ ์กฐ๊ธ ๋๋ฆฌ๊ณ , ํฐํธ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด์ค.
ํธ๋ฒ ํจ๊ณผ์ ํธ๋์ง์
๋ ์ถ๊ฐํด์ค"
# ์ธํฐ๋์
์ถ๊ฐ
claude "ํด๋ฆญ ์ ์ ๋๋ฉ์ด์
๊ณผ ๋ก๋ฉ ์ํ๋ฅผ ์ถ๊ฐํด์ค"
์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ถ
claude "๋์์ธ ์์คํ
์ ๊ธฐ๋ฐ์ผ๋ก ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ค.
Button, Card, Modal ๋ฑ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๊ณ ,
Storybook์ผ๋ก ๋ฌธ์ํํด์ค"
7.4 ๋ฆฌํฉํ ๋ง๊ณผ ์ฝ๋ ํ์ง ๊ฐ์
๋ฆฌํฉํ ๋ง์ ์ฝ๋์ ์ธ๋ถ ๋์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ๋ ์ค์ํ ํ๋์ ๋๋ค. Claude Code๋ ์ฝ๋ ์ค๋ฉ์ ์๋์ผ๋ก ํ์งํ๊ณ , ์์ ํ ๋ฆฌํฉํ ๋ง ์ ๋ต์ ์ ์ํ๋ฉฐ, ์ง์์ ์ธ ์ฝ๋ ํ์ง ํฅ์์ ์ง์ํฉ๋๋ค.
์ฒด๊ณ์ ์ธ ๋ฆฌํฉํ ๋ง
ํจ๊ณผ์ ์ธ ๋ฆฌํฉํ ๋ง์ ๋จ์ํ ์ฝ๋ ์ ๋ฆฌ๋ฅผ ๋์ด์, ์์คํ ์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ํฌ๊ฒ ํฅ์์ํค๋ ์ ๋ต์ ํ๋์ ๋๋ค.
1. ์ฝ๋ ์ค๋ฉ ํ์ง
claude "์ด ์ฝ๋๋ฒ ์ด์ค์์ ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ถ๋ถ์ ์ฐพ์์ค.
๋ค์์ ์ค์ ์ ์ผ๋ก ํ์ธํด์ค
- ์ค๋ณต ์ฝ๋
- ๊ธด ํจ์
- ๋ณต์กํ ์กฐ๊ฑด๋ฌธ
- ๋ถ์ ์ ํ ์ด๋ฆ"
2. ๋จ๊ณ๋ณ ๋ฆฌํฉํ ๋ง
# 1๋จ๊ณ: ํ
์คํธ ํ๋ณด
claude "๋ฆฌํฉํ ๋ง ์ ์ ํ์ฌ ๋์์ ๋ณด์ฅํ๋ ํ
์คํธ๋ฅผ ์์ฑํด์ค"
# 2๋จ๊ณ: ์์ ๋จ์๋ก ๊ฐ์
claude "ํ ๋ฒ์ ํ๋์ฉ ๋ฆฌํฉํ ๋ง์ ์งํํด์ค.
๊ฐ ๋จ๊ณ๋ง๋ค ํ
์คํธ๊ฐ ํต๊ณผํ๋์ง ํ์ธํด์ค"
# 3๋จ๊ณ: ์ฑ๋ฅ ๊ฒ์ฆ
claude "๋ฆฌํฉํ ๋ง ์ ํ์ ์ฑ๋ฅ์ ๋น๊ตํด์ค.
๋ฒค์น๋งํฌ๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ํด์ค"
์ฝ๋ ํ์ง ๋ฉํธ๋ฆญ
claude "์ฝ๋ ํ์ง์ ์ธก์ ํ๊ณ ๊ฐ์ ๋ฐฉ์์ ์ ์ํด์ค
- ์ํ ๋ณต์ก๋
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง
- ๊ธฐ์ ๋ถ์ฑ
- ์์กด์ฑ ๋ณต์ก๋"
7.5 ๋ฌธ์ํ ์๋ํ
๋ฌธ์ํ๋ ์ฝ๋์ ์ง์์ ์ธ ์ ์ง๋ณด์์ ํ ํ์ ์ ํ์์ ์ธ ์์์ ๋๋ค. Claude Code๋ ์ฝ๋์์ ์๋์ผ๋ก ๋ฌธ์๋ฅผ ์์ฑํ๊ณ , ์๊ฐ์ ๋ค์ด์ด๊ทธ๋จ์ ์์ฑํ์ฌ ๋ณต์กํ ์์คํ ์ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฌธ์ํ ์๋ํ๋ฅผ ์ง์ํฉ๋๋ค.
์ฝ๋์์ ๋ฌธ์๋ก
ํจ๊ณผ์ ์ธ ๋ฌธ์ํ๋ ์ฝ๋์ ํจ๊ป ์งํํ๋ฉฐ, ๊ฐ๋ฐ์์ ์์์ ์ ์ต์ํํ๋ฉด์๋ ํญ์ ์ต์ ์ํ๋ฅผ ์ ์งํด์ผ ํฉ๋๋ค.
1. API ๋ฌธ์ ์๋ ์์ฑ
claude "์ฝ๋๋ฅผ ๋ถ์ํด์ API ๋ฌธ์๋ฅผ ์๋์ผ๋ก ์์ฑํด์ค.
OpenAPI(Swagger) ์คํ์ผ๋ก ๋ง๋ค๊ณ ,
์์ ์์ฒญ/์๋ต๋ ํฌํจํด์ค"
2. ์ฝ๋ ์ฃผ์์์ ๋ฌธ์๋ก
claude "JSDoc/TSDoc ์ฃผ์์ ํ์ฑํด์
๊ฐ๋ฐ์ ๋ฌธ์๋ฅผ ์์ฑํด์ค.
ํจ์ ์ค๋ช
, ํ๋ผ๋ฏธํฐ, ๋ฐํ๊ฐ, ์์ ๋ฅผ ํฌํจํด์ค"
๋ค์ด์ด๊ทธ๋จ ์์ฑ
claude "์์คํ
์ํคํ
์ฒ๋ฅผ Mermaid ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๊ทธ๋ ค์ค.
์ปดํฌ๋ํธ ๊ฐ ๊ด๊ณ์ ๋ฐ์ดํฐ ํ๋ฆ์ ํ์ํด์ค"
์ค์ ์ํฌํ๋ก์ฐ: ๊ธฐ๋ฅ ์ถ๊ฐ ์๋๋ฆฌ์ค
์ค์ ๊ฐ๋ฐ ํ๊ฒฝ์์ EPCC ์ํฌํ๋ก์ฐ๊ฐ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ๊ตฌ์ฒด์ ์ธ ์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์๋ก์ด ๊ฒฐ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ 3์ผ๊ฐ์ ์ ์ฒด ์ํฌํ๋ก์ฐ๋ฅผ ํตํด ๊ฐ ๋จ๊ณ๋ณ Claude Code ํ์ฉ๋ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ ๊ฐ์: ์๋ก์ด ๊ฒฐ์ ๊ธฐ๋ฅ ์ถ๊ฐ
๋ณต์กํ ๊ธฐ๋ฅ ๊ฐ๋ฐ ์ ์ฒด๊ณ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด ์ด๋ป๊ฒ ์ํ์ ์ค์ด๊ณ ํ์ง์ ํฅ์์ํค๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
gantt
title 3์ผ๊ฐ ๊ฒฐ์ ๊ธฐ๋ฅ ์ถ๊ฐ ์ํฌํ๋ก์ฐ
dateFormat X
axisFormat %d
section Day 1: ํ์๊ณผ ๊ณํ
๊ธฐ์กด ์์คํ
๋ถ์ :active, d1-morning, 0, 1
๊ฒฐ์ ๊ธฐ๋ฅ ์ค๊ณ :d1-afternoon, after d1-morning, 1
์ํคํ
์ฒ ๋ฌธ์ํ :d1-doc, after d1-afternoon, 1
section Day 2: ๊ตฌํ
๋ฐฑ์๋ API ๊ฐ๋ฐ :d2-backend, 1, 1
ํ๋ก ํธ์๋ UI :d2-frontend, after d2-backend, 1
๋จ์ ํ
์คํธ ์์ฑ :d2-test, after d2-frontend, 1
section Day 3: ํตํฉ๊ณผ ๋ฐฐํฌ
ํตํฉ ํ
์คํธ :d3-integration, 2, 1
E2E ํ
์คํธ :d3-e2e, after d3-integration, 1
๋ฌธ์ํ ๋ฐ ๋ฐฐํฌ ์ค๋น :d3-deploy, after d3-e2e, 1
Day 1: ํ์๊ณผ ๊ณํ
[S3WF3] Review-Evaluate Loop โ 97์ ์ํ ํ๊ฐ
- review-evaluate-core ์คํฌ: ๊ฒํ ๋ฐ 5๊ธฐ์ค ํ๊ฐ โ 97์ ๋๋ฌ๊น์ง ์ํ ๋ฃจํ (์ต์ 3ํ)
- ์ฝ๋ ํ์ง, ๊ธฐ๋ฅ ์์ฑ๋, ๋ณด์, ์ฑ๋ฅ, ๋ฌธ์ํ ๊ธฐ์ค ์๋ ์ฑ์
[S3WF4] Books โ ๊ณ ๊ธ ์ํฌํ๋ก์ฐ ํ์ต
- 1๊ถ 21ํธ: Hooks โ Hooks ์์คํ ๊ณ ๊ธ ์๋ํ ํจํด
- 1๊ถ 27ํธ: GitHub Actions์ Agent SDK โ ์ปค์คํ ์์ด์ ํธ SDK ์ํฌํ๋ก์ฐ ๊ตฌ์ถ
- 1๊ถ 28ํธ: ์๋ํ ์ฝ๋ ์์ฑ โ ๋๊ท๋ชจ ์ฝ๋ ์์ฑ ํ์ดํ๋ผ์ธ ์๋ํ
- 3๊ถ 09ํธ: SAL Grid ๋งค๋ด์ผ ํ์ฉ๋ฒ โ ๋งค๋ด์ผ ๊ธฐ๋ฐ ๊ณ ๊ธ ์ํฌํ๋ก์ฐ ์ด์
- 3๊ถ 10ํธ: Order Sheet ์ ๋ โ Order Sheet ์๋ํ ์ํฌํ๋ก์ฐ
- 3๊ถ 12ํธ: Orders Reports JSON ์์คํ โ JSON ๊ธฐ๋ฐ ์์ ์ถ์ ์๋ํ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S3WF5] ์ค์ Tips โ ๊ฐ๋ฐ/๋ฐฑ์ /์ธ์ ๊ณ ๊ธ
๊ฐ๋ฐ_์ค๋ฌด/โ ์ฝํ ์ธ ์๋ํ, ๊ท์น ๊ตฌํ ๊ณ ๊ธ ํจํด (14๊ฐ ์ค ์ฌํ)์์ _๊ธฐ๋ก_๋ฐฑ์ /โ Orders/Reports ์๋ํ, outbox ์ด์ฉ, ๋ฐฑ์ ์ ๋ต ๊ณ ๊ธ (6๊ฐ)์ธ์ _๊ด๋ฆฌ/โ ๋ณ๋ ฌ ์ธ์คํด์ค ๊ณ ๊ธ ์ด์ฉ, ๋ณต๊ตฌ ์ ๋ต (6๊ฐ)
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S3WF6] Custom Skills โ ์ปค์คํ ์คํฌ ์ฌํ 3์ข
ai-tutor-build(SKILL.md) โ AI ํํฐ ๋น๋ ์๋ํ ์ํฌํ๋ก์ฐdeal-news(SKILL.md) โ ๋ด์ค ์์ง ์๋ํ ์ํฌํ๋ก์ฐyoutube-generate(SKILL.md) โ ์ ํ๋ธ ์ฝํ ์ธ ์๋ ์์ฑ ์ํฌํ๋ก์ฐ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Custom_Skills/
[S3WF7] .claude ์ฐธ๊ณ โ Methods/Commands ๊ณ ๊ธ
- methods:
01_supabase-crud.mdโ REST API ํ์ดํ๋ผ์ธ ์๋ํ (์๋ฌ ์ฌ์๋, ๋ฐฐ์น ์ฒ๋ฆฌ, ํธ๋์ญ์ ) - commands: 15๊ฐ ๋ช
๋ น์ด ์ฒด์ด๋ ๊ณ ๊ธ ํจํด โ ์ํฌํ๋ก์ฐ ์๋ํ ์กฐํฉ (
commitโdeployโtestํ์ดํ๋ผ์ธ), ์ปค์คํ ๋ช ๋ น์ด ํ์ฅ
๐ ๊ฒฝ๋ก:.claude/methods/,.claude/commands/
S3TO โ ํ์ด์ฉ (Team Operations)
[S3TO1(์น์ 08)] Agent Teams โ ๋ฉํฐ ์์ด์ ํธ ํ์
8.3 ๋ง์ดํฌ๋ก์๋น์ค ๋์ ๊ฐ๋ฐ
์๋น์ค๋ณ ๊ฐ๋ฐ ํ๊ฒฝ ๋ถ๋ฆฌ
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}, "flowchart": {"htmlLabels": false, "useMaxWidth": false}}}%%
graph TB
subgraph project [๋ง์ดํฌ๋ก์๋น์ค ํ๋ก์ ํธ ๊ตฌ์กฐ]
A[user-service<br/>Terminal 1<br/>์ฌ์ฉ์ ๊ด๋ฆฌ]
B[product-service<br/>Terminal 2<br/>์ํ ๊ด๋ฆฌ]
C[order-service<br/>Terminal 3<br/>์ฃผ๋ฌธ ์ฒ๋ฆฌ]
D[payment-service<br/>Terminal 4<br/>๊ฒฐ์ ์ฒ๋ฆฌ]
E[api-gateway<br/>Terminal 5<br/>ํตํฉ ๊ด๋ฆฌ]
end
subgraph terminals [๋ณ๋ ฌ ๊ฐ๋ฐ ํ๊ฒฝ]
T1[Claude Instance 1<br/>์ฌ์ฉ์ ์ธ์ฆ ๋ฐ ํ๋กํ]
T2[Claude Instance 2<br/>์ํ ์นดํ๋ก๊ทธ ๋ฐ ๊ฒ์]
T3[Claude Instance 3<br/>์ฃผ๋ฌธ ์ํฌํ๋ก์ฐ]
T4[Claude Instance 4<br/>๊ฒฐ์ ํตํฉ]
T5[Claude Instance 5<br/>API ๋ผ์ฐํ
๋ฐ ๋ณด์]
end
A -.-> T1
B -.-> T2
C -.-> T3
D -.-> T4
E -.-> T5
T1 --> T5
T2 --> T5
T3 --> T5
T4 --> T5
classDef serviceStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef terminalStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C,D,E serviceStyle
class T1,T2,T3,T4,T5 terminalStyle
์๋น์ค ๊ฐ ํต์ ๊ด๋ฆฌ
API ๊ฒ์ดํธ์จ์ด ๊ฐ๋ฐ
# Terminal 1 (API Gateway)
claude "API Gateway๋ฅผ ๊ตฌํํด์ค.
๋ผ์ฐํ
, ์ธ์ฆ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ๋ชจ๋ํฐ๋ง์ ํฌํจํด์ค"
๊ฐ๋ณ ์๋น์ค ๊ฐ๋ฐ
# Terminal 2 (User Service)
claude "์ฌ์ฉ์ ๊ด๋ฆฌ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ฐ๋ฐํด์ค.
ํ์๊ฐ์
, ๋ก๊ทธ์ธ, ํ๋กํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ํฌํจํด์ค"
# Terminal 3 (Product Service)
claude "์ํ ๊ด๋ฆฌ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ฐ๋ฐํด์ค.
์ํ CRUD, ์ฌ๊ณ ๊ด๋ฆฌ, ๊ฒ์ ๊ธฐ๋ฅ์ ํฌํจํด์ค"
์๋น์ค ๊ฐ ๊ณ์ฝ ๊ด๋ฆฌ
# OpenAPI ์คํ ๋๊ธฐํ
claude "๊ฐ ์๋น์ค์ OpenAPI ์คํ์ ์์ฑํ๊ณ ,
API Gateway์์ ํตํฉ ๋ฌธ์๋ฅผ ๋ง๋ค์ด์ค"
8.4 ํ๋ก ํธ์๋-๋ฐฑ์๋ ๋ณ๋ ฌ ์์
API ์ฐ์ ๊ฐ๋ฐ
1๋จ๊ณ: API ์คํ ์ ์
# ๊ณตํต ์์
claude "์ฌ์ฉ์ ๊ด๋ฆฌ API์ OpenAPI ์คํ์ ์ ์ํด์ค.
์๋ํฌ์ธํธ, ์์ฒญ/์๋ต ์คํค๋ง, ์๋ฌ ์ฝ๋๋ฅผ ํฌํจํด์ค"
2๋จ๊ณ: ๋ณ๋ ฌ ๊ฐ๋ฐ
# Terminal 1 (Backend)
claude "์ ์๋ API ์คํ์ ๋ฐ๋ผ ๋ฐฑ์๋๋ฅผ ๊ตฌํํด์ค.
Mock ๋ฐ์ดํฐ๋ก ๋จผ์ ๋์ํ๊ฒ ๋ง๋ค์ด์ค"
# Terminal 2 (Frontend)
claude "API ์คํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก ํธ์๋๋ฅผ ๊ตฌํํด์ค.
MSW๋ฅผ ์ฌ์ฉํด์ API๋ฅผ ๋ชจํนํด์ค"
ํ์ ๊ณต์ ์ ๋ต
# ๊ณตํต ํ์
์ ์
claude "๋ฐฑ์๋์ ํ๋ก ํธ์๋์์ ๊ณต์ ํ ํ์
์ ์๋ฅผ ๋ง๋ค์ด์ค.
Zod ์คํค๋ง์์ TypeScript ํ์
์ ์๋ ์์ฑํ๋๋ก ํด์ค"
์ค์๊ฐ ๋๊ธฐํ
# API ๋ณ๊ฒฝ ์ ์๋ ์
๋ฐ์ดํธ
claude "๋ฐฑ์๋ API๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํ๋ก ํธ์๋ ํ์
๋
์๋์ผ๋ก ์
๋ฐ์ดํธํ๋ ์์คํ
์ ๊ตฌ์ถํด์ค"
- project-manager-agent: ํ๋ก์ ํธ ๋งค๋์ ์์ด์ ํธ ์ญํ โ ์ผ์ /์ฐ์ ์์/์์กด์ฑ ์กฐ์จ
[S3TO2(์น์ 26)] MCP ์๋ฒ ์ค์ ํ์ฉ 10์ข (์ธ๋ถ AI ์ฐ๋)
11.7 ๋ค์ค ํด๋ผ์ฐ๋ ํ๊ฒฝ ์ค์
ํ๋์ ์ธ ์ํฐํ๋ผ์ด์ฆ ํ๊ฒฝ์์๋ ๋ค์ํ ํด๋ผ์ฐ๋ ํ๋ก๋ฐ์ด๋๋ฅผ ํ์ฉํ ์ ์ฐํ ์ธํ๋ผ ๊ตฌ์ฑ์ด ์ค์ํฉ๋๋ค. Claude Code Action์ ์ง์ Anthropic API๋ฟ๋ง ์๋๋ผ AWS Bedrock๊ณผ Google Vertex AI๋ฅผ ํตํ ์ ๊ทผ๋ ์ง์ํ์ฌ, ์กฐ์ง์ ํด๋ผ์ฐ๋ ์ ๋ต์ ๋ง๋ ์ต์ ์ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
AWS Bedrock ํตํฉ
AWS Bedrock์ ํตํ Claude ์ ๊ทผ์ AWS์ ๋ณด์ ๋ฐ ๊ท์ ์ค์ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
OIDC ๊ธฐ๋ฐ Bedrock ์ค์
# AWS Bedrock์ ํตํ Claude Code Action
name: Claude via AWS Bedrock
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
permissions:
id-token: write # OIDC ํ ํฐ ์์ฑ์ ์ํด ํ์
contents: write
pull-requests: write
issues: write
jobs:
claude-bedrock:
runs-on: ubuntu-latest
environment: production
steps:
- name: Configure AWS Credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
role-session-name: claude-code-action
aws-region: us-west-2
- name: Validate AWS Permissions
run: |
# Bedrock ์ ๊ทผ ๊ถํ ํ์ธ
aws bedrock list-foundation-models --region us-west-2
# Cross-region inference ๊ถํ ํ์ธ
aws bedrock list-inference-profiles --region us-west-2
- name: Generate GitHub App Token
id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
- uses: anthropics/claude-code-action@beta
with:
github_token: ${{ steps.app-token.outputs.token }}
model: "anthropic.claude-3-7-sonnet-20250219-beta:0" # Cross-region inference
use_bedrock: "true"
timeout_minutes: 45
custom_instructions: |
AWS Bedrock ํ๊ฒฝ์์ ์คํ ์ค์
๋๋ค.
๋ค์ AWS ํนํ ๊ณ ๋ ค์ฌํญ์ ์ ์ฉํด์ฃผ์ธ์
- AWS ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก ์ค์
- CloudTrail ๋ก๊น
๊ณ ๋ ค
- VPC ๋คํธ์ํฌ ์ ์ฑ
์ธ์
- AWS ๋ฆฌ์์ค ํ๊น
ํ์ค ์ ์ฉ
AWS IAM ์ญํ ๊ณผ ์ ์ฑ ์ค์
# AWS IAM ์ค์ ์ต์ ํ
claude "Claude Code Action์ ์ํ AWS IAM ์ค์ ์ ์ต์ ํํด์ค.
๋ค์์ ํฌํจํด์ค
IAM ์ญํ ์ ์
- GitHub Actions์ฉ OIDC ์ ๋ขฐ ๊ด๊ณ
- Bedrock ๋ชจ๋ธ ์ ๊ทผ ๊ถํ
- CloudWatch ๋ก๊น
๊ถํ
- ์ต์ ๊ถํ ์์น ์ ์ฉ
๋ณด์ ๊ฐํ ์ค์
- ์กฐ๊ฑด๋ถ ์ ๊ทผ ์ ์ด
- ๋ฆฌ์์ค ๊ธฐ๋ฐ ์ ์ฑ
- ์๊ฐ ๊ธฐ๋ฐ ์ ๊ทผ ์ ํ
- IP ์ฃผ์ ํ์ดํธ๋ฆฌ์คํธ
Cross-region inference ์ค์
- ๋ค์ค ๋ฆฌ์ ๋ชจ๋ธ ์ ๊ทผ
- ์ง์ฐ ์๊ฐ ์ต์ ํ
- ๊ฐ์ฉ์ฑ ํฅ์ ์ ๋ต
- ๋น์ฉ ์ต์ ํ ๊ณ ๋ ค์ฌํญ"
Google Vertex AI ํตํฉ
Google Cloud์ AI/ML ํ๋ซํผ์ธ Vertex AI๋ฅผ ํตํ Claude ์ ๊ทผ ์ค์
Vertex AI OIDC ์ค์
# Google Vertex AI๋ฅผ ํตํ Claude Code Action
name: Claude via Google Vertex AI
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
permissions:
id-token: write # OIDC ํ ํฐ ์์ฑ์ ์ํด ํ์
contents: write
pull-requests: write
issues: write
jobs:
claude-vertex:
runs-on: ubuntu-latest
environment: production
steps:
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}
- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v2
- name: Validate GCP Permissions
run: |
# Vertex AI ์ ๊ทผ ๊ถํ ํ์ธ
gcloud ai models list --region=us-central1
# ํ๋ก์ ํธ ์ค์ ํ์ธ
gcloud config list project
- name: Generate GitHub App Token
id: app-token
uses: actions/create-github-app-token@v2
with:
app-id: ${{ secrets.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
- uses: anthropics/claude-code-action@beta
with:
github_token: ${{ steps.app-token.outputs.token }}
model: "claude-3-7-sonnet@20250219"
use_vertex: "true"
timeout_minutes: 45
custom_instructions: |
Google Vertex AI ํ๊ฒฝ์์ ์คํ ์ค์
๋๋ค.
๋ค์ GCP ํนํ ๊ณ ๋ ค์ฌํญ์ ์ ์ฉํด์ฃผ์ธ์
- Google Cloud ๋ณด์ ๋ชจ๋ฒ ์ฌ๋ก ์ค์
- Cloud Audit Logs ์ธ์
- VPC ๋ฐ ๋ฐฉํ๋ฒฝ ์ ์ฑ
๊ณ ๋ ค
- Google Cloud ๋ฆฌ์์ค ๋ผ๋ฒจ๋ง ํ์ค ์ ์ฉ
๋ฉํฐ ํด๋ผ์ฐ๋ ์ ๋ต๊ณผ ํ์ผ์ค๋ฒ
์ง๋ฅํ ํด๋ผ์ฐ๋ ์ ํ๊ณผ ์ฅ์ ์กฐ์น
# ๋ฉํฐ ํด๋ผ์ฐ๋ ์ํคํ
์ฒ ์ค๊ณ
claude "Claude Code Action์ ์ํ ๋ฉํฐ ํด๋ผ์ฐ๋ ์ ๋ต์ ์ค๊ณํด์ค.
๋ค์ ์์๋ฅผ ํฌํจํด์ค
ํด๋ผ์ฐ๋ ์ ํ ๊ธฐ์ค
- ์ง์ญ๋ณ ๊ฐ์ฉ์ฑ๊ณผ ์ง์ฐ ์๊ฐ
- ๋น์ฉ ํจ์จ์ฑ๊ณผ ์์ฐ ๊ด๋ฆฌ
- ๊ท์ ์ค์ ์๊ตฌ์ฌํญ
- ์ฑ๋ฅ๊ณผ ์ฒ๋ฆฌ๋ ํน์ฑ
- ์ฅ์ ๋ณต๊ตฌ ๋ฅ๋ ฅ
ํ์ผ์ค๋ฒ ์๋๋ฆฌ์ค
- Primary: Direct Anthropic API
- Secondary: AWS Bedrock (if primary fails)
- Tertiary: Google Vertex AI (if both fail)
์๋ ์ ํ ๋ก์ง
- ์ํ ๋ชจ๋ํฐ๋ง๊ณผ ํฌ์ค์ฒดํฌ
- ์ง๋ฅํ ๋ผ์ฐํ
์๊ณ ๋ฆฌ์ฆ
- ์ฑ๋ฅ ๊ธฐ๋ฐ ๋์ ์ ํ
- ๋น์ฉ ์ต์ ํ ๊ณ ๋ ค
- ์ฌ์ฉ์ ๊ฒฝํ ์ฐ์ ์์"
๋์ ํด๋ผ์ฐ๋ ์ ํ ์ํฌํ๋ก์ฐ
# ์ง๋ฅํ ํด๋ผ์ฐ๋ ์ ํ ์์คํ
name: Smart Cloud Selection
on:
issue_comment:
types: [created]
jobs:
cloud-selection:
runs-on: ubuntu-latest
outputs:
selected_cloud: ${{ steps.selector.outputs.cloud }}
steps:
- name: Cloud Status Check
id: selector
run: |
# ๊ฐ ํด๋ผ์ฐ๋ ์๋น์ค ์ํ ํ์ธ
ANTHROPIC_STATUS=$(curl -s https://status.anthropic.com/api/v2/status.json | jq -r '.status.indicator')
AWS_STATUS=$(curl -s https://status.aws.amazon.com/rss/bedrock-us-west-2.rss | grep -c "operational" || echo 0)
GCP_STATUS=$(curl -s https://status.cloud.google.com/incidents.json | jq -r '.incidents | length')
# ์ง์ญ๋ณ ์ง์ฐ ์๊ฐ ์ธก์
ANTHROPIC_LATENCY=$(curl -w "%{time_total}" -s -o /dev/null https://api.anthropic.com/v1/models || echo 999)
# ๋น์ฉ ๊ณ ๋ ค์ฌํญ (์๊ฐ๋๋ณ ์๊ธ ์ฐจ์ด)
HOUR=$(date +%H)
if [[ $HOUR -ge 9 && $HOUR -le 17 ]]; then
COST_FACTOR="peak"
else
COST_FACTOR="off-peak"
fi
# ์ง๋ฅํ ์ ํ ๋ก์ง
if [[ "$ANTHROPIC_STATUS" == "none" && $ANTHROPIC_LATENCY -lt 2 ]]; then
echo "cloud=anthropic" >> $GITHUB_OUTPUT
elif [[ $AWS_STATUS -gt 0 ]]; then
echo "cloud=bedrock" >> $GITHUB_OUTPUT
elif [[ $GCP_STATUS -eq 0 ]]; then
echo "cloud=vertex" >> $GITHUB_OUTPUT
else
echo "cloud=anthropic" >> $GITHUB_OUTPUT # fallback
fi
claude-anthropic:
needs: cloud-selection
if: needs.cloud-selection.outputs.selected_cloud == 'anthropic'
runs-on: ubuntu-latest
steps:
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
claude-bedrock:
needs: cloud-selection
if: needs.cloud-selection.outputs.selected_cloud == 'bedrock'
runs-on: ubuntu-latest
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-west-2
- uses: anthropics/claude-code-action@beta
with:
model: "anthropic.claude-3-7-sonnet-20250219-beta:0"
use_bedrock: "true"
claude-vertex:
needs: cloud-selection
if: needs.cloud-selection.outputs.selected_cloud == 'vertex'
runs-on: ubuntu-latest
steps:
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
workload_identity_provider: ${{ secrets.GCP_WORKLOAD_IDENTITY_PROVIDER }}
service_account: ${{ secrets.GCP_SERVICE_ACCOUNT }}
- uses: anthropics/claude-code-action@beta
with:
model: "claude-3-7-sonnet@20250219"
use_vertex: "true"
[S3TO3] MCP โ ๊ณ ๊ธ ์ปค์คํฐ๋ง์ด์ ์ด์ & ์๋ํ
11.8 ๊ณ ๊ธ ์ปค์คํฐ๋ง์ด์ ์ด์
Claude Code Action์ ์ง์ ํ ๊ฐ์น๋ ์กฐ์ง์ ํน์ํ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊น์ด ์๋ ์ปค์คํฐ๋ง์ด์ ์ด์ ์ ํตํด ์คํ๋ฉ๋๋ค. MCP(Model Context Protocol) ์๋ฒ ํตํฉ, ์ปค์คํ ๋๊ตฌ ๊ฐ๋ฐ, ๊ทธ๋ฆฌ๊ณ ์กฐ์ง๋ณ ์ํฌํ๋ก์ฐ ์ต์ ํ๋ฅผ ํตํด Claude๋ฅผ ํ์ ์ ์ฉ AI ์ด์์คํดํธ๋ก ๋ฐ์ ์ํฌ ์ ์์ต๋๋ค.
MCP ์๋ฒ ํตํฉ๊ณผ ํ์ฅ
MCP(Model Context Protocol)๋ Claude์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ํ์คํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์กฐ์ง์ ๋ด๋ถ ์์คํ , ๋ฐ์ดํฐ๋ฒ ์ด์ค, API์์ ํตํฉ์ ํตํด Claude๊ฐ ๋ ํ๋ถํ ์ปจํ ์คํธ๋ก ์์ ํ ์ ์๊ฒ ํฉ๋๋ค.
๊ธฐ๋ณธ MCP ์๋ฒ ํตํฉ
# Sequential Thinking MCP ์๋ฒ ํตํฉ
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
mcp_config: |
{
"mcpServers": {
"sequential-thinking": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-sequential-thinking"
]
}
}
}
allowed_tools: "mcp__sequential-thinking__sequentialthinking"
๊ณ ๊ธ MCP ์๋ฒ ์ค์ - ๋ด๋ถ ์์คํ ํตํฉ
# ์กฐ์ง ํนํ MCP ์๋ฒ ์ค๊ณ
claude "์ฐ๋ฆฌ ์กฐ์ง์ ์ํ ์ปค์คํ
MCP ์๋ฒ๋ค์ ์ค๊ณํด์ค.
๋ค์ ์์คํ
๊ณผ์ ํตํฉ์ด ํ์ํด
๋ด๋ถ ์์คํ
์ฐ๋
- JIRA API: ์ด์ ํธ๋ํน๊ณผ ํ๋ก์ ํธ ๊ด๋ฆฌ
- Confluence: ๋ฌธ์์ ์ง์ ๋ฒ ์ด์ค ์ ๊ทผ
- Slack API: ํ ์ปค๋ฎค๋์ผ์ด์
๊ณผ ์๋ฆผ
- Jenkins: CI/CD ํ์ดํ๋ผ์ธ ์ํ
- DataDog: ๋ชจ๋ํฐ๋ง๊ณผ ์ฑ๋ฅ ๋ฉํธ๋ฆญ
์ธ๋ถ ์๋น์ค ํตํฉ
- AWS API: ์ธํ๋ผ ์ํ์ ๋ฆฌ์์ค ๊ด๋ฆฌ
- Kubernetes API: ์ปจํ
์ด๋ ์ค์ผ์คํธ๋ ์ด์
- Database connections: ์คํค๋ง ์ ๋ณด์ ์ฟผ๋ฆฌ ์คํ
- Security scanners: ์ทจ์ฝ์ ๊ฒ์ฌ ๊ฒฐ๊ณผ
๊ฐ MCP ์๋ฒ์ ๊ตฌํ ๋ฐฉ๋ฒ๊ณผ ๋ณด์ ์ค์ ์ ํฌํจํด์ค."
์ํฐํ๋ผ์ด์ฆ MCP ์๋ฒ ๊ตฌ์ฑ ์์
# ์ข
ํฉ์ ์ธ MCP ์๋ฒ ์ค์
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
mcp_config: |
{
"mcpServers": {
"jira-integration": {
"command": "node",
"args": ["./scripts/mcp-jira-server.js"],
"env": {
"JIRA_URL": "${{ secrets.JIRA_URL }}",
"JIRA_TOKEN": "${{ secrets.JIRA_TOKEN }}",
"JIRA_PROJECT_KEY": "${{ vars.JIRA_PROJECT_KEY }}"
}
},
"database-inspector": {
"command": "python",
"args": ["./scripts/mcp-db-server.py"],
"env": {
"DB_CONNECTION_STRING": "${{ secrets.DB_READ_ONLY_CONNECTION }}",
"DB_TYPE": "postgresql"
}
},
"security-scanner": {
"command": "npx",
"args": ["-y", "@company/security-mcp-server"],
"env": {
"SCANNER_API_KEY": "${{ secrets.SECURITY_SCANNER_API_KEY }}",
"SCAN_LEVEL": "comprehensive"
}
},
"monitoring-integration": {
"command": "node",
"args": ["./scripts/mcp-monitoring-server.js"],
"env": {
"DATADOG_API_KEY": "${{ secrets.DATADOG_API_KEY }}",
"GRAFANA_URL": "${{ secrets.GRAFANA_URL }}",
"GRAFANA_TOKEN": "${{ secrets.GRAFANA_TOKEN }}"
}
}
}
}
allowed_tools: |
mcp__jira-integration__create-issue,
mcp__jira-integration__update-issue,
mcp__jira-integration__search-issues,
mcp__database-inspector__query-schema,
mcp__database-inspector__explain-query,
mcp__security-scanner__scan-code,
mcp__security-scanner__check-vulnerabilities,
mcp__monitoring-integration__get-metrics,
mcp__monitoring-integration__create-alert
์กฐ์ง๋ณ ์ปค์คํ ๋๊ตฌ ๊ฐ๋ฐ
์ฝ๋ ํ์ง ๊ฒ์ฌ ๋๊ตฌ
# ์กฐ์ง ํนํ ์ฝ๋ ํ์ง ๋๊ตฌ
claude "์ฐ๋ฆฌ ํ์ ์ฝ๋ฉ ํ์ค์ ์๋์ผ๋ก ๊ฒ์ฌํ๋ ์ปค์คํ
๋๊ตฌ๋ฅผ ๋ง๋ค์ด์ค.
๋ค์ ๊ฒ์ฌ ํญ๋ชฉ์ ํฌํจํด์ค
์ฝ๋ฉ ํ์ค ๊ฒ์ฌ
- ํจ์ ๋ค์ด๋ฐ ๊ท์น (camelCase, ๋์ฌ๋ก ์์)
- ํ์ผ ๊ตฌ์กฐ ๊ท์น (feature/component ๊ธฐ๋ฐ)
- ์ฝ๋ฉํธ ์์ฑ ๊ท์น (JSDoc, docstring)
- ์๋ฌ ์ฒ๋ฆฌ ํจํด ์ผ๊ด์ฑ
- ๋ก๊น
ํ์ ํ์คํ
์ฑ๋ฅ ๊ฒ์ฌ
- ๋ฉ๋ชจ๋ฆฌ ๋์ ํจํด ๊ฐ์ง
- ๋นํจ์จ์ ์ธ ๋ฃจํ์ ์ฟผ๋ฆฌ
- ๋ถํ์ํ ๋ ๋๋ง ๊ฐ์ง
- ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ ๊ธฐํ
๋ณด์ ๊ฒ์ฌ
- ํ๋์ฝ๋ฉ๋ ์ํฌ๋ฆฟ ํ์ง
- SQL ์ธ์ ์
์ทจ์ฝ์
- XSS ๊ณต๊ฒฉ ๋ฒกํฐ
- ๊ถํ ๋ถ์ฌ ๋๋ฝ"
์๋ ๋ฌธ์ํ ๋๊ตฌ
# ์ปค์คํ
๋ฌธ์ํ ์๋ํ
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
custom_instructions: |
๋น์ ์ ์ฐ๋ฆฌ ์กฐ์ง์ ๋ฌธ์ํ ์ ๋ฌธ๊ฐ์
๋๋ค.
๋ค์ ๋ฌธ์ํ ํ์ค์ ์ค์ํด์ฃผ์ธ์
API ๋ฌธ์ํ
- OpenAPI 3.0 ์คํ ์ค์
- ์์ฒญ/์๋ต ์์ ํฌํจ
- ์๋ฌ ์ฝ๋์ ๋ฉ์์ง ์ค๋ช
- ๋ฒ์ ๊ด๋ฆฌ ์ ๋ณด
์ฝ๋ ๋ฌธ์ํ
- ํจ์๋ณ JSDoc/docstring
- ๋ณต์กํ ๋ก์ง ์ธ๋ผ์ธ ์ฃผ์
- README ์
๋ฐ์ดํธ
- ์ํคํ
์ฒ ๋ค์ด์ด๊ทธ๋จ
์ฌ์ฉ์ ๋ฌธ์ํ
- ์ค์น์ ์ค์ ๊ฐ์ด๋
- ์ฌ์ฉ ์์์ ํํ ๋ฆฌ์ผ
- ๋ฌธ์ ํด๊ฒฐ ๊ฐ์ด๋
- FAQ ์น์
allowed_tools: |
Edit,Replace,GitLog,GitDiff,
mcp__docs-generator__create-api-docs,
mcp__docs-generator__update-readme,
mcp__docs-generator__generate-diagrams
์ํฌํ๋ก์ฐ ์ต์ ํ์ ์๋ํ
์ง๋ฅํ ์ํฌํ๋ก์ฐ ๋ผ์ฐํ
# ์ปจํ
์คํธ ๊ธฐ๋ฐ ์ํฌํ๋ก์ฐ ์๋ํ
claude "PR ๋ด์ฉ์ ๋ถ์ํด์ ์๋์ผ๋ก ์ ์ ํ ์ํฌํ๋ก์ฐ๋ฅผ ์ ํํ๋ ์์คํ
์ ๋ง๋ค์ด์ค.
๋ค์ ๋ถ๋ฅ ๊ธฐ์ค์ ์ฌ์ฉํด์ค
๋ณ๊ฒฝ ์ ํ ๋ถ์
- ๊ธฐ๋ฅ ์ถ๊ฐ (feature): ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ
- ๋ฒ๊ทธ ์์ (bugfix): ๊ธฐ์กด ๊ธฐ๋ฅ ์ค๋ฅ ์์
- ๋ฆฌํฉํ ๋ง (refactor): ์ฝ๋ ๊ตฌ์กฐ ๊ฐ์
- ๋ฌธ์ํ (docs): ๋ฌธ์ ์
๋ฐ์ดํธ
- ์ค์ (config): ์ค์ ํ์ผ ๋ณ๊ฒฝ
- ํ
์คํธ (test): ํ
์คํธ ์ฝ๋ ๊ด๋ จ
์ํฅ๋ ๋ถ์
- Critical: ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง ๋ณ๊ฒฝ
- High: ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ ์ํฅ
- Medium: ๋ด๋ถ ๋ก์ง ๊ฐ์
- Low: ๋ฌธ์๋ ์ฃผ์ ์
๋ฐ์ดํธ
๊ฐ ๋ถ๋ฅ์ ๋ฐ๋ฅธ ์๋ํ ์ํฌํ๋ก์ฐ
- ํ์ํ ๋ฆฌ๋ทฐ์ด ์๋ ํ ๋น
- ์ ์ ํ ํ
์คํธ ์ ๋ต ์ ํ
- ๋ฐฐํฌ ์น์ธ ํ๋ก์ธ์ค ๊ฒฐ์
- ๋ชจ๋ํฐ๋ง ์์ค ์ค์ "
๋์ ํ์ง ๊ฒ์ดํธ
# ์ง๋ฅํ ํ์ง ๊ฒ์ดํธ ์์คํ
name: Adaptive Quality Gates
on:
pull_request:
types: [opened, synchronize]
jobs:
analyze-changes:
runs-on: ubuntu-latest
outputs:
risk_level: ${{ steps.analysis.outputs.risk_level }}
test_strategy: ${{ steps.analysis.outputs.test_strategy }}
review_requirements: ${{ steps.analysis.outputs.review_requirements }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: anthropics/claude-code-action@beta
id: analysis
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
direct_prompt: |
์ด PR์ ๋ณ๊ฒฝ์ฌํญ์ ๋ถ์ํ๊ณ ๋ค์์ ๊ฒฐ์ ํด์ฃผ์ธ์
1. ์ํ๋ ํ๊ฐ (low/medium/high/critical)
2. ํ์ํ ํ
์คํธ ์ ๋ต (unit/integration/e2e/performance)
3. ๋ฆฌ๋ทฐ ์๊ตฌ์ฌํญ (standard/senior/architect/security)
๋ถ์ ๊ธฐ์ค
- ๋ณ๊ฒฝ๋ ํ์ผ์ ์์ ์ค์๋
- ๋น์ฆ๋์ค ๋ก์ง ๋ณ๊ฒฝ ์ฌ๋ถ
- ๋ณด์ ๊ด๋ จ ์ฝ๋ ์์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ
- API ์ธํฐํ์ด์ค ๋ณ๊ฒฝ
- ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ ๋ณ๊ฒฝ
๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํ์์ผ๋ก GitHub Actions output์ ์ค์ ํด์ฃผ์ธ์
echo "risk_level=medium" >> $GITHUB_OUTPUT
echo "test_strategy=integration,e2e" >> $GITHUB_OUTPUT
echo "review_requirements=senior,security" >> $GITHUB_OUTPUT
quality-gate-low:
needs: analyze-changes
if: needs.analyze-changes.outputs.risk_level == 'low'
runs-on: ubuntu-latest
steps:
- name: Fast Track Review
run: echo "Low risk changes - fast track approved"
quality-gate-high:
needs: analyze-changes
if: contains(fromJson('["high", "critical"]'), needs.analyze-changes.outputs.risk_level)
runs-on: ubuntu-latest
steps:
- uses: anthropics/claude-code-action@beta
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
direct_prompt: |
์ด๋ ๋์ ์ํ๋์ ๋ณ๊ฒฝ์ฌํญ์
๋๋ค.
๋ค์ ๊ฐํ๋ ๊ฒํ ๋ฅผ ์ํํด์ฃผ์ธ์
1. ์ธ๋ถ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ
2. ๋ณด์ ์ทจ์ฝ์ ์ ์ฒด ๊ฒ์ฌ
3. ์ฑ๋ฅ ์ํฅ ๋ถ์
4. ๋กค๋ฐฑ ๊ณํ ์๋ฆฝ
5. ๋ชจ๋ํฐ๋ง ๊ณํ ์ ์
์ถ๊ฐ๋ก ๋ค์ ํ๋ค์ ๋ฆฌ๋ทฐ์ ํฌํจ์์ผ์ฃผ์ธ์
@security-team @architecture-team @senior-engineers
[S3TO4] Greptile โ AI ์ฝ๋ ๊ฒ์
- greptile ์ธ๋ถ ํ๋ฌ๊ทธ์ธ: AI ๊ธฐ๋ฐ ์ฝ๋๋ฒ ์ด์ค ๊ฒ์ ๋ฐ ์ดํด ๋๊ตฌ
- ์์ฐ์ด ์ง์๋ก ์ฝ๋ ๊ตฌ์กฐ, ํจํด, ์์กด์ฑ์ ๋น ๋ฅด๊ฒ ํ์
[S3TO5] Serena โ ์ฝ๋ ์ดํด AI
- serena ์ธ๋ถ ํ๋ฌ๊ทธ์ธ: ์ฝ๋ ์ดํด ์ ๋ฌธ AI โ ์ฌ์ธต ์ฝ๋ ๋ถ์ ๋ฐ ๋ฌธ์ ์๋ ์์ฑ
- ๋๊ท๋ชจ ์ฝ๋๋ฒ ์ด์ค์ ์ํคํ ์ฒ ํ์ ๊ณผ ์จ๋ณด๋ฉ ๊ฐ์ํ
[S3TO6] Books 1๊ถ โ ๊ณ ๊ธ ํ์ด์ฉ ํ์ต
- 1๊ถ 20ํธ: Subagents โ ๋ฉํฐ ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์ ๊ณ ๊ธ ํจํด
- 1๊ถ 22ํธ: MCP โ MCP ์๋ฒ ์ปค์คํ ๊ฐ๋ฐ ๋ฐ ๋๊ท๋ชจ ์ฐ๋ ์ํคํ ์ฒ
- 1๊ถ 27ํธ: GitHub Actions์ Agent SDK โ ์ปค์คํ ์์ด์ ํธ ๋น๋ ๋ฐ CI/CD ํตํฉ ์๋ํ
- 1๊ถ 30ํธ: ๋ณตํฉ AI ํ์ฉ ์ ๋ต โ ๋ฉํฐ AI ์ค์ผ์คํธ๋ ์ด์ ๊ณ ๊ธ ์ ๋ต
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S3TO7] ์ค์ Tips โ Multi-Role/์๋ธ์์ด์ ํธ ๊ณ ๊ธ
๋๊ตฌ_ํ์ฉ/Multi-Role_AI_์์คํ ๊ณผ_Multi-Agent_์์คํ _๋น๊ต.mdโ ๋๊ท๋ชจ ํ ์ํคํ ์ฒ ์ค๊ณ๋๊ตฌ_ํ์ฉ/์๋ธ์์ด์ ํธ_ํจ๊ณผ์ ์ผ๋ก_ํ์ฉํ๊ธฐ.mdโ 20+ ์์ด์ ํธ ๋์ ์ด์ ์ ๋ต
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/๋๊ตฌ_ํ์ฉ/
[S3TO8] .claude ์ฐธ๊ณ โ Subagents/Skills/References ๊ณ ๊ธ
- subagents: 20๊ฐ ์๋ธ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์ ์ ๋ต โ ๋ณ๋ ฌ ํฌ์ ์กฐํฉ(frontend+backend+test), ๊ฒ์ฆ ์ฒด์ธ(code-reviewerโqaโsecurity-auditor), ์ ๋ฌธ๊ฐ ์์ ํ๋จ ๊ธฐ์ค, ์์ด์ ํธ ๊ฐ ์์กด์ฑ ์ค๊ณ
- skills: 17๊ฐ ์คํฌ ํ์ดํ๋ผ์ธ ์ค๊ณ โ ์คํฌ ์ฒด์ด๋(
db-schemaโapi-builderโe2e-test), ์ปค์คํ ์คํฌ ์ ์, ์คํฌ ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ ํจํด - references:
MOAI_ADK_Hooks_์ฐธ๊ณ .md,MOAI_ADK_Skills_์ฐธ๊ณ .mdโ ๋ฉํฐ ์์ด์ ํธ ํ๊ฒฝ ADK ์ปค์คํ ํ์ฅ ๋ฐ ํ ์ค์ผ์คํธ๋ ์ด์ ์ฐ๋
๐ ๊ฒฝ๋ก:.claude/subagents/,.claude/skills/,.claude/references/
S3QC โ ํ์ง๊ด๋ฆฌ (Quality Control)
[S3QC1(์น์ 27)] AI ์ฝ๋ ๋ฆฌ๋ทฐ 8๊ฐ์ง ๋ง์คํฐ ํจํด
12.2 AI ์ฆ๊ฐ ์ฝ๋ ๋ฆฌ๋ทฐ ์ํ๊ณ
์ ํต์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋์ด์ AI์ ์ธ๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ฐ์ ์ ํ์ฉํ ๋ค์ธต์ ํ์ง ๋ณด์ฅ ์์คํ ์ ๊ตฌ์ถํฉ๋๋ค.
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
flowchart TD
A[์ฝ๋ ์์ฑ ์๋ฃ] --> B[AI ์ฌ์ ๋ฆฌ๋ทฐ]
B --> C{ํ์ง ๊ธฐ์ค ์ถฉ์กฑ}
C -->|๊ธฐ์ค ๋ฏธ๋ฌ| D[์๋ ๊ฐ์ ์ ์]
C -->|๊ธฐ์ค ์ถฉ์กฑ| E[PR ์์ฑ]
D --> F[๊ฐ๋ฐ์ ์์ ]
F --> B
E --> G[๋งฅ๋ฝ ์ธ์ AI ๋ฆฌ๋ทฐ]
G --> H[์ญํ ๋ณ ์ ๋ฌธ ๋ฆฌ๋ทฐ]
subgraph specialists [์ ๋ฌธ๊ฐ ๋ฆฌ๋ทฐ ์ฒด๊ณ]
I[๋ณด์ ์ ๋ฌธ๊ฐ<br/>Security Champion]
J[์ฑ๋ฅ ์ ๋ฌธ๊ฐ<br/>Performance Specialist]
K[์ํคํ
์ฒ ์ ๋ฌธ๊ฐ<br/>Architecture Guardian]
L[UX ์ ๋ฌธ๊ฐ<br/>User Experience Advocate]
end
H --> I
H --> J
H --> K
H --> L
subgraph analysis [์ ๋ฌธ ๋ถ์ ์์ญ]
I --> M[๋ณด์ ์ํ ๋ชจ๋ธ๋ง<br/>์ทจ์ฝ์ ํจํด ๋ถ์<br/>์ปดํ๋ผ์ด์ธ์ค ๊ฒ์ฆ]
J --> N[์ฑ๋ฅ ๋ณ๋ชฉ ๋ถ์<br/>์๊ณ ๋ฆฌ์ฆ ์ต์ ํ<br/>๋ฆฌ์์ค ํจ์จ์ฑ]
K --> O[์ค๊ณ ์์น ์ค์<br/>์์กด์ฑ ๊ด๋ฆฌ<br/>ํ์ฅ์ฑ ํ๊ฐ]
L --> P[์ฌ์ฉ์ฑ ํ๊ฐ<br/>์ ๊ทผ์ฑ ๊ฒ์ฆ<br/>์ธํฐ๋ ์
ํ์ง]
end
M --> Q[์ข
ํฉ ๋ฆฌ๋ทฐ ๋ฆฌํฌํธ]
N --> Q
O --> Q
P --> Q
Q --> R{๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ}
R -->|์น์ธ| S[๋ณํฉ ์น์ธ]
R -->|์์ ์์ฒญ| T[๊ฐ๋ฐ์ ํผ๋๋ฐฑ]
T --> F
S --> U[์๋ ๋ฐฐํฌ]
subgraph feedback [ํผ๋๋ฐฑ ๋ฃจํ]
U --> V[์ด์ ๋ฉํธ๋ฆญ ์์ง]
V --> W[๋ฆฌ๋ทฐ ํจ๊ณผ์ฑ ๋ถ์]
W --> X[๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ๊ฐ์ ]
X --> B
end
classDef processStyle fill:#e2e8f0,stroke:#334155,stroke-width:2px,color:#1e293b
classDef specialistStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
classDef analysisStyle fill:#ecfdf5,stroke:#059669,stroke-width:2px,color:#064e3b
classDef decisionStyle fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#92400e
classDef feedbackStyle fill:#ddd6fe,stroke:#7c3aed,stroke-width:2px,color:#5b21b6
class A,B,E,G,H,Q processStyle
class I,J,K,L specialistStyle
class M,N,O,P analysisStyle
class C,R decisionStyle
class V,W,X feedbackStyle
์ง๋ฅํ ์ฌ์ ๋ฆฌ๋ทฐ ์์คํ
๊ฐ๋ฐ์๊ฐ PR์ ์์ฑํ๊ธฐ ์ ์ AI๊ฐ ๋ค๊ฐ๋๋ก ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ํ์ง์ ์ฌ์ ์ ๋ณด์ฅํฉ๋๋ค.
# ์ข
ํฉ์ ์ฌ์ ํ์ง ๊ฒ์ฆ
claude "์ด ์ฝ๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ค์ ๊ด์ ์์ ์ข
ํฉ ๋ถ์ํด์ค
๐ ์ ์ ๋ถ์ ๊ด์
- ์ฝ๋ฉ ํ์ค๊ณผ ์ปจ๋ฒค์
์ค์
- ๋ณต์ก๋์ ๊ฐ๋
์ฑ ํ๊ฐ
- ์ ์ฌ์ ๋ฒ๊ทธ์ ์ทจ์ฝ์
- ์ฑ๋ฅ ๋ณ๋ชฉ ๊ฐ๋ฅ์ฑ
- ๋ฉ๋ชจ๋ฆฌ ๋์์ ๋ฆฌ์์ค ๊ด๋ฆฌ
๐๏ธ ์ํคํ
์ฒ ๊ด์
- ๊ธฐ์กด ์ค๊ณ ์์น๊ณผ์ ์ผ๊ด์ฑ
- ์์กด์ฑ๊ณผ ๊ฒฐํฉ๋ ๋ถ์
- ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ
- ํ
์คํธ ๊ฐ๋ฅ์ฑ๊ณผ ๋ชจํน ์ฉ์ด์ฑ
- API ์ค๊ณ์ ์ธํฐํ์ด์ค ํ์ง
๐ง ๋น์ฆ๋์ค ๋ก์ง ๊ด์
- ์๊ตฌ์ฌํญ ์ถฉ์กฑ๋ ๊ฒ์ฆ
- ์ฃ์ง ์ผ์ด์ค์ ์์ธ ์ํฉ ์ฒ๋ฆฌ
- ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ์ํ ๊ด๋ฆฌ
- ๋ณด์๊ณผ ๊ถํ ์ฒ๋ฆฌ
- ์ฌ์ฉ์ ๊ฒฝํ ์ํฅ๋
๐ ํ์ง ๋ฉํธ๋ฆญ ๊ด์
- ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ํ
์คํธ ํ์ง
- ๋ฌธ์ํ ์์ฑ๋
- ๋ก๊น
๊ณผ ๋ชจ๋ํฐ๋ง ์ค๋น๋
- ๊ตญ์ ํ์ ์ ๊ทผ์ฑ ๊ณ ๋ ค
- ์ฑ๋ฅ ๋ฒค์น๋งํฌ ์ํฅ
๊ฐ ๊ด์ ๋ณ๋ก 1-10์ ํ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ๋ฐฉ์์ ์ ์ํด์ค"
๋งฅ๋ฝ ์ธ์ ๋ฆฌ๋ทฐ ์ด์์คํดํธ
ํ๋ก์ ํธ์ ํ์คํ ๋ฆฌ์ ํ์ ํจํด์ ํ์ตํ์ฌ ๋ ์ ํํ ๋ฆฌ๋ทฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
# ๋งฅ๋ฝ ๊ธฐ๋ฐ ์ง๋ฅํ ๋ฆฌ๋ทฐ
claude "์ด PR์ ๋ฆฌ๋ทฐํ๋, ๋ค์ ๋งฅ๋ฝ์ ๊ณ ๋ คํด์ ๋ถ์ํด์ค
๐ ํ๋ก์ ํธ ๋งฅ๋ฝ
- ์ต๊ทผ 3๊ฐ์๊ฐ ๋ฒ๊ทธ ํจํด ๋ถ์
- ์ฑ๋ฅ ์ด์ ํ์คํ ๋ฆฌ
- ๋ณด์ ์ธ์๋ํธ ๊ฒฝํ
- ํ์ ๊ธฐ์ ๋ถ์ฑ ํํฉ
- ๋ค๊ฐ์ค๋ ๋ง์ผ์คํค๊ณผ ์๋ฐ
๐ฅ ํ ๋งฅ๋ฝ
- ์์ฑ์์ ๊ธฐ์ ์์ค๊ณผ ๊ฒฝํ
- ์ฝ๋ ๋ฆฌ๋ทฐ์ด์ ์ ๋ฌธ ๋ถ์ผ
- ํ ๋ด ์ฝ๋ฉ ์คํ์ผ ์งํ
- ๊ณผ๊ฑฐ ๋ฆฌ๋ทฐ ํผ๋๋ฐฑ ํจํด
- ํ์ต ๋ชฉํ์ ์ฑ์ฅ ๋ฐฉํฅ
๐ฏ ๋น์ฆ๋์ค ๋งฅ๋ฝ
- ๊ธฐ๋ฅ์ ๋น์ฆ๋์ค ์ค์๋
- ๊ณ ๊ฐ ์ํฅ๋์ ์ํ์ฑ
- ์ด์ ๋ณต์ก๋ ์ฆ๊ฐ ์ฌ๋ถ
- ๊ธฐ์ ์ ์์กด์ฑ ๋ณํ
- ํฅํ ํ์ฅ ๊ณํ
์ด ๋งฅ๋ฝ์ ๋ฐํ์ผ๋ก ์ฐ์ ์์๋ฅผ ์ ํด์ ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ๋ฅผ ์์ฑํด์ค.
๋จ์ํ ๋ฌธ์ ์ง์ ๋ณด๋ค๋ ๊ต์ก์ ์ด๊ณ ๊ฑด์ค์ ์ธ ํผ๋๋ฐฑ์ ์ค์ฌ์ผ๋ก ํด์ค"
์ญํ ๋ณ ์ ๋ฌธํ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค
%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#f8fafc", "primaryTextColor": "#1e293b", "primaryBorderColor": "#e2e8f0", "lineColor": "#94a3b8", "secondaryColor": "#f1f5f9", "tertiaryColor": "#e2e8f0"}}}%%
graph LR
subgraph security [๋ณด์ ์ ๋ฌธ ๋ฆฌ๋ทฐ]
A[๋ณด์ ์ํ ๋ชจ๋ธ๋ง]
B[OWASP Top 10 ์ฒดํฌ]
C[์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ]
D[๋ฐ์ดํฐ ๋ณดํธ ๋ฐ ์ํธํ]
end
subgraph performance [์ฑ๋ฅ ์ ๋ฌธ ๋ฆฌ๋ทฐ]
E[์๊ณ ๋ฆฌ์ฆ ๋ณต์ก๋ ๋ถ์]
F[๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์ต์ ํ]
G[๋คํธ์ํฌ I/O ํจ์จ์ฑ]
H[ํ๋ก ํธ์๋ ๋ ๋๋ง ์ฑ๋ฅ]
end
subgraph architecture [์ํคํ
์ฒ ์ ๋ฌธ ๋ฆฌ๋ทฐ]
I[์ค๊ณ ์์น ์ค์]
J[์์กด์ฑ ๋ฐ ๊ฒฐํฉ๋]
K[ํ์ฅ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ]
L[ํ
์คํธ ๊ฐ๋ฅ์ฑ]
end
subgraph ux [์ฌ์ฉ์ ๊ฒฝํ ๋ฆฌ๋ทฐ]
M[์ฌ์ฉ์ฑ ํ๊ฐ]
N[์ ๊ทผ์ฑ ๊ฒ์ฆ]
O[์ธํฐ๋ ์
ํ์ง]
P[์ฑ๋ฅ ์ธ์ ์ํฅ]
end
subgraph outcomes [๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ]
Q[์ฌ๊ฐ๋ ํ๊ฐ<br/>Critical/High/Medium/Low]
R[๊ฐ์ ๋ฐฉ์ ์ ์]
S[์ฐ์ ์์ ๋ฐ ๋ก๋๋งต]
T[ํ์ต ๋ฆฌ์์ค ์ถ์ฒ]
end
A --> Q
B --> R
C --> S
D --> T
E --> Q
F --> R
G --> S
H --> T
I --> Q
J --> R
K --> S
L --> T
M --> Q
N --> R
O --> S
P --> T
classDef securityStyle fill:#fee2e2,stroke:#dc2626,stroke-width:2px,color:#7f1d1d
classDef performanceStyle fill:#fef3c7,stroke:#d97706,stroke-width:2px,color:#92400e
classDef architectureStyle fill:#ecfdf5,stroke:#059669,stroke-width:2px,color:#064e3b
classDef uxStyle fill:#ddd6fe,stroke:#7c3aed,stroke-width:2px,color:#5b21b6
classDef outcomeStyle fill:#f1f5f9,stroke:#475569,stroke-width:2px,color:#1e293b
class A,B,C,D securityStyle
class E,F,G,H performanceStyle
class I,J,K,L architectureStyle
class M,N,O,P uxStyle
class Q,R,S,T outcomeStyle
Security Champion - ๋ณด์ ์ ๋ฌธ ๋ฆฌ๋ทฐ
# ๋ณด์ ์ค์ฌ ์ฌ์ธต ๋ถ์
claude "๋ณด์ ์ ๋ฌธ๊ฐ ๊ด์ ์์ ์ด ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํด์ค
๐ก๏ธ ๋ณด์ ์ํ ๋ชจ๋ธ๋ง
- OWASP Top 10 ์ฒดํฌ๋ฆฌ์คํธ
- ์
๋ ฅ ๊ฒ์ฆ๊ณผ ์ถ๋ ฅ ์ธ์ฝ๋ฉ
- ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ ๋ก์ง
- ์ธ์
๊ด๋ฆฌ์ ํ ํฐ ์ฒ๋ฆฌ
- ์ํธํ์ ํค ๊ด๋ฆฌ
๐ ํ๋ผ์ด๋ฒ์ ๋ณดํธ
- ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ ๋ฐฉ์
- ๋ฐ์ดํฐ ๋ง์คํน๊ณผ ์ต๋ช
ํ
- ๋ก๊น
์ ๋ฏผ๊ฐ์ ๋ณด ๋
ธ์ถ
- GDPR/CCPA ์ปดํ๋ผ์ด์ธ์ค
- ๋ฐ์ดํฐ ๋ณด์กด๊ณผ ์ญ์ ์ ์ฑ
โ ๏ธ ์ทจ์ฝ์ ํจํด ๋ถ์
- SQL Injection ๊ฐ๋ฅ์ฑ
- XSS ๊ณต๊ฒฉ ๋ฒกํฐ
- CSRF ๋ณดํธ ๋ฉ์ปค๋์ฆ
- ํ์ผ ์
๋ก๋ ๋ณด์
- API ๋ณด์ ๊ณ ๋ ค์ฌํญ
๊ฐ ์ํ์์๋ณ๋ก ์ฌ๊ฐ๋(Critical/High/Medium/Low)๋ฅผ ํ๊ฐํ๊ณ
๊ตฌ์ฒด์ ์ธ ์ํ ๋ฐฉ๋ฒ์ ์ ์ํด์ค"
Performance Specialist - ์ฑ๋ฅ ์ต์ ํ ๋ฆฌ๋ทฐ
# ์ฑ๋ฅ ์ค์ฌ ์ ๋ฌธ ๋ฆฌ๋ทฐ
claude "์ฑ๋ฅ ์ ๋ฌธ๊ฐ ๊ด์ ์์ ์ด ์ฝ๋๋ฅผ ๋ถ์ํด์ค
โก ๊ณ์ฐ ๋ณต์ก๋ ๋ถ์
- ์๊ณ ๋ฆฌ์ฆ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋
- ์ค์ฒฉ ๋ฃจํ์ ์ฌ๊ท ์ต์ ํ
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ํ์ ์ ์ ์ฑ
- ์บ์ฑ ๊ธฐํ์ ๋ฉ๋ชจ์ด์ ์ด์
- ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ์ฑ
๐๏ธ ๋ฐ์ดํฐ ์ก์ธ์ค ํจํด
- N+1 ์ฟผ๋ฆฌ ๋ฌธ์
- ์ธ๋ฑ์ค ํ์ฉ๋
- ๋ฐฐ์น ์ฒ๋ฆฌ ์ต์ ํ
- ์ปค๋ฅ์
ํ ํจ์จ์ฑ
- ํธ๋์ญ์
๊ฒฝ๊ณ ์ค์
๐ ๋คํธ์ํฌ์ I/O
- API ํธ์ถ ์ต์ ํ
- ํ์ด๋ก๋ ํฌ๊ธฐ ์ต์ํ
- ์์ถ๊ณผ ์บ์ฑ ์ ๋ต
- ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ธฐํ
- ํ์์์๊ณผ ์ฌ์๋ ๋ก์ง
๐ฑ ํ๋ก ํธ์๋ ์ฑ๋ฅ
- ๋ฒ๋ค ํฌ๊ธฐ ์ํฅ
- ๋ ๋๋ง ์ฑ๋ฅ
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋
- ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ต์ ํ
- ์ด๋ฏธ์ง์ ๋ฆฌ์์ค ๋ก๋ฉ
์ฑ๋ฅ ์ํฅ๋๋ฅผ ์ ๋์ ์ผ๋ก ์์ธกํ๊ณ ๋ฒค์น๋งํฌ ๋ฐฉ๋ฒ์ ์ ์ํด์ค"
UX Advocate - ์ฌ์ฉ์ ๊ฒฝํ ๋ฆฌ๋ทฐ
# ์ฌ์ฉ์ ๊ฒฝํ ์ค์ฌ ์ฝ๋ ๋ฆฌ๋ทฐ
claude "UX ๊ด์ ์์ ์ด ์ฝ๋ ๋ณ๊ฒฝ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฏธ์น๋ ์ํฅ์ ๋ถ์ํด์ค
๐จ ์ธํฐํ์ด์ค ์ผ๊ด์ฑ
- ๋์์ธ ์์คํ
์ค์
- ์ํธ์์ฉ ํจํด ์ผ๊ด์ฑ
- ์ ๊ทผ์ฑ(a11y) ํ์ค ์ค์
- ๋คํฌ๋ชจ๋์ ํ
๋ง ์ง์
- ๋ฐ์ํ ๋์์ธ ๊ณ ๋ ค
โก ์ฑ๋ฅ๊ณผ ๋ฐ์์ฑ
- ๋ก๋ฉ ์ํ์ ํผ๋๋ฐฑ
- ์ธํฐ๋์
์ง์ฐ ์๊ฐ
- ์ ๋๋ฉ์ด์
์ฑ๋ฅ
- ์คํ๋ผ์ธ ๊ฒฝํ
- ์ ์ง์ ํฅ์(Progressive Enhancement)
๐ ๊ธ๋ก๋ฒ ์ฌ์ฉ์ ๊ณ ๋ ค
- ๊ตญ์ ํ(i18n) ์ค๋น๋
- ๋ค์ํ ๋๋ฐ์ด์ค ์ง์
- ๋คํธ์ํฌ ํ๊ฒฝ ๋์
- ๋ฌธํ์ ์ ์์ฑ
- ์๊ฐ๋์ ์ง์ญํ
๐ง ์ธ์ง ๋ถํ
- ์ ๋ณด ๊ตฌ์กฐ์ ๋ค๋น๊ฒ์ด์
- ์๋ฌ ๋ฉ์์ง ๋ช
ํ์ฑ
- ๋์๋ง๊ณผ ๊ฐ์ด๋
- ํ์ต ๊ณก์ ์ต์ํ
- ์ธ์ง์ ๋ง์ฐฐ ์์
์ฌ์ฉ์ ์ฌ์ ์ ๊ฐ ๋จ๊ณ์์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๊ณผ ๊ฐ์ ๋ฐฉ์์ ์ ์ํด์ค"
[S3QC3] AI ์ฝ๋ ๋ฆฌ๋ทฐ โ ํ์ง ์ธก์ & ํ ์ฑ์ฅ ์์คํ
์๋ํ๋ ๋ฆฌ๋ทฐ ํ์ง ์ธก์
๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ์์ฒด์ ํจ๊ณผ์ฑ์ ์ง์์ ์ผ๋ก ์ธก์ ํ๊ณ ๊ฐ์ ํฉ๋๋ค.
# ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ํจ๊ณผ์ฑ ๋ถ์
claude "์ฐ๋ฆฌ ํ์ ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค๋ฅผ ๋ถ์ํ๊ณ ๊ฐ์ ๋ฐฉ์์ ์ ์ํด์ค
๐ ์ ๋์ ์งํ ๋ถ์
- ๋ฆฌ๋ทฐ ์๋ฃ ์๊ฐ (๋ชฉํ: 24์๊ฐ ์ด๋ด)
- ๋ฆฌ๋ทฐ ๋ผ์ด๋ ์ (๋ชฉํ: ํ๊ท 2๋ผ์ด๋ ์ดํ)
- ๋ฐ๊ฒฌ๋ ๊ฒฐํจ ์์ ์ฌ๊ฐ๋
- ํ๋ก๋์
๋ฒ๊ทธ ์๋ฐฉ๋ฅ
- ๋ฆฌ๋ทฐ์ด ์ฐธ์ฌ๋์ ํ์ง
๐ฏ ํ์ง ์งํ ์ถ์
- ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ์ ๊ฑด์ค์ฑ
- ํ์ต ํจ๊ณผ์ ์ง์ ์ ์
- ํ ํ์ค ๊ฐ์ ๊ธฐ์ฌ๋
- ๋ฒ ์คํธ ํ๋ํฐ์ค ๋ฐ๊ตด
- ๊ธฐ์ ๋ถ์ฑ ์๋ฐฉ ํจ๊ณผ
๐ ํ๋ก์ธ์ค ์ต์ ํ
- ๋ฆฌ๋ทฐ ๋ณ๋ชฉ ์ง์ ์๋ณ
- ์๋ํ ๊ธฐํ ๋ฐ๊ตด
- ๋ฆฌ๋ทฐ์ด ์ํฌ๋ก๋ ๋ฐธ๋ฐ์ฑ
- ์ ๋ฌธ ์์ญ๋ณ ๋ผ์ฐํ
- ๊ต์ก๊ณผ ๋ฉํ ๋ง ํตํฉ
์๋ณ ํธ๋ ๋์ ๊ฐ์ ๋ก๋๋งต์ ํฌํจํ ๋ฆฌํฌํธ๋ฅผ ์์ฑํด์ค"
์งํํ๋ ๋ฆฌ๋ทฐ ๊ธฐ์ค
ํ์ ์ฑ์ฅ๊ณผ ํ๋ก์ ํธ ์งํ์ ๋ฐ๋ผ ๋ฆฌ๋ทฐ ๊ธฐ์ค๋ ๋์ ์ผ๋ก ์กฐ์ ๋ฉ๋๋ค.
# ๐ Dynamic Code Review Standards v3.0
## ๐ ์ ์ํ ํ์ง ๊ธฐ์ค
### ํ๋ก์ ํธ ๋จ๊ณ๋ณ ๋ฆฌ๋ทฐ ๊ฐ๋
```bash
# ํ์ฌ ํ๋ก์ ํธ ๋จ๊ณ ํ๊ฐ
if [ ํ๋ก์ ํธ_๋จ๊ณ == "MVP" ]; then
๋ฆฌ๋ทฐ_๊ธฐ์ค="๊ธฐ๋ฅ ๋์ + ๋ณด์ ๊ธฐ๋ณธ"
์น์ธ_์๊ณ๊ฐ=70
elif [ ํ๋ก์ ํธ_๋จ๊ณ == "์ฑ์ฅ" ]; then
๋ฆฌ๋ทฐ_๊ธฐ์ค="ํ์ฅ์ฑ + ์ฑ๋ฅ + ํ
์คํธ"
์น์ธ_์๊ณ๊ฐ=85
elif [ ํ๋ก์ ํธ_๋จ๊ณ == "์ฑ์" ]; then
๋ฆฌ๋ทฐ_๊ธฐ์ค="๋ชจ๋ ํ์ง ๊ธฐ์ค + ํ์ ์ฑ"
์น์ธ_์๊ณ๊ฐ=95
fi
ํ์๋ณ ๋ง์ถคํ ๊ธฐ์ค
- ์ ์ ๊ฐ๋ฐ์: ํ์ต ์ค์ฌ, ์์ธํ ์ค๋ช ๊ณผ ๊ฐ์ด๋
- ๊ฒฝ๋ ฅ ๊ฐ๋ฐ์: ํจ์จ์ฑ ์ค์ฌ, ํต์ฌ ์ด์๋ง ํฌ์ปค์ค
- ์๋์ด ๊ฐ๋ฐ์: ์ ๋ต์ ๊ด์ , ์ํคํ ์ฒ์ ์ฅ๊ธฐ ์ํฅ
- ํฌ๋ก์ค ํ ๋ฆฌ๋ทฐ: ์ธํฐํ์ด์ค์ ํธํ์ฑ ์ค์ฌ
๋น์ฆ๋์ค ์ํฉํธ๋ณ ๋ฆฌ๋ทฐ ๊น์ด
- Critical: ๋ค์ค ๋ฆฌ๋ทฐ์ด, ๋ณด์ ์ ๋ฌธ๊ฐ ํ์ ์ฐธ์ฌ
- High: ์๋์ด ๋ฆฌ๋ทฐ์ด ํ์, ์ฑ๋ฅ ํ ์คํธ ์๊ตฌ
- Medium: ํ์ค ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค
- Low: AI ๋ฆฌ๋ทฐ + ๊ฐ๋จํ ์ธ๊ฐ ๊ฒ์ฆ
๐ ๋ฆฌ๋ทฐ๋ฅผ ํตํ ํ ์ฑ์ฅ ์์คํ
์ง์ ์ ์ ์ถ์
# ํ์ต ํจ๊ณผ ์ธก์
claude "์ด๋ฒ ๋ฌ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํตํ ํ ํ์ต ํจ๊ณผ๋ฅผ ๋ถ์ํด์ค
- ์ฃผ๋์ด ๊ฐ๋ฐ์๋ค์ด ๊ฐ์ฅ ๋ง์ด ๋ฐฐ์ด ๊ฐ๋
- ๋ฐ๋ณต๋๋ ์ค์ ํจํด๊ณผ ๊ต์ก ํ์ ์์ญ
- ์๋์ด๊ฐ ์ ์ํ ์ง์์ ์ ์ฐฉ๋
- ํ ์ ์ฒด ๊ธฐ์ ์์ค ํฅ์ ์งํ
- ๋ค์ ๋ฌ ์ง์ค ๊ต์ก ์ฃผ์ ์ถ์ฒ
๊ฐ์ธ๋ณ ์ฑ์ฅ ๊ณํ๊ณผ ๋ฉํ ๋ง ๋งค์นญ์ ์ ์ํด์ค"
ํ์ ์์ด๋์ด ๋ฐ๊ตด
# ๋ฆฌ๋ทฐ ๊ณผ์ ์์ ๋์จ ํ์ ์์ด๋์ด ์ถ์
claude "์ต๊ทผ ์ฝ๋ ๋ฆฌ๋ทฐ์์ ์ ๊ธฐ๋ ํ์ ์ ์์ด๋์ด๋ค์ ์ ๋ฆฌํด์ค
- ์๋ก์ด ๊ธฐ์ ๋์
์ ์
- ํ๋ก์ธ์ค ๊ฐ์ ์์ด๋์ด
- ๋๊ตฌ์ ์๋ํ ๊ธฐํ
- ์ํคํ
์ฒ ์งํ ๋ฐฉํฅ
- ํ ์์ฐ์ฑ ํฅ์ ๋ฐฉ์
๊ฐ ์์ด๋์ด์ ์คํ ๊ฐ๋ฅ์ฑ๊ณผ ROI๋ฅผ ํ๊ฐํ๊ณ
์คํ ๊ณํ์ ์๋ฆฝํด์ค"
[S3QC2] MCP ์๋ฒ ๋ณด์ ๊ด๋ฆฌ
- API ํค๋ ๋ฐ๋์ ํ๊ฒฝ๋ณ์ ๋๋ secrets๋ก ๊ด๋ฆฌ (ํ๋์ฝ๋ฉ ๊ธ์ง)
allowed_tools๋ก MCP ๋๊ตฌ ์ ๊ทผ ๋ฒ์๋ฅผ ์ต์ ๊ถํ์ผ๋ก ์ ํ- ๋ด๋ถ ์์คํ ์ฐ๋ ์ ๋คํธ์ํฌ ๊ฒฉ๋ฆฌ ๋ฐ ์ธ์ฆ ํ ํฐ ๊ด๋ฆฌ ํ์
- ์ ๊ธฐ์ ์ธ MCP ์๋ฒ ๋ณด์ ๊ฐ์ฌ ๊ถ์ฅ
[S3QC4] Books โ ๊ณ ๊ธ ํ์ง๊ด๋ฆฌ ํ์ต
- 1๊ถ 34ํธ: AI ํ์ฉ ์ ์ฃผ์์ฌํญ๊ณผ ํ๊ณ โ ๊ณ ๊ธ ๋ณด์ ๊ฐ์ฌ ๋ฐ ์ํ ํ๊ฐ ์ฒด๊ณ
- 2๊ถ 22ํธ: SEO ์ต์ ํ โ ํ๋ก๋์ ํ์ง ์ต์ ํ ๊ณ ๊ธ ์ ๋ต
- 2๊ถ 23ํธ: ์น ์ ๊ทผ์ฑ โ WCAG ์ค์ ์๋ ๊ฒ์ฆ ์ฒด๊ณ
- 2๊ถ 24ํธ: ์ฑ๋ฅ ์ต์ ํ โ ๋๊ท๋ชจ ์์คํ ์ฑ๋ฅ ํ์ง ๊ด๋ฆฌ
- 3๊ถ 06ํธ: Verification Instruction ์์ฑ๋ฒ โ ๊ณ ๊ธ ๊ฒ์ฆ ์ง์นจ ์ค๊ณ
- 3๊ถ 07ํธ: ๊ฒ์ฆ ์์คํ ๊ณผ Stage Gate โ Stage Gate ์๋ํ ๋ฐ ๊ณ ๊ธ ์ด์
- 3๊ถ 11ํธ: AI ์์ 6๋ ๊ท์น โ ๊ท์น ๊ธฐ๋ฐ ํ์ง ์๋ํ ์ฒด๊ณ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/
[S3QC5] ์ค์ Tips โ ๋ณด์/๊ฒ์ฆ/SAL Grid/๋ง๋ฌด๋ฆฌ ๊ณ ๊ธ
๋ณด์/โ OWASP Top 10 ์ฌํ, RLS ๋ณด์ ๊ณ ๊ธ ํจํด, ํ๊ฒฝ๋ณ์ ๊ด๋ฆฌ ์๋ํ (4๊ฐ)๊ฒ์ฆ_๋ฌธ์ํ/โ ์๋ธ์์ด์ ํธ ๊ธฐ๋ฐ ์๋ ๊ฒ์ฆ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ (4๊ฐ)SAL_Grid/โ Phase Gate ์๋ ๊ฒ์ฆ, ๊ฒ์ฆ ํ ๋ฌธ์ํ ์๋ํ (5๊ฐ)๊ฐ๋ฐ_๋ง๋ฌด๋ฆฌ_์ ๊ฒ/ํ๋ก๋์ _๋ฐฐํฌ_์ _์ฒดํฌ๋ฆฌ์คํธ.mdโ ๋๊ท๋ชจ ๋ฐฐํฌ ์ต์ข ์ ๊ฒ ์ฒด๊ณ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/
[S3QC6] .claude ์ฐธ๊ณ โ Compliance/Rules/Subagents ๊ณ ๊ธ
- compliance:
AI_12_COMPLIANCE.mdโ ์ค์์ฌํญ ๊ธฐ๋ฐ ์๋ ๊ฐ์ฌ ๋ณด๊ณ ์ ์์ฑ ๋ฐ ์๋ฐ ์๋ ์ฐจ๋จ ์ฒด๊ณ - rules: ํ์ง ๊ฒ์ดํธ ์๋ํ โ
04(Grid ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ์๋ ๊ฒ์ฆ),06(์ํ ์ ์ด DB ํธ๋ฆฌ๊ฑฐ),07(Task CRUD ์๋ ์ ํจ์ฑ ๊ฒ์ฌ) - subagents: ํ์ง ์ ๋ด ์์ด์ ํธ 3์ข
์ฌํ โ
code-reviewer(์ ์ ๋ถ์ ์ฐ๋),security-auditor(OWASP ์๋ ์ค์บ),qa-specialist(ํ๊ท ํ ์คํธ ์๋ํ) - skills: ํ์ง ์คํฌ 3์ข
์ฌํ โ
security-audit(์ทจ์ฝ์ ๋ฆฌํฌํธ ์๋ ์์ฑ),code-review(PR ์๋ ๋ฆฌ๋ทฐ),e2e-test(Playwright ์๋๋ฆฌ์ค ์๋ ์คํ)
๐ ๊ฒฝ๋ก:.claude/subagents/,.claude/skills/,.claude/compliance/,.claude/rules/
S3CM โ ๋น์ฉ๊ด๋ฆฌ (Cost Management)
[S3CM1] Books 1๊ถ โ ๊ณ ๊ธ ๋น์ฉ๊ด๋ฆฌ ํ์ต
- 1๊ถ 14ํธ: ๊ตฌ๋ ํ๋๊ณผ ์๊ธ ์ฒด๊ณ โ Enterprise ํ๋ ๋๊ท๋ชจ ์ด์ ๋น์ฉ ์ค๊ณ
- 1๊ถ 24ํธ: Memory์ ์ปจํ ์คํธ ๊ด๋ฆฌ โ ๋๊ท๋ชจ ํ๋ก์ ํธ ์ปจํ ์คํธ ์ต์ ํ๋ก ํ ํฐ ์ ๊ฐ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /ํ์ต์ฉ_Books_New/1๊ถ_Claude_ClaudeCode_์ฌ์ฉ๋ฒ/
[S3CM2] ์ค์ Tips โ AI ๋น์ฉ ํ์ฉ๋ฒ ๊ณ ๊ธ
๋๊ตฌ_ํ์ฉ/AI๋ณ_์น๊ฒ์_๋น์ฉ๊ณผ_ํจ์จ์ _ํ์ฉ๋ฒ.mdโ ๋ฉํฐ ์์ด์ ํธ ํ๊ฒฝ ์น๊ฒ์ ๋น์ฉ ์ต์ ํ
๐ ๊ฒฝ๋ก: ๋ถ์์ _๊ณ ์ ๊ธฐ๋ฅ/์ฝํ
์ธ /Tips/๋๊ตฌ_ํ์ฉ/
[S3CM3] .claude ์ฐธ๊ณ โ Compliance/Subagents ๊ณ ๊ธ
- compliance: AI 12๋ ์ค์์ฌํญ โ ๋น์ฉ ๋ญ๋น ๋ฐฉ์ง ์์น ํฌํจ
- subagents: 20๊ฐ ์๋ธ์์ด์ ํธ ๋ณ๋ ฌ ์ด์ ์ ํ ํฐ ๋น์ฉ ์๋ฎฌ๋ ์ด์ ๊ด์
๐ ๊ฒฝ๋ก:.claude/subagents/,.claude/compliance/
๋ถ๋ก
ํต๊ณ
| ํญ๋ชฉ | ์๋ | |
|---|---|---|
| ์ด ์ | 18๊ฐ (3 Stage ร 6 Area) | |
| ํ์ฑ ์ | 18๊ฐ (๋ชจ๋ ์ ํ์ฑ) | |
| SAL ID ๋ถ์ฌ ํญ๋ชฉ | 169๊ฐ | |
| ์ฐธ๊ณ ์๋ฃ ํด์ฒด โ ๊ฐ๋ณ SAL ID | 59๊ฐ (18 ๋ธ๋ก โ 59 SAL ID) | |
| ์ชผ๊ฐฌ ์น์ | 6๊ฐ โ 12๊ฐ variant | |
| ์ค๋ณต | 0๊ฑด (SAL ID ์ค๋ณต ์์) |
ํ์ผ ์์ ์ธ๋ฑ์ค
S1CO โ S1ST โ S1WF โ S1TO โ S1QC โ S1CM
โ S2CO โ S2ST โ S2WF โ S2TO โ S2QC โ S2CM
โ S3CO โ S3ST โ S3WF โ S3TO โ S3QC โ S3CM
โ ๋ถ๋ก