ストーリー
ADRとは
ADR(Architecture Decision Record)は、アーキテクチャに関する重要な意思決定を記録するための軽量なドキュメントです。
interface ADR {
// メタ情報
id: string; // ADR-001
title: string; // 短く明確なタイトル
date: string; // 決定日
status: ADRStatus; // ステータス
deciders: string[]; // 決定者
// 本文
context: string; // 背景(なぜ決定が必要なのか)
decision: string; // 決定(何を決めたか)
consequences: { // 結果(どうなるか)
positive: string[];
negative: string[];
neutral: string[];
};
}
type ADRStatus =
| "proposed" // 提案中
| "accepted" // 承認済み
| "deprecated" // 非推奨(新しいADRで置き換え)
| "superseded"; // 置き換え済み
ADRのテンプレート
Michael Nygardが提唱した標準テンプレートです。
# ADR-001: APIの認証方式にJWTを採用する
## ステータス
承認済み(2025-03-15)
## コンテキスト
新規APIサービスの認証方式を決定する必要がある。
現在のモノリスではセッションベースの認証を使用しているが、
マイクロサービス化に伴い、サービス間通信での認証も考慮する必要がある。
検討時の制約条件:
- モバイルアプリからのアクセスに対応
- マイクロサービス間でのステートレスな認証
- 既存のユーザーデータベースとの統合
## 決定
JWT(JSON Web Token)を認証方式として採用する。
具体的には:
- アクセストークン: JWT(有効期限15分)
- リフレッシュトークン: Opaque Token(有効期限7日)
- 署名アルゴリズム: RS256(公開鍵暗号方式)
## 結果
### ポジティブ
- サービス間でトークンの検証が可能(各サービスが公開鍵で検証)
- 共有セッションストアが不要になり、インフラがシンプルに
- モバイルアプリとの統合が容易
### ネガティブ
- トークンの即時無効化が困難(有効期限切れを待つ必要がある)
→ 短い有効期限 + ブラックリストで軽減
- トークンサイズがセッションIDより大きい
→ ペイロードを必要最小限にする
- 秘密鍵の管理が必要
→ AWS Secrets Manager で管理
### ニュートラル
- チーム内のJWT実装経験者は2名。他メンバーへの教育が必要
- 既存のセッション認証は段階的に移行する
ADRを書くべきタイミング
| 書くべき場面 | 例 |
|---|---|
| 技術スタックの選択 | フレームワーク、DB、クラウドサービス |
| アーキテクチャパターンの採用 | マイクロサービス、CQRS、Event Sourcing |
| 設計上のトレードオフ | パフォーマンス vs 可読性 |
| 外部サービスの統合 | 決済サービス、認証プロバイダー |
| コーディング規約の変更 | テスト戦略、エラーハンドリング方針 |
// ADRが不要な場合
const noADRNeeded = [
"変数名の命名", // コーディング規約で十分
"UIの色やフォント", // デザインシステムで管理
"ライブラリの小さな更新", // CHANGELOG で十分
"バグ修正の方法", // PR の説明で十分
];
ADRの管理方法
## ディレクトリ構造
docs/
└── adr/
├── 0001-use-jwt-for-authentication.md
├── 0002-adopt-postgresql-as-primary-database.md
├── 0003-use-nestjs-for-api-services.md
├── 0004-implement-event-sourcing-for-orders.md
└── README.md ← ADR一覧と概要
## ファイル命名規則
- 連番-kebab-case のタイトル
- 例: 0001-use-jwt-for-authentication.md
## ADR一覧(README.md)
| ID | タイトル | ステータス | 日付 |
|----|---------|-----------|------|
| 001 | API認証にJWTを採用 | 承認済み | 2025-03-15 |
| 002 | PostgreSQLをメインDBに採用 | 承認済み | 2025-03-20 |
| 003 | NestJSをAPIフレームワークに採用 | 承認済み | 2025-04-01 |
| 004 | 注文にEvent Sourcingを適用 | 提案中 | 2025-04-10 |
ADRのベストプラクティス
| プラクティス | 説明 |
|---|---|
| イミュータブル | 一度承認したADRは変更しない。新しいADRで置き換える |
| 簡潔に | 1-2ページに収める。長すぎると読まれない |
| コンテキスト重視 | 「何を」だけでなく「なぜ」を記録する |
| 代替案を記録 | 却下した選択肢とその理由も書く |
| コードの近くに | リポジトリ内の docs/adr/ に保管する |
まとめ
| ポイント | 内容 |
|---|---|
| ADRとは | アーキテクチャの意思決定を記録する軽量ドキュメント |
| テンプレート | コンテキスト → 決定 → 結果の3部構成 |
| 書くタイミング | 技術選択、パターン採用、トレードオフの判断時 |
| 管理 | リポジトリ内に連番ファイルで保管。イミュータブル |
チェックリスト
- ADRの目的と構造を説明できる
- ADRを書くべきタイミングを判断できる
- 標準テンプレートの各セクションを理解した
- ADRの管理方法を把握した
次のステップへ
次は「RFCプロセスの設計」を学びます。ADRが決定を記録するものなら、RFCは決定に至るまでの議論プロセスを構造化するものです。
推定読了時間: 25分