Skip to content

Go-DDDマーケットプレイスアプリケーション

1. 概要

Go-DDDマーケットプレイスアプリケーションは、ドメイン駆動設計(Domain-Driven Design, DDD)の原則に従って構築されたGoアプリケーションです。このセットアップガイドでは、開発環境の構築から、アプリケーションの実行、テストまでの一連の手順を説明します。

flowchart TD
    subgraph "開発環境"
        go["Go"]
        docker["Docker"]
        git["Git"]
        node["Node.js"]
    end

    subgraph "データベース"
        postgres["PostgreSQL"]
        mysql["MySQL"]
    end

    subgraph "アプリケーション"
        backend["バックエンド"]
        frontend["フロントエンド"]
        docs["ドキュメント"]
    end

    subgraph "ツール"
        wiki["Wiki.js"]
        plantuml["PlantUML"]
    end

    go --> backend
    docker --> postgres
    docker --> mysql
    docker --> wiki
    docker --> plantuml
    node --> frontend
    node --> docs
    git --> backend
    git --> frontend
    git --> docs

2. 前提条件

Go-DDDマーケットプレイスアプリケーションを構築するには、以下のソフトウェアが必要です:

ソフトウェア バージョン 備考
Go 1.23 プログラミング言語
Docker 最新 コンテナ化
Docker Compose 最新 マルチコンテナ管理
Git 最新 バージョン管理
Node.js 20.x フロントエンド開発

3. セットアップ手順

以下のステップに従って、Go-DDDマーケットプレイスアプリケーションを構築します。

flowchart TD
    start([開始]) --> step1[1. 前提条件のインストール]
    step1 --> step2[2. リポジトリのクローン]
    step2 --> step3[3. 依存関係のインストール]
    step3 --> step4[4. 開発環境の起動]
    step4 --> step5[5. データベースのセットアップ]
    step5 --> step6[6. アプリケーションの構築]
    step6 --> step7[7. アプリケーションの実行]
    step7 --> step8[8. テストの実行]
    step8 --> stop([終了])

3.1 前提条件のインストール

各プラットフォームに応じて、必要なソフトウェアをインストールします。

3.1.1 Go のインストール

flowchart TD
    start([開始]) --> platform{プラットフォームは?}
    platform -->|macOS| mac[brew install go]
    platform -->|Linux| linux1[apt-get update]
    linux1 --> linux2[apt-get install golang-go]
    platform -->|Windows| win1[Go公式サイトからインストーラーをダウンロード]
    win1 --> win2[インストーラーを実行]
    mac --> check[go version でインストールを確認]
    linux2 --> check
    win2 --> check
    check --> stop([終了])

macOS:

brew install go

Linux (Ubuntu/Debian):

sudo apt-get update
sudo apt-get install golang-go

Windows: 1. Go公式サイトからインストーラーをダウンロード 2. インストーラーを実行し、指示に従う

インストールを確認:

go version

3.1.2 Docker と Docker Compose のインストール

flowchart TD
    start([開始]) --> platform{プラットフォームは?}
    platform -->|macOS| mac[Docker Desktop for Macをインストール]
    platform -->|Linux| linux1[apt-get update]
    linux1 --> linux2[apt-get install docker.io]
    platform -->|Windows| win[Docker Desktop for Windowsをインストール]
    mac --> check1[docker --version でインストールを確認]
    linux2 --> check1
    win --> check1
    check1 --> check2[docker compose --version でインストールを確認]
    check2 --> stop([終了])

macOS & Windows: 1. Docker Desktopをダウンロードしてインストール

Linux (Ubuntu/Debian):

sudo apt-get update
sudo apt-get install docker.io

インストールを確認:

docker --version
docker compose --version

3.1.3 Node.js のインストール

flowchart TD
    start([開始]) --> platform{プラットフォームは?}
    platform -->|macOS| mac["brew install node version 20"]
    platform -->|Linux| linux1["curl -fsSL https://deb.nodesource.com/setup_20.x | bash"]
    linux1 --> linux2[apt-get install -y nodejs]
    platform -->|Windows| win1[Node.js公式サイトからインストーラーをダウンロード]
    win1 --> win2[インストーラーを実行]
    mac --> check1[node --version でインストールを確認]
    linux2 --> check1
    win2 --> check1
    check1 --> check2[npm --version でインストールを確認]
    check2 --> stop([終了])

macOS:

brew install node@20

Linux (Ubuntu/Debian):

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs

Windows: 1. Node.js公式サイトからインストーラーをダウンロード 2. インストーラーを実行し、指示に従う

インストールを確認:

node --version
npm --version

3.2 リポジトリのクローン

flowchart TD
    start([開始]) --> clone[git clone https://github.com/yourusername/go-ddd.git]
    clone --> cd[cd go-ddd]
    cd --> stop([終了])

リポジトリをクローンし、プロジェクトディレクトリに移動します:

git clone https://github.com/yourusername/go-ddd.git
cd go-ddd

3.3 依存関係のインストール

flowchart TD
    start([開始]) --> npm[npm install]
    npm --> go[go mod download]
    go --> stop([終了])

Node.js の依存関係をインストールします:

npm install

Go の依存関係をダウンロードします:

go mod download

3.4 開発環境の起動

flowchart TD
    start([開始]) --> docker[docker compose up -d]
    docker --> check[docker-compose ps で起動確認]
    check --> stop([終了])
    docker -.-> note["データベース、Wiki、PlantUMLサーバーを起動"]

Docker Compose を使用して、開発環境を起動します:

docker-compose up -d

起動したサービスを確認します:

docker-compose ps

以下のサービスが起動します: - PostgreSQL (ポート 9920) - MySQL (ポート 3306) - Wiki.js (ポート 80) - PlantUML Server (ポート 9999)

3.5 データベースのセットアップ

flowchart TD
    start([開始]) --> check[データベース接続情報を確認]
    check --> migrate[アプリケーション起動時に自動マイグレーション]
    migrate --> stop([終了])
    check -.-> note["PostgreSQL接続情報"]

アプリケーションは起動時に自動的にデータベースマイグレーションを実行します。データベース接続情報は以下の通りです:

PostgreSQL: - ホスト: localhost - ポート: 9920 - ユーザー: root - パスワード: password - データベース: mydb

3.6 アプリケーションの構築

flowchart TD
    start([開始]) --> build[go build -o app/backend/cmd/marketplace/marketplace app/backend/cmd/marketplace/main.go]
    build --> stop([終了])

アプリケーションをビルドします:

go build -o app/backend/cmd/marketplace/marketplace app/backend/cmd/marketplace/main.go

3.7 アプリケーションの実行

flowchart TD
    start([開始]) --> run[./app/backend/cmd/marketplace/marketplace]
    run --> access[ブラウザで http://localhost:9090/api/v1/health にアクセス]
    access --> stop([終了])
    run -.-> note["アプリケーションがポート9090で起動"]

ビルドしたアプリケーションを実行します:

./app/backend/cmd/marketplace/marketplace

アプリケーションはデフォルトでポート9090で起動します。ヘルスチェックエンドポイントにアクセスして、アプリケーションが正常に動作していることを確認します:

http://localhost:9090/api/v1/health

3.8 テストの実行

flowchart TD
    start([開始]) --> cd[cd app/backend]
    cd --> test[go test ./...]
    test --> stop([終了])

テストを実行します:

cd app/backend
go test ./...

4. アプリケーション構造

Go-DDDマーケットプレイスアプリケーションは、ドメイン駆動設計の原則に従って、以下のレイヤーで構成されています:

flowchart TD
    subgraph "インターフェースレイヤー"
        rest["REST API"]
    end

    subgraph "アプリケーションレイヤー"
        services["サービス"]
        commands["コマンド"]
        queries["クエリ"]
    end

    subgraph "ドメインレイヤー"
        entities["エンティティ"]
        repos["リポジトリインターフェース"]
    end

    subgraph "インフラストラクチャレイヤー"
        db["データベース実装"]
    end

    rest --> services
    services --> entities
    services --> repos
    commands --> services
    queries --> services
    db --> repos

4.1 プロジェクト構造

go-ddd/
├── app/
│   └── backend/
│       ├── cmd/
│       │   └── marketplace/
│       │       └── main.go
│       └── internal/
│           ├── domain/
│           │   ├── entities/
│           │   └── repositories/
│           ├── application/
│           │   ├── services/
│           │   ├── command/
│           │   └── query/
│           ├── infrastructure/
│           │   └── db/
│           └── interface/
│               └── api/
│                   └── rest/
├── docs/
│   └── wiki/
├── ops/
│   └── docker/
└── docker-compose.yml

4.2 主要なコンポーネント

4.2.1 ドメインレイヤー

ドメインレイヤーはアプリケーションの中心であり、ビジネスロジックとルールを含みます。

  • エンティティ: 商品(Product)や出品者(Seller)などのビジネスオブジェクト
  • リポジトリインターフェース: データの永続化を担当するインターフェース

4.2.2 アプリケーションレイヤー

アプリケーションレイヤーはユースケースを実装し、ドメインレイヤーのオブジェクトを調整します。

  • サービス: 商品サービスや出品者サービスなど、ユースケースを実装するサービス
  • コマンド: ドメインの状態を変更する操作(書き込み操作)
  • クエリ: ドメインから情報を取得する操作(読み取り操作)

4.2.3 インフラストラクチャレイヤー

インフラストラクチャレイヤーは、永続化やその他の技術的な関心事を処理します。

  • データベース実装: リポジトリインターフェースのデータベース実装(GORM を使用)

4.2.4 インターフェースレイヤー

インターフェースレイヤーは、外部世界とのインタラクションを処理します。

  • REST API: 商品や出品者に関するREST APIエンドポイントを提供

5. API エンドポイント

Go-DDDマーケットプレイスアプリケーションは、以下のREST APIエンドポイントを提供します:

flowchart TD
    subgraph "API エンドポイント"
        subgraph "商品 API"
            createProduct["POST /api/v1/products"]
            getAllProducts["GET /api/v1/products"]
            getProductById["GET /api/v1/products/{id}"]
            updateProduct["PUT /api/v1/products/{id}"]
        end

        subgraph "出品者 API"
            createSeller["POST /api/v1/sellers"]
            getAllSellers["GET /api/v1/sellers"]
            getSellerById["GET /api/v1/sellers/{id}"]
            updateSellerName["PUT /api/v1/sellers/{id}/name"]
            updateSellerEmail["PUT /api/v1/sellers/{id}/email"]
            deleteSeller["DELETE /api/v1/sellers/{id}"]
        end

        subgraph "システム API"
            healthCheck["GET /api/v1/health"]
        end
    end

5.1 商品 API

メソッド エンドポイント 説明
POST /api/v1/products 新しい商品を作成
GET /api/v1/products すべての商品を取得
GET /api/v1/products/{id} 指定IDの商品を取得
PUT /api/v1/products/{id} 指定IDの商品を更新

5.2 出品者 API

メソッド エンドポイント 説明
POST /api/v1/sellers 新しい出品者を作成
GET /api/v1/sellers すべての出品者を取得
GET /api/v1/sellers/{id} 指定IDの出品者を取得
PUT /api/v1/sellers/{id}/name 指定IDの出品者の名前を更新
PUT /api/v1/sellers/{id}/email 指定IDの出品者のメールアドレスを更新
DELETE /api/v1/sellers/{id} 指定IDの出品者を削除

5.3 システム API

メソッド エンドポイント 説明
GET /api/v1/health ヘルスチェック

6. トラブルシューティング

flowchart TD
    start([開始]) --> problem{問題は?}
    problem -->|データベース接続エラー| db1[Docker Composeが起動しているか確認]
    db1 --> db2[データベース接続情報が正しいか確認]
    problem -->|ビルドエラー| build1[Go依存関係が正しくインストールされているか確認]
    build1 --> build2[go mod tidy を実行]
    problem -->|実行時エラー| run1[ログを確認]
    run1 --> run2[データベースマイグレーションが成功したか確認]
    db2 --> issue[問題が解決しない場合はIssueを作成]
    build2 --> issue
    run2 --> issue
    issue --> stop([終了])

6.1 よくある問題と解決策

データベース接続エラー

症状: アプリケーション起動時に「Failed to connect to database」などのエラーが表示される

解決策: 1. Docker Composeが起動しているか確認: docker-compose ps 2. データベース接続情報が正しいか確認 3. データベースコンテナに直接接続してみる: docker-compose exec db_postgresql psql -U root -d mydb

ビルドエラー

症状: go build コマンド実行時にエラーが発生する

解決策: 1. Go依存関係が正しくインストールされているか確認: go mod download 2. 依存関係を整理: go mod tidy 3. Goのバージョンが1.23以上であることを確認: go version

実行時エラー

症状: アプリケーション実行時にエラーが発生する

解決策: 1. ログを確認して具体的なエラーメッセージを特定 2. データベースマイグレーションが成功したか確認 3. 必要なテーブルがデータベースに作成されているか確認

7. まとめ

このセットアップガイドでは、Go-DDDマーケットプレイスアプリケーションを0から構築するための手順を説明しました。ドメイン駆動設計の原則に従って構築されたこのアプリケーションは、クリーンアーキテクチャを採用し、各レイヤーが明確に分離されています。

flowchart LR
    env["環境構築"] --> dev["アプリケーション開発"]
    dev --> test["テスト"]
    test --> deploy["デプロイ"]

    env -.-> env_note["前提条件と環境のセットアップ"]
    dev -.-> dev_note["アプリケーション構築と実行"]
    test -.-> test_note["テストと検証"]
    deploy -.-> deploy_note["デプロイと運用"]

環境構築: - 前提条件のインストール - リポジトリのクローン - 依存関係のインストール - 開発環境の起動

アプリケーション開発: - データベースのセットアップ - アプリケーションの構築 - アプリケーションの実行

テスト: - テストの実行 - APIエンドポイントの確認

デプロイ: - 本番環境へのデプロイ - 監視とメンテナンス

このガイドに従うことで、Go-DDDマーケットプレイスアプリケーションを簡単に構築し、実行することができます。また、ドメイン駆動設計の原則を学び、実践するための良い例としても活用できます。

8. 参考リンク