メインコンテンツまでスキップ

Polisterアーキテクチャドキュメント

概要

Polisterは、Clean Architectureと**Domain-Driven Design (DDD)**を組み合わせた設計アプローチを採用しています。このドキュメントでは、プロジェクト全体のアーキテクチャ方針と実装ガイドラインを提供します。

アーキテクチャ方針

Clean Architecture + DDD統合

Polisterでは、Clean Architectureの層構造にDDDの戦術的パターンを組み合わせることで、以下を実現します:

  1. ビジネスロジックの中心化: ドメイン層にビジネスルールを集約
  2. 技術的詳細からの独立: インフラ層への依存を排除
  3. ユビキタス言語の徹底: ドメイン専門家と開発者で共通の語彙を使用
  4. バウンデッドコンテキストの明確化: 機能ごとに独立したモジュール構造

層の責務とDDD要素の配置

Clean Architectureの責務DDD要素配置場所
Domainビジネスルール集約、エンティティ、値オブジェクト、ドメインサービス、ドメインイベント、リポジトリIFfeatures/*/domain/
Applicationユースケース調整アプリケーションサービス、ユースケース、DTOfeatures/*/application/
Infrastructure技術的詳細リポジトリ実装、マッパー、外部APIfeatures/*/infrastructure/, infrastructure/
PresentationUI/APIReact Component、API Routesapp/, features/*/ui/

システム全体の概要

バウンデッドコンテキスト

Polisterは以下の主要なバウンデッドコンテキストで構成されます:

コンテキストディレクトリ主な責務集約ルート
掲示板管理features/board掲示板の位置情報管理Board
検証管理features/verification検証依頼と承認フローVerification
インポートfeatures/import外部データ取り込みImportJob
自治体管理features/municipality市区町村情報管理Municipality

各コンテキストは独立したドメインモデルを持ち、コンテキスト間の連携はアプリケーション層で調停します。

利用可能なドキュメント

📚 ガイドライン

アーキテクチャの実装ガイドラインを提供します:

  • Clean Architecture実装ガイド

    • 層構造とディレクトリ構成
    • Repository Pattern、DI、Use Case実装
    • Polister固有の実装例
  • DDD導入ガイド

    • ユビキタス言語とバウンデッドコンテキスト
    • 集約、値オブジェクト、ドメインサービス
    • ドメインイベントとテスト戦略
  • コーディング規約

    • TypeScript、命名規則、フォーマット
    • コーディングスタイルの統一
  • テストガイドライン

    • ユニットテスト、統合テスト戦略
    • ドメイン層のテスト方針

📊 図表

技術スタック

フロントエンド

  • Framework: Next.js 15 (App Router)
  • UI Library: React 19, Material UI 7
  • Language: TypeScript 5 (strict mode)
  • Styling: Emotion
  • Map: Mapbox GL JS 3

バックエンド

  • API: Next.js API Routes
  • Database: PostgreSQL + PostGIS
  • ORM: Prisma 6
  • DI Container: tsyringe

開発ツール

  • Linter: ESLint
  • Formatter: Prettier (import自動整理)
  • Testing: Jest, React Testing Library, Playwright
  • CI/CD: GitHub Actions
  • Code Review: CodeRabbit

アーキテクチャ原則

1. ドメイン駆動設計(DDD)

  • ユビキタス言語: ドメイン専門家と開発者が同じ語彙を使用
  • バウンデッドコンテキスト: 機能ごとに独立したモデルを持つ
  • 集約: 不変条件を守る責任境界を明確化
  • ドメインイベント: 副作用を分離し、疎結合を実現

2. Clean Architecture

  • 依存性の逆転: 上位レイヤーが下位レイヤーに依存しない
  • 関心の分離: 各レイヤーが明確な責務を持つ
  • テスト可能性: すべてのコンポーネントが単体テスト可能
  • 保守性: コードの変更が他の部分に影響を与えない

3. SOLID原則

  • Single Responsibility: 各クラスは1つの責任のみ
  • Open/Closed: 拡張に開き、修正に閉じる
  • Liskov Substitution: インターフェースの一貫性を保つ
  • Interface Segregation: 必要なメソッドのみを公開
  • Dependency Inversion: 抽象に依存し、具象に依存しない

4. 実装原則

  • any型の禁止: TypeScript strict modeで型安全性を確保
  • Barrelファイルの禁止: 直接的なインポートで依存関係を明示
  • インターフェース駆動: すべての外部依存をインターフェース経由で扱う
  • ドメイン層の独立性: 外部ライブラリへの依存を排除

ディレクトリ構造の概要

src/
├── app/ # Next.js App Router
│ ├── (auth)/ # 認証が必要なルート
│ ├── (public)/ # 公開ルート
│ └── api/ # API Routes (Presentation層)
├── features/ # 機能別モジュール(バウンデッドコンテキスト)
│ ├── board/ # 掲示板管理コンテキスト
│ │ ├── domain/ # ドメイン層(DDD Core)
│ │ │ ├── aggregates/ # 集約ルート
│ │ │ ├── entities/ # エンティティ
│ │ │ ├── value-objects/ # 値オブジェクト
│ │ │ ├── services/ # ドメインサービス
│ │ │ ├── events/ # ドメインイベント
│ │ │ └── repositories/ # リポジトリIF
│ │ ├── application/ # アプリケーション層
│ │ │ ├── usecases/ # ユースケース
│ │ │ └── services/ # アプリケーションサービス
│ │ ├── infrastructure/ # インフラ層
│ │ │ ├── repositories/ # リポジトリ実装
│ │ │ └── mappers/ # DTO変換
│ │ └── ui/ # UIコンポーネント
│ ├── verification/ # 検証管理コンテキスト
│ ├── import/ # インポートコンテキスト
│ └── municipality/ # 自治体管理コンテキスト
├── shared/ # 共有リソース
│ ├── ui/ # 共通UIコンポーネント
│ ├── lib/ # ユーティリティ
│ │ ├── di/ # Dependency Injection
│ │ ├── errors/ # エラーハンドリング
│ │ └── utils/ # ユーティリティ関数
│ └── types/ # 共通型定義
└── infrastructure/ # 共有インフラ
├── database/ # Prisma設定
│ ├── schema.prisma
│ └── migrations/
└── external/ # 外部APIクライアント
├── mapbox/
└── geocoding/

詳細はClean Architecture実装ガイドを参照してください。

クイックスタート

  1. 要件定義を確認: プロジェクト概要でユビキタス言語を理解
  2. アーキテクチャガイドを読む: Clean Architecture実装ガイドDDD導入ガイド
  3. コーディング規約を確認: コーディング規約
  4. 実装を開始: 既存のfeatureモジュールを参考に新機能を実装

参考リンク


最終更新: 2025年10月