์ํต ๋ถ์ฌ๊ฐ ํ๋ก์ ํธ๋ฅผ ์ฃฝ์ธ๋ค
"๊ฐ๋ฐ์๋, ์ด๊ฑฐ ์ธ์ ๊น์ง ๊ฐ๋ฅํ ๊น์?" "์... ๊ธ์์. ๋ณต์กํด์ ์ ํํ๋..."
์ด๋ฐ ๋ํ๋ฅผ ๋ช ๋ฒ ๋ฐ๋ณตํ๋ค ๋ณด๋ฉด ์ด๋์ ์ผ์ ์ 2๋ฐฐ๋ก ๋์ด๋๊ณ , ์์ฐ์ ๋ฐ๋ฅ๋๊ณ , ํ์ ํํธํ๋ฉ๋๋ค.
์คํํธ์ ํ๋ก์ ํธ ์คํจ ์์ธ Top 3:
- ์ปค๋ฎค๋์ผ์ด์ ๋ถ์กฑ (65%)
- ์๋ชป๋ ์๊ตฌ์ฌํญ (45%)
- ์ผ์ ๊ด๋ฆฌ ์คํจ (38%)
ํฅ๋ฏธ๋กญ๊ฒ๋ 2, 3๋ฒ๋ ๊ฒฐ๊ตญ 1๋ฒ์์ ํ์๋ฉ๋๋ค.
ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ์ ๊ฐ์น:
- ๊ฐ๋ฐ ์๋: ํ๊ท 60% ํฅ์
- ํ ๋ง์กฑ๋: 2.3๋ฐฐ ์ฆ๊ฐ
- ์์ฐ ์ด๊ณผ ๋ฐฉ์ง: 80%
์คํํธ์ ๊ฐ๋ฐํ์ ์ปค๋ฎค๋์ผ์ด์ ๋ฌธ์ ์
์ ํ์ ์ธ ์ํต ๋จ์ ์๋๋ฆฌ์ค
๊ธฐํ์: "๊ฐ๋จํ ๊ธฐ๋ฅ์ด๋๊น ํ๋ฃจ๋ฉด ๋๊ฒ ์ฃ ?"
๊ฐ๋ฐ์: "๋ค, ํ์ธํด๋ณด๊ฒ ์ต๋๋ค."
(๋ด์ฌ: ์ด๊ฑด ์ต์ 3์ผ์ ๊ฑธ๋ฆด ํ
๋ฐ...)
3์ผ ํ...
๊ธฐํ์: "์ด๋ป๊ฒ ๋์ด๊ฐ๊ณ ์๋์?"
๊ฐ๋ฐ์: "์๊ฐ๋ณด๋ค ๋ณต์กํด์... ์๊ฐ์ด ์ข ๋ ํ์ํด์."
๊ธฐํ์: "๊ทธ๋ผ ์ธ์ ๊น์ง์?"
๊ฐ๋ฐ์: "์... ์ ํํ๋ ๋ชจ๋ฅด๊ฒ ์ด์."
1์ฃผ์ผ ํ...
๊ธฐํ์: "๊ณ ๊ฐ์ด ์ธ์ ๋ณผ ์ ์๋๊ณ ๋ฌป๋๋ฐ์."
๊ฐ๋ฐ์: "์, ๊ทธ๋ฐ๋ฐ ์๊ตฌ์ฌํญ์ด ๋ช
ํํ์ง ์์์..."
๊ธฐํ์: "๊ทธ๋ผ ์ง๊ธ๊น์ง ๋ญ ํ ๊ฑฐ์ฃ ?"
๊ฒฐ๊ณผ: ๊ด๊ณ ์
ํ, ์ ๋ขฐ ์์ค, ํ๋ก์ ํธ ์ง์ฐ
๊ทผ๋ณธ ์์ธ ๋ถ์
1. ์ธ์ด์ ์ฐจ์ด
โโโ ๊ธฐํ์: "์ฌ์ฉ์ ์นํ์ ์ผ๋ก"
โโโ ๊ฐ๋ฐ์: "๊ธฐ์ ์ ์ผ๋ก ๊ตฌํ ๋ถ๊ฐ๋ฅ"
โโโ ๋์์ด๋: "์ง๊ด์ ์ธ UX"
โโโ PM: "์ผ์ ์ ๋ง์ถฐ"
2. ์ ๋ณด ๋น๋์นญ
โโโ ์๊ตฌ์ฌํญ์ ์จ์ ๋ณต์ก์ฑ
โโโ ๊ธฐ์ ์ ์ ์ฝ์ฌํญ
โโโ ์ธ๋ถ ์์กด์ฑ
โโโ ๋ฆฌ์คํฌ ์์
3. ํ๋ก์ธ์ค ๋ถ์ฌ
โโโ ๋ช
ํํ ์์ฌ๊ฒฐ์ ์ฒด๊ณ ์์
โโโ ์งํ์ํฉ ๊ณต์ ๋ฐฉ์ ๋ถ์ฌ
โโโ ํผ๋๋ฐฑ ๋ฃจํ ์์
โโโ ์ด์ ์์ค์ปฌ๋ ์ด์
์ ์ฐจ ๋ถ์ฌ
ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ํ๋ ์์ํฌ
1. RACI ๋งคํธ๋ฆญ์ค๋ก ์ญํ ๋ช ํํ
๊ธฐ๋ฅ ๊ฐ๋ฐ ์์:
๋ด๋น์ ์ฑ
์์ ํ์์ ์ ๋ณด์์ ์
์๊ตฌ์ฌํญ ์ ์ PM CEO Dev Design
๊ธฐ์ ๊ฒํ Dev CTO PM CEO
UI/UX ์ค๊ณ Design PM Dev CEO
๊ฐ๋ฐ ๊ตฌํ Dev CTO PM Design
ํ
์คํธ QA Dev PM CTO
๋ฐฐํฌ Dev CTO PM All
R (Responsible): ์คํ ๋ด๋น
A (Accountable): ์ต์ข
์ฑ
์
C (Consulted): ํ์ ํ์
I (Informed): ์ ๋ณด ๊ณต์
2. Definition of Done (DoD) ์ ์
## ๊ธฐ๋ฅ ์๋ฃ ๊ธฐ์ค ์ฒดํฌ๋ฆฌ์คํธ
### ๊ฐ๋ฐ ์๋ฃ
- [ ] ์ฝ๋ ๊ตฌํ ์๋ฃ
- [ ] ๋จ์ ํ
์คํธ ์์ฑ (์ปค๋ฒ๋ฆฌ์ง 80%+)
- [ ] ์ฝ๋ ๋ฆฌ๋ทฐ ์๋ฃ (2๋ช
์ด์ ์น์ธ)
- [ ] ์คํ
์ด์ง ํ๊ฒฝ ๋ฐฐํฌ ์๋ฃ
### ํ์ง ๊ฒ์ฆ
- [ ] QA ํ
์คํธ ์๋ฃ (๋ชจ๋ ํ
์คํธ ์ผ์ด์ค ํต๊ณผ)
- [ ] ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ํ
์คํธ (Chrome, Safari, Firefox)
- [ ] ๋ชจ๋ฐ์ผ ๋ฐ์ํ ํ
์คํธ
- [ ] ์ฑ๋ฅ ํ
์คํธ (๋ก๋ฉ ์๊ฐ 2์ด ์ด๋ด)
### ๋ฌธ์ํ
- [ ] API ๋ฌธ์ ์
๋ฐ์ดํธ
- [ ] ์ฌ์ฉ์ ๊ฐ์ด๋ ์์ฑ
- [ ] ๋ฐฐํฌ ๊ฐ์ด๋ ์
๋ฐ์ดํธ
- [ ] ํธ๋ฌ๋ธ์ํ
๊ฐ์ด๋ ์์ฑ
### ์น์ธ ํ๋ก์ธ์ค
- [ ] ๊ธฐํ์ ๊ธฐ๋ฅ ๊ฒ์ ์๋ฃ
- [ ] ๋์์ด๋ UI/UX ๊ฒ์ ์๋ฃ
- [ ] PM ์ต์ข
์น์ธ
- [ ] ์คํ
์ดํฌํ๋ ๋ฐ๋ชจ ์๋ฃ
3. ์ปค๋ฎค๋์ผ์ด์ ํ๋กํ ์ฝ
## ์ผ์ผ ์ปค๋ฎค๋์ผ์ด์
daily_standup:
์๊ฐ: "์ค์ 9:30-9:45 (15๋ถ)"
์ฐธ์์: "๊ฐ๋ฐํ ์ ์ฒด"
ํฌ๋งท:
- ์ด์ ์๋ฃํ ์์
- ์ค๋ ๊ณํํ ์์
- ๋ธ๋ก์ปค ๋๋ ๋์ ํ์์ฌํญ
์์น:
- ์ํ ๊ณต์ ๋ง, ๋ฌธ์ ํด๊ฒฐ์ ๋ณ๋ ๋ฏธํ
- 15๋ถ ์์
- ์ ๋ ๋ชปํ ์ผ์ด ์์ด๋ ์ฑ
๋งํ์ง ์์
## ์ฃผ๊ฐ ์ปค๋ฎค๋์ผ์ด์
weekly_review:
์๊ฐ: "๊ธ์์ผ ์คํ 4:00-5:00"
์ฐธ์์: "์ ์ฒด ํ + ์คํ
์ดํฌํ๋"
ํฌ๋งท:
- ์ฃผ๊ฐ ์ฑ๊ณผ ๋ฐ๋ชจ
- ๋ค์ ์ฃผ ๊ณํ ๊ณต์
- ์ด์ ๋ฐ ๋ฆฌ์คํฌ ๋
ผ์
- ํ ํผ๋๋ฐฑ ์ธ์
## ๊ธด๊ธ ์ปค๋ฎค๋์ผ์ด์
urgent_communication:
์ฑ๋: "Slack #urgent"
์๋ต์๊ฐ: "30๋ถ ์ด๋ด"
์์ค์ปฌ๋ ์ด์
: "1์๊ฐ ๋ด ๋ฏธ์๋ต ์ ์ ํ"
๋๊ตฌ๋ณ ์ปค๋ฎค๋์ผ์ด์ ์ต์ ํ
Slack ํ์ฉ ์ ๋ต
์ฑ๋ ๊ตฌ์กฐ:
โโโ #general (์ ์ฒด ๊ณต์ง)
โโโ #dev-team (๊ฐ๋ฐํ ๋ด๋ถ)
โโโ #project-alpha (ํ๋ก์ ํธ๋ณ)
โโโ #random (์ก๋ด)
โโโ #urgent (๊ธด๊ธ์ฌํญ)
โโโ #deploy (๋ฐฐํฌ ์๋ฆผ)
๋ฉ์์ง ์์ฑ ๊ท์น:
[๊ถ์ฅ] ์ค๋ ๋ ํ์ฉ์ผ๋ก ์ ๋ฆฌ๋ ๋ํ
[๊ถ์ฅ] @channel์ ์ ๋ง ๊ธด๊ธํ ๋๋ง
[๊ถ์ฅ] ์ฝ๋๋ธ๋ก์ผ๋ก ์๋ฌ ๋ฉ์์ง ๊ณต์
[๊ถ์ฅ] ์ด๋ชจ์ง ๋ฆฌ์ก์
์ผ๋ก ๋น ๋ฅธ ํ์ธ
์๋ํ ์ค์ :
โโโ GitHub ์ปค๋ฐ ์๋ฆผ
โโโ ๋ฐฐํฌ ์ํ ์๋ฆผ
โโโ ์๋ฌ ๋ชจ๋ํฐ๋ง ์ฐ๋
โโโ ์ผ์ผ ์คํ ๋์
๋ฆฌ๋ง์ธ๋
Notion ๋ฌธ์ํ ์ฒด๊ณ
ํ ์ง์๋ฒ ์ด์ค ๊ตฌ์กฐ:
[ํ๋ก์ ํธ ๊ด๋ฆฌ]
โโโ ํ๋ก์ ํธ ๋ก๋๋งต
โโโ ์คํ๋ฆฐํธ ๊ณํ
โโโ ํ์๋ก ๋ชจ์
โโโ ์์ฌ๊ฒฐ์ ๊ธฐ๋ก
[๊ฐ๋ฐ ๊ฐ์ด๋]
โโโ ์ฝ๋ฉ ์ปจ๋ฒค์
โโโ Git ์ํฌํ๋ก์ฐ
โโโ ๋ฐฐํฌ ๊ฐ์ด๋
โโโ API ๋ฌธ์
[์จ๋ณด๋ฉ]
โโโ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
โโโ ํ ์๊ฐ
โโโ ํ๋ก์ธ์ค ๊ฐ์ด๋
โโโ FAQ
[ํธ๋ฌ๋ธ์ํ
]
โโโ ์์ฃผ ๋ฐ์ํ๋ ์ด์
โโโ ๋๋ฒ๊น
๊ฐ์ด๋
โโโ ์ฑ๋ฅ ์ต์ ํ
โโโ ์ฅ์ ๋์
GitHub ํ์ ์ต์ ํ
## PR ํ
ํ๋ฆฟ
pull_request_template:
sections:
- "## ๋ณ๊ฒฝ ์ฌํญ"
- "## ํ
์คํธ ๋ฐฉ๋ฒ"
- "## ์คํฌ๋ฆฐ์ท (UI ๋ณ๊ฒฝ ์)"
- "## ์ฒดํฌ๋ฆฌ์คํธ"
checklist:
- "[ ] ํ
์คํธ ์ฝ๋ ์์ฑ/์์ "
- "[ ] ๋ฌธ์ ์
๋ฐ์ดํธ"
- "[ ] ๋ธ๋ ์ดํน ์ฒด์ธ์ง ํ์ธ"
- "[ ] ์ฑ๋ฅ ์ํฅ ๊ฒํ "
## ์ด์ ํ
ํ๋ฆฟ
issue_templates:
bug_report:
- "## ๋ฒ๊ทธ ์ค๋ช
"
- "## ์ฌํ ๋จ๊ณ"
- "## ์์ ๋์"
- "## ์ค์ ๋์"
- "## ํ๊ฒฝ ์ ๋ณด"
feature_request:
- "## ๊ธฐ๋ฅ ์ค๋ช
"
- "## ๋น์ฆ๋์ค ๊ฐ์น"
- "## ์์ฉ ๊ธฐ์ค"
- "## ์ฐ์ ์์"
์๊ตฌ์ฌํญ ์ ์์ ๊ด๋ฆฌ
User Story ์์ฑ๋ฒ
Template:
"[์ฌ์ฉ์ ์ ํ]์ผ๋ก์, [๋ชฉ์ ]์ ์ํด [๊ธฐ๋ฅ]์ ์ํ๋ค"
์์:
As a: ์จ๋ผ์ธ ์ผํ๋ชฐ ๊ณ ๊ฐ
I want: ์ฐ ๋ชฉ๋ก์ ์ํ์ ์ถ๊ฐํ๊ณ ๊ด๋ฆฌํ๊ธฐ๋ฅผ
So that: ๋์ค์ ์ฝ๊ฒ ๊ตฌ๋งค๋ฅผ ๊ฒฐ์ ํ ์ ์๋ค
Acceptance Criteria:
[์๋ฃ ์กฐ๊ฑด] ์ํ ์์ธ ํ์ด์ง์์ "์ฐํ๊ธฐ" ๋ฒํผ ํด๋ฆญ ๊ฐ๋ฅ
[์๋ฃ ์กฐ๊ฑด] ์ฐํ ์ํ์ด ์ฐ ๋ชฉ๋ก ํ์ด์ง์ ํ์๋จ
[์๋ฃ ์กฐ๊ฑด] ์ฐ ๋ชฉ๋ก์์ ์ํ ์ญ์ ๊ฐ๋ฅ
[์๋ฃ ์กฐ๊ฑด] ์ฐ ๋ชฉ๋ก์์ ๋ฐ๋ก ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ ๊ฐ๋ฅ
[์๋ฃ ์กฐ๊ฑด] ์ฐํ ์ํ ๊ฐ์๊ฐ ํค๋์ ํ์๋จ
๊ธฐ๋ฅ ๋ช ์ธ์ ํ ํ๋ฆฟ
## ๊ธฐ๋ฅ ๋ช
์ธ์: ์ฌ์ฉ์ ๋ก๊ทธ์ธ
## 1. ๊ฐ์
- ๊ธฐ๋ฅ๋ช
: ์ด๋ฉ์ผ/ํจ์ค์๋ ๋ก๊ทธ์ธ
- ์ฐ์ ์์: High
- ๋ด๋น์: ๊น๊ฐ๋ฐ
- ์์ ์์์๊ฐ: 3์ผ
## 2. ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ
- ์ฌ์ฉ์๊ฐ ์ด๋ฉ์ผ๊ณผ ํจ์ค์๋๋ก ๋ก๊ทธ์ธํ ์ ์์ด์ผ ํจ
- ๋ก๊ทธ์ธ ์คํจ ์ ์ ์ ํ ์๋ฌ ๋ฉ์์ง ํ์
- ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ๋์๋ณด๋๋ก ๋ฆฌ๋ค์ด๋ ํธ
## 3. ๊ธฐ์ ์๊ตฌ์ฌํญ
- JWT ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ
- ํจ์ค์๋ ํด์ฑ (bcrypt)
- Rate limiting (5ํ ์คํจ ์ 10๋ถ ์ฐจ๋จ)
- HTTPS ํ์
## 4. UI/UX ์๊ตฌ์ฌํญ
- ๋ชจ๋ฐ์ผ ๋ฐ์ํ ๋์์ธ
- ๋ก๋ฉ ์ํ ํ์
- ์ ๊ทผ์ฑ ์ค์ (WCAG 2.1 AA)
## 5. ํ
์คํธ ์๋๋ฆฌ์ค
- ์ ์ ๋ก๊ทธ์ธ
- ์๋ชป๋ ์ด๋ฉ์ผ/ํจ์ค์๋
- ์กด์ฌํ์ง ์๋ ๊ณ์
- ๋คํธ์ํฌ ์ค๋ฅ ์ํฉ
## 6. ์ ์์๋ฃ ์ฒดํฌ๋ฆฌ์คํธ
- [ ] ์ฝ๋ ๊ตฌํ ์๋ฃ
- [ ] ๋จ์ ํ
์คํธ ์์ฑ
- [ ] ํตํฉ ํ
์คํธ ์๋ฃ
- [ ] ๋ณด์ ๊ฒํ ์๋ฃ
- [ ] ๋ฌธ์ ์
๋ฐ์ดํธ
ํ๋ก์ ํธ ์งํ์ํฉ ํฌ๋ช ํ
๋์๋ณด๋ ๊ตฌ์ฑ
// ์ค์๊ฐ ํ๋ก์ ํธ ๋์๋ณด๋ณด๋
const ProjectDashboard = {
overview: {
totalTasks: 45,
completedTasks: 32,
inProgressTasks: 8,
blockedTasks: 2,
progressPercentage: 71
},
sprints: {
current: "Sprint 23-15",
burndownChart: "โ ์์กฐ๋ก์ด ์งํ",
velocity: "ํ๊ท 34 ํฌ์ธํธ/์คํ๋ฆฐํธ",
commitment: "85% ๋ฌ์ฑ"
},
teamVelocity: [
{ member: "๊น๊ฐ๋ฐ", velocity: 8.5, capacity: 10 },
{ member: "์ดํ๋ก ํธ", velocity: 7.2, capacity: 8 },
{ member: "๋ฐ๋ฐฑ์๋", velocity: 9.1, capacity: 10 }
],
risks: [
{
title: "์ธ๋ถ API ์์กด์ฑ",
impact: "high",
probability: "medium",
mitigation: "๋์ฒด API ์ค๋น"
}
]
}
์ฃผ๊ฐ ์งํ ๋ณด๊ณ ์
## ์ฃผ๊ฐ ๊ฐ๋ฐ ์งํ ๋ณด๊ณ ์ (2024.01.15-19)
## ์ด๋ฒ ์ฃผ ์ฑ๊ณผ
- [์๋ฃ] ์ฌ์ฉ์ ์ธ์ฆ ๋ชจ๋ ์๋ฃ (์์ ๋๋ก)
- [์๋ฃ] ๊ด๋ฆฌ์ ๋์๋ณด๋ 75% ์๋ฃ (์์ : 50%)
- [์ง์ฐ] ๊ฒฐ์ ๋ชจ๋ ์ง์ฐ (์์ : 100% โ ์ค์ : 60%)
## ๋ค์ ์ฃผ ๊ณํ
- ๊ฒฐ์ ๋ชจ๋ ์๋ฃ (์ฐ์ ์์ 1)
- ์ด๋ฉ์ผ ์๋ฆผ ์์คํ
์์
- ์ฑ๋ฅ ์ต์ ํ ์์
## ์ด์ ๋ฐ ๋ฆฌ์คํฌ
- ๊ฒฐ์ API ์๋ต ์ง์ฐ ๋ฌธ์ (ํ๊ท 3์ด)
- ์์ธ: ์ธ๋ถ PG์ฌ ์์คํ
๋ถํ
- ๋์: ํ์์์ ์ค์ ๋ฐ ์ฌ์๋ ๋ก์ง ์ถ๊ฐ
## ์งํ
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง: 78% (๋ชฉํ: 80%)
- ์๋ต ์๊ฐ: ํ๊ท 1.2์ด (๋ชฉํ: 2์ด ์ด๋ด)
- ๋ฒ๊ทธ ๋ฐ์๋ฅ : 2% (๋ชฉํ: 5% ์ด๋ด)
์ธ์ฃผ ๊ฐ๋ฐ์ฌ์์ ํจ๊ณผ์ ์ธ ์ํต
ํฅ์คํ ๋ฏธํ ์ฒดํฌ๋ฆฌ์คํธ
## ํ๋ก์ ํธ ํฅ์คํ ๋ฏธํ
์๊ฑด
### 1. ํ ์๊ฐ (30๋ถ)
- [ ] ๊ฐ์ ์ญํ ๊ณผ ์ฑ
์ ์๊ฐ
- [ ] ์ปค๋ฎค๋์ผ์ด์
์ ํธ ๋ฐฉ์ ๊ณต์
- [ ] ๊ทผ๋ฌด ์๊ฐ๋ ๋ฐ ๊ฐ์ฉ์ฑ ๋
ผ์
### 2. ํ๋ก์ ํธ ์ ๋ ฌ (60๋ถ)
- [ ] ๋น์ฆ๋์ค ๋ชฉํ ๋ฐ ์ฑ๊ณต ์งํ ๊ณต์
- [ ] ๊ธฐ์ ์ ์ ์ฝ์ฌํญ ๋ฐ ์๊ตฌ์ฌํญ ๋
ผ์
- [ ] ์ฐ์ ์์ ๋ฐ ๋ง์ผ์คํค ํ์
### 3. ํ๋ก์ธ์ค ํฉ์ (30๋ถ)
- [ ] ์ปค๋ฎค๋์ผ์ด์
์ฑ๋ ๋ฐ ์ฃผ๊ธฐ ๊ฒฐ์
- [ ] ์ฝ๋ ๋ฆฌ๋ทฐ ํ๋ก์ธ์ค ํฉ์
- [ ] ์ด์ ์์ค์ปฌ๋ ์ด์
์ ์ฐจ ์ ์
- [ ] ์งํ์ํฉ ๋ณด๊ณ ๋ฐฉ์ ๊ฒฐ์
### 4. ๋๊ตฌ ๋ฐ ํ๊ฒฝ (30๋ถ)
- [ ] ๊ฐ๋ฐ ํ๊ฒฝ ์ ๊ทผ ๊ถํ ๋ถ์ฌ
- [ ] ํ์
๋๊ตฌ ๊ณ์ ์์ฑ
- [ ] ๋ฌธ์ ๊ณต์ ๋ฐฉ์ ์ค์
- [ ] ๋ณด์ ๋ฐ ๊ธฐ๋ฐ์ ์ง ์ฌํญ ํ์ธ
์ผ์ผ ์คํ ๋์ ์ต์ ํ
ํจ๊ณผ์ ์ธ ์คํ ๋์
์ด์:
์๊ฐ: 15๋ถ ์์
โโโ ๊ฐ์ 2-3๋ถ ๋ฐํ
โโโ ์ง๋ฌธ/๋
ผ์๋ ์คํ ๋์
ํ ๋ณ๋ ์งํ
โโโ ๋ธ๋ก์ปค๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋ช
์
๋ฐํ ํฌ๋งท:
1. "์ด์ ์๋ฃํ ๊ฒ"
- ๊ตฌ์ฒด์ ์ธ ์์
๋ด์ฉ
- ์๋ฃ์จ (๊ธฐ๋ฅ์ 80% ์๋ฃ ๋ฑ)
2. "์ค๋ ํ ๊ฒ"
- ๋ช
ํํ ๋ชฉํ ์ค์
- ์์ ์๋ฃ ์๊ฐ
3. "๋์์ด ํ์ํ ๊ฒ"
- ๊ตฌ์ฒด์ ์ธ ๋ธ๋ก์ปค
- ๋๊ตฌ์ ๋์์ด ํ์ํ์ง
์์:
[์ฃผ์] "๋ก๊ทธ์ธ ๊ธฐ๋ฅ ์์
์ค์
๋๋ค."
[๊ถ์ฅ] "๋ก๊ทธ์ธ API ๊ตฌํ ์๋ฃํ๊ณ , ์ค๋์ ํ๋ก ํธ์๋ ์ฐ๋์ ์์ํฉ๋๋ค.
JWT ํ ํฐ ๊ฐฑ์ ์ ์ฑ
์ ๋ํด PM๋๊ณผ ํ์ธ์ด ํ์ํฉ๋๋ค."
์ด์ ์์ค์ปฌ๋ ์ด์ ํ๋ก์ธ์ค
๋ ๋ฒจ๋ณ ์์ค์ปฌ๋ ์ด์
:
Level 0: ๊ฐ๋ฐ์ ๊ฐ ํด๊ฒฐ (30๋ถ)
โโโ Slack DM ๋๋ ํ๋ค๋ง
โโโ ๊ฐ๋จํ ๊ธฐ์ ์ ์ง๋ฌธ
โโโ ์ฝ๋ ๋ฆฌ๋ทฐ ๊ด๋ จ
Level 1: ํ๋ฆฌ๋/PM ์ฐธ์ฌ (2์๊ฐ)
โโโ ์ผ์ ์ ์ํฅ์ ์ฃผ๋ ์ด์
โโโ ์๊ตฌ์ฌํญ ๋ชจํธํจ
โโโ ๋ฆฌ์์ค ๋ถ์กฑ
Level 2: CTO/์์ ์ฐธ์ฌ (๋น์ผ)
โโโ ์ํคํ
์ฒ ๊ฒฐ์ ํ์
โโโ ์์ฐ ์ถ๊ฐ ํ์
โโโ ์ค์ฝํ ๋ณ๊ฒฝ
Level 3: ๊ธด๊ธ ๋์ (์ฆ์)
โโโ ์๋น์ค ์ฅ์
โโโ ๋ณด์ ์ด์
โโโ ๋ฐ์ดํฐ ์์ค ์ํ
๊ฐ ๋ ๋ฒจ๋ณ ๋์ ์๊ฐ:
- ์ธ์ง: 15๋ถ ์ด๋ด
- ์ด๊ธฐ ๋์: 30๋ถ ์ด๋ด
- ํด๊ฒฐ ๋๋ ์ฐจ์์ ์์ค์ปฌ๋ ์ด์
: ๋ ๋ฒจ๋ณ ์๊ฐ ๋ด
์ฝ๋ ๋ฆฌ๋ทฐ ๋ฌธํ ๊ตฌ์ถ
ํจ๊ณผ์ ์ธ ์ฝ๋ ๋ฆฌ๋ทฐ ๊ฐ์ด๋๋ผ์ธ
// ์ข์ ์ฝ๋ ๋ฆฌ๋ทฐ ์์
// [์ฃผ์] ๋นํจ์จ์ ์ธ ํผ๋๋ฐฑ
"์ด ์ฝ๋๋ ์ข์ง ์๋ค์."
// [๊ถ์ฅ] ๊ตฌ์ฒด์ ์ด๊ณ ๊ฑด์ค์ ์ธ ํผ๋๋ฐฑ
"์ด ํจ์๊ฐ 100์ค์ด ๋์ด๊ฐ๋ค์.
๋จ์ผ ์ฑ
์ ์์น์ ์ํด ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฆฌํ๋ ๊ฒ์ ์ด๋จ๊น์?
- validateUser()
- processPayment()
- sendNotification()"
// [๊ถ์ฅ] ๋์ ์ ์์ ํจ๊ป
"ํ์ฌ O(nยฒ) ๋ณต์ก๋์
๋๋ค.
Map์ ์ฌ์ฉํ๋ฉด O(n)์ผ๋ก ๊ฐ์ ํ ์ ์์ ๊ฒ ๊ฐ์์.
```javascript
const userMap = new Map(users.map(u => [u.id, u]))
const result = ids.map(id => userMap.get(id))
```"
// [๊ถ์ฅ] ํ์ต ๊ธฐํ ์ ๊ณต
"์ข์ ํด๊ฒฐ์ฑ
์ด๋ค์! ์ถ๊ฐ๋ก ๊ณ ๋ คํด๋ณผ ์ :
- ์๋ฌ ํธ๋ค๋ง์ ์ด๋ป๊ฒ ํ ๊ณํ์ธ๊ฐ์?
- ์ด ํจํด์ ๋ค๋ฅธ ๊ณณ์๋ ์ ์ฉํ ์ ์์๊น์?"
์ฝ๋ ๋ฆฌ๋ทฐ ์ฒดํฌ๋ฆฌ์คํธ
## ๊ธฐ๋ฅ์ฑ
- [ ] ์๊ตฌ์ฌํญ์ ์ ํํ ๊ตฌํํ๋๊ฐ?
- [ ] ์ฃ์ง ์ผ์ด์ค๊ฐ ์ฒ๋ฆฌ๋์๋๊ฐ?
- [ ] ์๋ฌ ์ฒ๋ฆฌ๊ฐ ์ ์ ํ๊ฐ?
## ์ฝ๋ ํ์ง
- [ ] ํจ์/ํด๋์ค๊ฐ ๋จ์ผ ์ฑ
์์ ๊ฐ๋๊ฐ?
- [ ] ๋ค์ด๋ฐ์ด ๋ช
ํํ๊ณ ์ผ๊ด์ ์ธ๊ฐ?
- [ ] ์ค๋ณต ์ฝ๋๊ฐ ์๋๊ฐ?
- [ ] ์ฃผ์์ด ํ์ํ ๊ณณ์ ์๋๊ฐ?
## ์ฑ๋ฅ
- [ ] ๋ถํ์ํ ์ฐ์ฐ์ด ์๋๊ฐ?
- [ ] ๋ฉ๋ชจ๋ฆฌ ๋์ ๊ฐ๋ฅ์ฑ์ ์๋๊ฐ?
- [ ] ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๊ฐ ์ต์ ํ๋์๋๊ฐ?
## ๋ณด์
- [ ] ์
๋ ฅ๊ฐ ๊ฒ์ฆ์ด ๋์๋๊ฐ?
- [ ] ๊ถํ ๊ฒ์ฌ๊ฐ ์ ์ ํ๊ฐ?
- [ ] ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ๋
ธ์ถ๋์ง ์๋๊ฐ?
## ํ
์คํธ
- [ ] ๋จ์ ํ
์คํธ๊ฐ ์์ฑ๋์๋๊ฐ?
- [ ] ํ
์คํธ ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์ถฉ๋ถํ๊ฐ?
- [ ] ํตํฉ ํ
์คํธ๊ฐ ํ์ํ๊ฐ?
ํ๊ณ ์ ์ง์์ ๊ฐ์
์คํ๋ฆฐํธ ํ๊ณ ํฌ๋งท
ํ๊ณ ๋ฏธํ
(90๋ถ):
1. ์ธํ
(10๋ถ)
โโโ ๋ชฉ์ ์ค๋ช
โโโ ๊ท์น ์ค์ (๋น๋ ๊ธ์ง, ๊ฑด์ค์ ํผ๋๋ฐฑ)
โโโ ํ์๋ฐ์ค ์๋ด
2. ๋ฐ์ดํฐ ์์ง (20๋ถ)
โโโ Keep (๊ณ์ํ ๊ฒ): ํ์ด ์ํ ๊ฒ
โโโ Problem (๋ฌธ์ ์ ): ๊ฐ์ ์ด ํ์ํ ๊ฒ
โโโ Try (์๋ํ ๊ฒ): ๋ค์์ ์คํํด๋ณผ ๊ฒ
โโโ ๊ฐ์ ํฌ์คํธ์์ ์์ฑ
3. ์ธ์ฌ์ดํธ ๋์ถ (30๋ถ)
โโโ ์ ์ฌํ ์๊ฒฌ ๊ทธ๋ฃนํ
โโโ ๊ทผ๋ณธ ์์ธ ๋ถ์ (5 Why ๊ธฐ๋ฒ)
โโโ ์ฐ์ ์์ ๊ฒฐ์ (ํฌํ)
โโโ ์ก์
์์ดํ
๋์ถ
4. ์ก์
ํ๋ (20๋ถ)
โโโ ๊ตฌ์ฒด์ ์ธ ์คํ ๊ณํ
โโโ ๋ด๋น์ ์ง์
โโโ ๊ธฐํ ์ค์
โโโ ์ฑ๊ณต ์งํ ์ ์
5. ๋ง๋ฌด๋ฆฌ (10๋ถ)
โโโ ํ๊ณ ์์ฒด์ ๋ํ ํผ๋๋ฐฑ
โโโ ๋ค์ ํ๊ณ ๊ฐ์ ์ฌํญ
โโโ ๊ฐ์ฌ ํํ
์ง์์ ๊ฐ์ ์คํ
// ๊ฐ์ ์ถ์ ์์คํ
const ImprovementTracker = {
sprint23: {
issue: "์ฝ๋ ๋ฆฌ๋ทฐ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ฆผ",
rootCause: "PR ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๊ณ , ๋ฆฌ๋ทฐ ๊ธฐ์ค์ด ๋ชจํธํจ",
action: [
"PR ํฌ๊ธฐ ์ ํ (300์ค ์ดํ)",
"์ฝ๋ ๋ฆฌ๋ทฐ ์ฒดํฌ๋ฆฌ์คํธ ๋์
",
"๋ฆฌ๋ทฐ ์๊ฐ ๋ชฉํ ์ค์ (24์๊ฐ ์ด๋ด)"
],
result: "ํ๊ท ๋ฆฌ๋ทฐ ์๊ฐ 3์ผ โ 1์ผ๋ก ๋จ์ถ",
status: "์ฑ๊ณต"
},
sprint24: {
issue: "์คํ ๋์
์ด ๊ธธ์ด์ง",
rootCause: "๋ฌธ์ ํด๊ฒฐ์ ์คํ ๋์
์์ ์งํ",
action: [
"์คํ ๋์
์ ์ํ ๊ณต์ ๋ง",
"๋ฌธ์ ํด๊ฒฐ์ ํํน๋กฏ์์ ๋ณ๋ ์งํ",
"ํ์ด๋จธ ๋์
(15๋ถ ์์)"
],
result: "์งํ ์ค",
status: "์ธก์ ์ค"
}
}
์ปค๋ฎค๋์ผ์ด์ ์คํฌ ํฅ์
๊ฐ๋ฐ์๋ฅผ ์ํ ์ํต ํ
## ๊ธฐ์ ์ ๋ด์ฉ์ ๋น๊ฐ๋ฐ์์๊ฒ ์ค๋ช
ํ๊ธฐ
### [์ฃผ์] ์ ์ข์ ์
"OAuth 2.0 authorization code flow with PKCE๋ฅผ ๊ตฌํํด์ผ ํ๋๋ฐ,
JWT ํ ํฐ์ payload์ scope์ audience๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค."
### [๊ถ์ฅ] ์ข์ ์
"๋ก๊ทธ์ธ ๋ณด์์ ๊ฐํํ๋ ค๊ณ ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ํ ๋ฒ ๋ก๊ทธ์ธํ๋ฉด ๋ค๋ฅธ ์๋น์ค์์๋
์๋์ผ๋ก ์ธ์ฆ๋๋๋ก ํ๋ ๊ธฐ๋ฅ์
๋๋ค.
๊ตฌ๊ธ์ด๋ ํ์ด์ค๋ถ ๋ก๊ทธ์ธ๊ณผ ๋น์ทํ ๋ฐฉ์์ด์์."
## ์ผ์ ๊ด๋ จ ์ํต
### [์ฃผ์] ์ ์ข์ ์
"์ ํํ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง... ์๋ง ์ด๋ฒ ์ฃผ ์์๋..."
### [๊ถ์ฅ] ์ข์ ์
"ํ์ฌ 80% ์๋ฃ๋์๊ณ , ๋จ์ ์์
์ ํ
์คํธ์ ๋ฐฐํฌ์
๋๋ค.
ํฐ ์ด์๊ฐ ์๋ค๋ฉด ๊ธ์์ผ๊น์ง ์๋ฃ ์์์ด์ง๋ง,
์์ ํ๊ฒ ๋ค์ ์ฃผ ํ์์ผ์ ์ฝ์๋๋ฆฌ๊ฒ ์ต๋๋ค."
## ๋ฌธ์ ์ํฉ ๋ณด๊ณ
### [์ฃผ์] ์ ์ข์ ์
"๋ฌธ์ ๊ฐ ์๊ฒผ์ด์. ์ ๋ผ์."
### [๊ถ์ฅ] ์ข์ ์
"๊ฒฐ์ API์์ ํ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์์ต๋๋ค.
- ํ์: ๊ฒฐ์ ์๋ฃ๊น์ง 5๋ถ ์ด์ ์์
- ์์ธ: ์ธ๋ถ PG์ฌ ์์คํ
์๋ต ์ง์ฐ์ผ๋ก ์ถ์
- ์์ ์กฐ์น: ํ์์์์ 30์ด๋ก ๋๋ฆผ
- ๊ทผ๋ณธ ํด๊ฒฐ: PG์ฌ ๊ธฐ์ ํ๊ณผ ํ์ ์งํ ์ค
- ์์ ํด๊ฒฐ: ๋ด์ผ ์คํ๊น์ง"
๋๊ตฌ์ ์๋ํ
์ปค๋ฎค๋์ผ์ด์ ์๋ํ
## Slack Bot ์๋ํ ์์
automation:
daily_standup:
trigger: "๋งค์ผ ์ค์ 9:25"
action: "์คํ ๋์
5๋ถ ์ ์๋ฆผ"
deployment:
trigger: "๋ฐฐํฌ ์๋ฃ ์"
action: "๋ฐฐํฌ ์ํ ๋ฐ ๋ณ๊ฒฝ์ฌํญ ์ฑ๋์ ๊ณต์ "
pr_review:
trigger: "PR ์์ฑ ์"
action: "๋ฆฌ๋ทฐ์ด์๊ฒ ์๋ฆผ, 24์๊ฐ ํ ๋ฆฌ๋ง์ธ๋"
incident:
trigger: "์๋ฌ์จ 5% ์ด๊ณผ"
action: "์จ์ฝ ์์ง๋์ด์๊ฒ ์ฆ์ ์๋ฆผ"
weekly_report:
trigger: "๋งค์ฃผ ๊ธ์์ผ ์คํ 5์"
action: "์ฃผ๊ฐ ๊ฐ๋ฐ ํํฉ ๋ฆฌํฌํธ ์๋ ์์ฑ"
๋ฌธ์ํ ์๋ํ
// API ๋ฌธ์ ์๋ ์์ฑ
/**
* @swagger
* /api/users/{id}:
* get:
* summary: ์ฌ์ฉ์ ์ ๋ณด ์กฐํ
* parameters:
* - name: id
* in: path
* required: true
* schema:
* type: string
* responses:
* 200:
* description: ์ฑ๊ณต
* content:
* application/json:
* schema:
* $ref: '#/components/schemas/User'
*/
app.get('/api/users/:id', getUserById)
// ๋ฐฐํฌ ๋
ธํธ ์๋ ์์ฑ
const generateReleaseNotes = async (version) => {
const commits = await getCommitsSince(lastVersion)
const features = commits.filter(c => c.type === 'feat')
const bugfixes = commits.filter(c => c.type === 'fix')
return `
## ${version} ๋ฆด๋ฆฌ์ค ๋
ธํธ
### ์๋ก์ด ๊ธฐ๋ฅ
${features.map(f => `- ${f.description}`).join('\n')}
### ๋ฒ๊ทธ ์์
${bugfixes.map(b => `- ${b.description}`).join('\n')}
`
}
์ฑ๊ณผ ์ธก์ ๊ณผ ๊ฐ์
์ปค๋ฎค๋์ผ์ด์ ํจ์จ์ฑ ์งํ
const communicationMetrics = {
// ์๋ต์ฑ
responseTime: {
slack_messages: "ํ๊ท 15๋ถ",
email: "ํ๊ท 2์๊ฐ",
pr_reviews: "ํ๊ท 6์๊ฐ",
target: "๊ฐ๊ฐ 10๋ถ, 1์๊ฐ, 4์๊ฐ"
},
// ๋ช
ํ์ฑ
clarification_requests: {
current: "์ฃผ ํ๊ท 12๊ฑด",
target: "์ฃผ ํ๊ท 5๊ฑด ์ดํ",
trend: "โ ์ง๋ ๋ฌ ๋๋น 40% ๊ฐ์"
},
// ํฌ๋ช
์ฑ
progress_visibility: {
stakeholder_satisfaction: "4.2/5.0",
surprise_rate: "8% (๋ชฉํ: 5% ์ดํ)",
forecast_accuracy: "85% (๋ชฉํ: 90%)"
},
// ํ์
ํจ์จ์ฑ
meeting_efficiency: {
average_duration: "28๋ถ (๋ชฉํ: 30๋ถ)",
preparation_rate: "92%",
action_item_completion: "78% (๋ชฉํ: 85%)"
}
}
์ฒดํฌ๋ฆฌ์คํธ: ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ์์คํ
ํ ์ค์
- ์ญํ ๊ณผ ์ฑ ์ ๋ช ํํ ์ ์ (RACI)
- ์ปค๋ฎค๋์ผ์ด์ ์ฑ๋ ๊ตฌ์ถ
- ์ ๊ธฐ ๋ฏธํ ์ผ์ ์๋ฆฝ
- ๋ฌธ์ํ ์ฒด๊ณ ๊ตฌ์ถ
- ์ด์ ์์ค์ปฌ๋ ์ด์ ํ๋ก์ธ์ค ์ ์
ํ๋ก์ธ์ค
- Definition of Done ์ ์
- ์ฝ๋ ๋ฆฌ๋ทฐ ๊ฐ์ด๋๋ผ์ธ
- ์๊ตฌ์ฌํญ ์ ์ ํ ํ๋ฆฟ
- ์งํ์ํฉ ๋ณด๊ณ ํฌ๋งท
- ํ๊ณ ๋ฐ ๊ฐ์ ํ๋ก์ธ์ค
๋๊ตฌ์ ์๋ํ
- ํ์ ๋๊ตฌ ์ ์ ๋ฐ ์ค์
- ์๋ํ ์คํฌ๋ฆฝํธ ๊ตฌํ
- ๋์๋ณด๋ ๊ตฌ์ถ
- ์๋ฆผ ์์คํ ์ค์
- ๋ฌธ์ ์๋ ์์ฑ
๋ฌธํ์ ์คํฌ
- ์ฌ๋ฆฌ์ ์์ ๊ฐ ์กฐ์ฑ
- ํผ๋๋ฐฑ ๋ฌธํ ๊ตฌ์ถ
- ์ํต ์คํฌ ๊ต์ก
- ์ง์์ ๊ฐ์ ๋ง์ธ๋
- ์ฑ๊ณผ ์ธก์ ๋ฐ ๊ฐ์
์ํต์ด ๊ณง ์๋๋ค
"์ํตํ๋ ํ์ด ๋น ๋ฅธ ํ์ด๋ค"
ํจ๊ณผ์ ์ธ ์ปค๋ฎค๋์ผ์ด์ ์ ๋จ์ํ ๋ง์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค. ์ ๋ณด๊ฐ ์ ํํ๊ณ ๋น ๋ฅด๊ฒ ํ๋ฅด๋ ์์คํ ์ ๋ง๋๋ ๊ฒ์ ๋๋ค.
์ฑ๊ณตํ๋ ์คํํธ์ ์ ์ปค๋ฎค๋์ผ์ด์ ํน์ง:
- ํฌ๋ช ์ฑ: ๋ชจ๋ ์ ๋ณด๊ฐ ๊ณต๊ฐ๋๊ณ ์ ๊ทผ ๊ฐ๋ฅ
- ์ ์์ฑ: ๋น ๋ฅธ ํผ๋๋ฐฑ ๋ฃจํ์ ์์ฌ๊ฒฐ์
- ์ ํ์ฑ: ์คํด์ ์ฌ์ง๊ฐ ์๋ ๋ช ํํ ์ํต
- ์ง์์ฑ: ์ผํ์ฑ์ด ์๋ ์์คํ ํ๋ ํ๋ก์ธ์ค
๊ธฐ์ตํ ์ :
- ์๋ฒฝํ ์์คํ ์ ์๋ค. ์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ผ
- ๋๊ตฌ๋ ์๋จ์ผ ๋ฟ, ๋ฌธํ๊ฐ ๋ ์ค์ํ๋ค
- ์ํต์ ํฌ์ํ ์๊ฐ์ ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ์ํจ๋ค
์ง๊ธ ๋น์ฅ ํ์ ์ปค๋ฎค๋์ผ์ด์ ํํฉ์ ์ ๊ฒํด๋ณด์ธ์. ์์ ๊ฐ์ ์ด๋ผ๋ ์์ํ๋ฉด ํฐ ๋ณํ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
ํ์ ์ปค๋ฎค๋์ผ์ด์ ๋ฌธ์ ๊ฐ ๊ณ ๋ฏผ์ด์ ๊ฐ์? ์๋ด ์ ์ฒญํ๊ธฐ๋ฅผ ํตํด ๊ท์ฌ์ ์ต์ ํ๋ ํ์ ์์คํ ๊ตฌ์ถ์ ๋์๋๋ฆฝ๋๋ค.