Files
2nd/10_Wiki/Topics/Other/decisions.md
T
koriweb d8a80f6272 chore(wiki): dangling 링크 canonical 정규화 (768파일/1200건)
이름만 다른(표기 변형) [[위키링크]]를 대상 문서의 canonical 제목으로 치환해
끊겼던 1,200개 링크를 연결. 제목/파일명 정규화 일치만 적용하고 별칭 매칭은
과병합 위험으로 제외(애매성 가드). 원본은 _link_reconcile_backup/ 에 백업.
도구: Datacollect/scripts/link_reconcile_apply.mjs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-08 12:24:15 +09:00

5.4 KiB

id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
id title category status canonical_id aliases duplicate_of source_trust_level confidence_score verification_status tags raw_sources last_reinforced github_commit tech_stack
wiki-2026-0508-decisions Architecture Decision Records (ADR) 10_Wiki/Topics verified self
ADR
Decision Log
Architecture Decisions
none A 0.9 applied
adr
architecture
decisions
documentation
engineering
2026-05-10 pending
language framework
markdown adr-tools

Architecture Decision Records (ADR)

매 한 줄

"매 immutable record of architectural choices, written in the moment of decision". Michael Nygard 가 2011 년 originally proposed; 2026 modern engineering org 의 standard practice — single ADR file per decision, append-only, version-controlled in repo alongside code.

매 핵심

매 ADR file 구조

  • Title: short noun phrase (e.g., "Use PostgreSQL for transactional store").
  • Status: Proposed → Accepted → Deprecated → Superseded.
  • Context: forces 와 constraints 의 background.
  • Decision: what we will do — active voice, declarative.
  • Consequences: positive / negative / neutral trade-offs.

매 lifecycle

  • ADR 는 immutable — supersede 하려면 new ADR 작성, old 의 status 를 Superseded by ADR-N 로 update.
  • PR review 의 part — engineering team 의 collective signoff.
  • ADR-001 부터 sequential numbering, 절대 renumbering 안 함.

매 응용

  1. Microservices boundary 의 결정 (e.g., service split rationale).
  2. Data store / message queue 의 선택 (Postgres vs DynamoDB).
  3. Auth flow / API style (REST vs GraphQL vs gRPC).
  4. Build tooling / CI 의 stack lock-in.

💻 패턴

Nygard ADR template (md)

# ADR-007: Adopt PostgreSQL for primary OLTP

## Status
Accepted (2026-05-08)

## Context
We need an ACID-compliant store for orders.
Read/write ratio is 3:1, peak 2k QPS.
Team has Postgres ops experience; Aurora / RDS managed offering available.

## Decision
We will use Amazon RDS for PostgreSQL 16 as the primary OLTP store.

## Consequences
+ Strong consistency, mature ecosystem.
+ Existing in-house expertise reduces ramp.
- Vendor lock-in to AWS RDS.
- Need to manage VACUUM tuning at >10M rows/table.

MADR template (richer variant)

---
status: accepted
date: 2026-05-08
deciders: [alice, bob, carol]
consulted: [security-team]
informed: [eng-all]
---
# Use Kafka for event bus

## Context and Problem Statement
How do we propagate domain events across 8 microservices?

## Considered Options
- Kafka
- RabbitMQ
- AWS SNS/SQS

## Decision Outcome
Chosen: Kafka, because durable replay + partition ordering matter.

### Positive Consequences
- Replayable history (compaction).
- High throughput (>1M msg/s).

### Negative Consequences
- Operational complexity (ZK / KRaft).

adr-tools CLI workflow

# Init in repo
adr init doc/adr

# Create new ADR
adr new "Use Postgres for OLTP"
# -> doc/adr/0007-use-postgres-for-oltp.md

# Supersede old decision
adr new -s 3 "Replace MongoDB with Postgres"
# -> auto-marks ADR-0003 as Superseded

Lightweight in-PR ADR (modern variant)

<!-- .github/PULL_REQUEST_TEMPLATE.md -->
## Decision Record
- **Choice**: <one sentence>
- **Why now**: <trigger>
- **Alternatives considered**: <list>
- **Trade-offs accepted**: <list>

ADR index generation (CI script)

# scripts/build_adr_index.py
import re, pathlib
adrs = sorted(pathlib.Path("doc/adr").glob("[0-9]*.md"))
lines = ["# ADR Index\n"]
for f in adrs:
    title = next(l[2:].strip() for l in f.read_text().splitlines() if l.startswith("# "))
    status = re.search(r"## Status\n(\w+)", f.read_text()).group(1)
    lines.append(f"- [{f.stem}]({f.name}) — {title} ({status})")
pathlib.Path("doc/adr/README.md").write_text("\n".join(lines))

매 결정 기준

상황 Approach
Solo / prototype Skip ADR — overhead > benefit
Team ≥ 3, multi-quarter project Nygard ADR mandatory
Regulated env (FDA, SOC2) MADR + sign-off metadata
Very fast-moving startup In-PR lightweight ADR
Architecture review board MADR with consulted / informed

기본값: Nygard ADR in doc/adr/, accepted via PR review, supersession over deletion.

🔗 Graph

🤖 LLM 활용

언제: Engineering team ≥ 3, decisions have multi-month consequences, onboarding context value matters. 언제 X: Personal project, throwaway prototype, decisions reversible in <1 day.

안티패턴

  • Edit history erasure: ADR 를 mutate — supersession chain 의 의도 가 lost.
  • Decision-by-Slack: ADR 없이 채팅 만 의 합의 — 6 개월 후 누구 도 rationale 모름.
  • Over-documentation: 매 trivial choice 의 ADR — signal-to-noise drops.
  • Status drift: Accepted ADR 가 production 의 actual state 와 diverge — periodic audit 필요.

🧪 검증 / 중복

  • Verified (Michael Nygard 2011 original post; ThoughtWorks Tech Radar "Adopt"; AWS / Spotify / GitHub public ADR repos).
  • 신뢰도 A.

🕓 Changelog

날짜 변경
2026-05-08 Phase 1
2026-05-10 Manual cleanup — full ADR taxonomy + Nygard/MADR templates + adr-tools workflow