| name | adr |
| description | Use when making architectural decisions, choosing between frameworks/libraries/databases, deciding on data models, or recording any decision that would be expensive to reverse. Do NOT use for code documentation (comments belong in code), daily notes (use obsidian-note), or TIL (use til). |
Architecture Decision Records (ADR)
๊ฒฐ์ ์ ์ด์ ๋ฅผ ๊ธฐ๋ก. ์ฝ๋๋ ๋ฌด์์ ํ๋์ง ๋ณด์ฌ์ฃผ์ง๋ง ADR์ ์ ๊ทธ๋ ๊ฒ ํ๋์ง์ ์ด๋ค ๋์์ ๋ฒ๋ ธ๋์ง๋ฅผ ๋ณด์กดํ๋ค. ์ด ๋งฅ๋ฝ์ ๋ฏธ๋์ ์์ง๋์ด์ ์์ด์ ํธ๊ฐ ์ฌ๋
ผ์ํ์ง ์๋๋ก ํ๋ค.
Quick Start
CRITICAL Rules
- ALWAYS record Context, Decision, Alternatives, Consequences โ 4๊ฐ์ง ๋ชจ๋ ํ์. ํ๋๋ผ๋ ๋น ์ง๋ฉด ADR์ด ์๋๋ผ ๋ฉ๋ชจ.
- NEVER delete old ADRs โ ๊ฒฐ์ ์ด ๋ฐ๋๋ฉด ์ ADR์ ์์ฑํด ์ด์ ADR์
Superseded by ADR-NNN์ผ๋ก ํ์. ๊ณผ๊ฑฐ ๋งฅ๋ฝ์ ์ญ์ ํ์ง ๋ง ๊ฒ.
- ALWAYS list alternatives considered โ "์ ์ด๊ฑธ ์ ๊ณจ๋๋๊ฐ"๊ฐ "์ ์ด๊ฑธ ๊ณจ๋๋๊ฐ"๋งํผ ์ค์.
- NEVER write ADR for trivial decisions โ "ํจ์ ์ด๋ฆ์ camelCase๋ก ํ๋ค" ๊ฐ์ ๊ฑด ADR ์๋. ๋๋๋ฆฌ๊ธฐ ๋น์ผ ๊ฒฐ์ ์๋ง.
- ALWAYS date the ADR โ ๊ฒฐ์ ์์ ์ ์ ์ฝยท๋งฅ๋ฝ์ด ์๊ฐ์ ๋ฐ๋ผ ๋ฐ๋๋ค.
- PREFER short ADRs โ 1~2ํ์ด์ง. ์ฅํฉํ ADR์ ์ฝํ์ง ์๋๋ค.
When to Write
ADR์ ์์ฑํด์ผ ํ ๋
- ํ๋ ์์ํฌยท๋ผ์ด๋ธ๋ฌ๋ฆฌยท์ฃผ์ ์์กด์ฑ ์ ํ (React vs Vue, Prisma vs TypeORM)
- ๋ฐ์ดํฐ ๋ชจ๋ธ์ด๋ DB ์คํค๋ง ์ค๊ณ
- ์ธ์ฆ ์ ๋ต ์ ํ (JWT vs Session, OAuth ์ ๊ณต์ ์ ํ)
- API ์ํคํ
์ฒ ๊ฒฐ์ (REST vs GraphQL vs tRPC)
- ๋น๋ ๋๊ตฌยทํธ์คํ
ํ๋ซํผยท์ธํ๋ผ ์ ํ
- ๋๋๋ฆฌ๊ธฐ ๋น์ผ ๊ฒฐ์ ์ด๋ผ๋ฉด ๋ฌด์์ด๋
ADR์ ์์ฑํ์ง ๋ง์์ผ ํ ๋
- ๋ณ์๋ช
ยทํจ์๋ช
๊ฐ์ ์ผ์ ์ฝ๋ฉ ๊ฒฐ์
- ์ฝ๊ฒ ๋๋๋ฆด ์ ์๋ ์์
- ์ด๋ฏธ ์ฝ๋์์ ๋ช
ํํ "๋ฌด์" ์ค๋ช
โ ๊ทธ๊ฑด ์ฃผ์์ ์์ญ
- ํ๋กํ ํ์
์ ์ผํ์ฑ ๊ฒฐ์
ADR Template
docs/decisions/ADR-NNN-์งง์-์ ๋ชฉ.md:
# ADR-001: Primary DB๋ก PostgreSQL ์ฌ์ฉ
## Status
Accepted | Superseded by ADR-NNN | Deprecated
## Date
2026-04-16
## Context
ํ์คํฌ ๊ด๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์
์ primary DB๊ฐ ํ์ํ๋ค. ์ฃผ์ ์๊ตฌ์ฌํญ:
- ๊ด๊ณํ ๋ฐ์ดํฐ ๋ชจ๋ธ (users, tasks, teams ๊ด๊ณ)
- ํ์คํฌ ์ํ ๋ณ๊ฒฝ์ ์ํ ACID ํธ๋์ญ์
- ํ์คํฌ ๋ด์ฉ์ ๋ํ full-text search
- ๊ด๋ฆฌํ ํธ์คํ
(์๊ท๋ชจ ํ, ์ด์ ์ญ๋ ์ ํ)
## Decision
PostgreSQL + Prisma ORM ์ฌ์ฉ.
## Alternatives Considered
### MongoDB
- **Pros:** ์ ์ฐํ ์คํค๋ง, ์์ ์ฉ์ด
- **Cons:** ์ฐ๋ฆฌ ๋ฐ์ดํฐ๋ ๋ณธ์ง์ ์ผ๋ก ๊ด๊ณํ. ๊ด๊ณ๋ฅผ ์๋ ๊ด๋ฆฌํด์ผ ํจ
- **Rejected:** ๋ฌธ์ ์ ์ฅ์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ ๋ณต์กํ join ๋๋ ๋ฐ์ดํฐ ์ค๋ณต์ ์ด๋
### SQLite
- **Pros:** ์ค์ ์์, ์๋ฒ ๋๋, ์ฝ๊ธฐ ๋น ๋ฆ
- **Cons:** ๋์ ์ฐ๊ธฐ ์ ํ, ํ๋ก๋์
๊ด๋ฆฌํ ํธ์คํ
์์
- **Rejected:** ๋ฉํฐ์ ์ ์น ํ๋ก๋์
์ ๋ถ์ ํฉ
### MySQL
- **Pros:** ์ฑ์ํ๊ณ ๋๋ฆฌ ์ง์
- **Cons:** PostgreSQL์ด JSONยทfull-text searchยทecosystem ํด๋ง์์ ์ฐ์
- **Rejected:** ์ฐ๋ฆฌ ๊ธฐ๋ฅ ์๊ตฌ์ PostgreSQL์ด ๋ ์ ํฉ
## Consequences
### Positive
- Prisma๊ฐ ํ์
์์ DB ์ ๊ทผ + migration ์ ๊ณต
- PostgreSQL์ full-text search๋ก Elasticsearch ์ถ๊ฐ ํํผ
- ๊ด๋ฆฌํ ์๋น์ค (Supabase, Neon, RDS)์์ ํธ์คํ
๊ฐ๋ฅ
### Negative
- ํ์ด PostgreSQL ์ง์ ํ์ (ํ์ค ์คํฌ์ด๋ผ ๋ฆฌ์คํฌ ๋ฎ์)
- Prisma ํ์ต ๊ณก์ (MongoDB ์ด ๊ฒฝํ๊ณผ ๋ค๋ฆ)
### Neutral
- ๋ง์ด๊ทธ๋ ์ด์
์ด ๋ฒ์ ๊ด๋ฆฌ๋จ โ ๋กค๋ฐฑ ์ ๋ต ํ์
ADR Lifecycle
PROPOSED โ ACCEPTED โ (SUPERSEDED | DEPRECATED)
| Status | ์๋ฏธ |
|---|
| Proposed | ๊ฒํ ์ค, ์์ง ๊ฒฐ์ ์ ๋จ |
| Accepted | ๊ฒฐ์ ๋จ, ๊ตฌํ๋จ |
| Superseded | ์ ADR์ด ์ด ๊ฒฐ์ ์ ๋์ฒด โ ๋ณธ๋ฌธ์ Superseded by ADR-NNN ๋ช
์ |
| Deprecated | ๋ ์ด์ ์ ํจํ์ง ์์ง๋ง ๋์ฒด๊ฐ ์์ โ ์ญ์ฌ์ ์ฐธ์กฐ์ฉ |
๊ฒฐ์ ์ด ๋ฐ๋ ๋
ADR-007์ด ADR-001์ ๋์ฒดํ๋ค๋ฉด:
- ์ ADR-007์ ์ด๋ค (Context์ "ADR-001์ ๋์ฒดํ๋ ์ด์ " ํฌํจ)
- ADR-001์ Status๋ฅผ
Superseded by ADR-007๋ก ์
๋ฐ์ดํธ
- ADR-001์ ์ญ์ ํ์ง ์๋๋ค โ ๊ณผ๊ฑฐ ๋งฅ๋ฝ์ ๋ณด์กด
"์ ์ด๋ ๊ฒ ํ์ง?"๋ฅผ 3๋
๋ค ๋๊ตฐ๊ฐ ๋ฌผ์ ๋, ์๋ณธ ADR์ Context๊ฐ ๋ต์ด๋ค.
Storage & Numbering
- ์์น:
docs/decisions/ ๋๋ docs/adr/ (ํ๋ก์ ํธ ๊ด์ต ๋ฐ๋ฆ)
- ๋ค์ด๋ฐ:
ADR-NNN-kebab-case-title.md (์: ADR-003-use-postgres.md)
- ์์ฐจ ๋ฒํธ โ ์ ๋ ์ฌ์ฌ์ฉ ๊ธ์ง
- ์ ๋ฆฌํฌ ๋ง๋ค ๋
docs/decisions/README.md์ ADR ๋ชฉ๋ก ์ ์ง (์ ํ)
Agent-Specific Notes
AI ์์ด์ ํธ๊ฐ ์ฝ๋๋ฒ ์ด์ค์์ ์์
ํ ๋ ADR์ ํนํ ๊ฐ์น๊ฐ ํฌ๋ค:
- ์์ด์ ํธ๊ฐ ์ด๋ฏธ ๊ฒฐ์ ๋ ๊ฒ์ ์ฌ๋
ผ์ํ์ง ์๋๋ก ํจ
- CLAUDE.md์์
docs/decisions/๋ฅผ ์ฝ์ผ๋ผ๊ณ ์ง์ ๊ฐ๋ฅ
- ์ ๊ธฐ๋ฅ ๊ตฌํ ์ ๊ด๋ จ ADR ํ์ธ์ผ๋ก ์ผ๊ด์ฑ ์ ์ง
Common Rationalizations
| ๋ณ๋ช
| ๋ฐ๋ฐ |
|---|
| "์ฝ๋๊ฐ ์ค์ค๋ก ๋ฌธ์ํ๋๋ค" | ์ฝ๋๋ ๋ฌด์์ ๋ณด์ฌ์ค๋ค. ์ ๊ทธ๋ ๊ฒ ํ๋์ง, ์ด๋ค ๋์์ ๋ฒ๋ ธ๋์ง, ์ด๋ค ์ ์ฝ์ด ์์๋์ง๋ ์ ๋ณด์ฌ์ค๋ค. |
| "API๊ฐ ์์ ํ๋๋ฉด ๋ฌธ์ํํ ๊ฒ์" | API๋ ๋ฌธ์ํํ ๋ ๋ ๋นจ๋ฆฌ ์์ ํ๋๋ค. ๋ฌธ์๋ ์ค๊ณ์ ์ฒซ ํ
์คํธ๋ค. |
| "์๋ฌด๋ ๋ฌธ์ ์ ์ฝ์ด์" | ์์ด์ ํธ๋ ์ฝ๋๋ค. ๋ฏธ๋ ์์ง๋์ด๋ ์ฝ๋๋ค. 3๊ฐ์ ๋ค์ ๋น์ ๋ ์ฝ๋๋ค. |
| "ADR์ ์ค๋ฒํค๋์์" | 10๋ถ์ง๋ฆฌ ADR์ด 6๊ฐ์ ๋ค ๊ฐ์ ๊ฒฐ์ ์ ๋ํ 2์๊ฐ ๋
ผ์์ ์๋ฐฉํ๋ค. |
| "๋๋๋ฆฌ๋ฉด ๋์์์" | ๋๋๋ฆด ์ ์์ผ๋ฉด ADR์ด ํ์ ์๋ค. ๋๋๋ฆฌ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ๊ธฐ๋กํ๋ค. |
Red Flags
- ์๋ฉด ๊ทผ๊ฑฐ ์๋ ์ํคํ
์ฒ ๊ฒฐ์
- ์ค์ ์ํคํ
์ฒ ์ ํ์ด ์๋๋ฐ ADR์ด ์๋ ํ๋ก์ ํธ
- "ํ์ด ๊ฒฐ์ ํ๋ค"๋ง ์๊ณ ์ด์ ๊ฐ ์๋ ADR
- Alternatives Considered ์น์
์ด ์๋ ADR
- ์ญ์ ๋ ์ ADR (git ํ์คํ ๋ฆฌ์๋ง ์กด์ฌ)
- 1๋
๋๊ฒ
Proposed ์ํ๋ก ๋ฐฉ์น๋ ADR
Verification
ADR ์์ฑ ํ:
Cross-References
| Topic | Skill |
|---|
| ๊ฐ์ธ ์ง์ ๋
ธํธ | obsidian-note |
| TIL (์ผ์ผ ํ์ต) | til |
| ํ๋ก์ ํธ ์์
๋ก๊ทธ | devlog |
| ์ธ์
๋งฅ๋ฝ ์ ๋ฌ | session-handoff |
| ์ฝ๋ ๋ฆฌ๋ทฐ | code-review |
References