Skip to content

アーキテクチャ概要

システム全体図

アーキテクチャパターン

本サービスはクリーンアーキテクチャを採用し、以下の3層構成となっています:

1. Domain Layer(ドメイン層)

最も内側の層で、ビジネスロジックとルールを含みます。

構成要素

コンポーネント説明ファイルパス
Entityドメインオブジェクトinternal/domain/*/entity/
Value Object値オブジェクトinternal/domain/*/value/
Repository Interfaceデータアクセスの抽象化internal/domain/*/repository/
Domain Serviceドメインサービスinternal/domain/*/service/

Article Domain

go
// Article Entity
type Article struct {
    objectID  *articleValue.ArticleID
    title     *articleValue.ArticleTitle
    content   *articleValue.ArticleContent
    tagIDs    []*tagValue.TagID
    category  *articleValue.ArticleCategory
    createdAt *articleValue.ArticleCreatedAt
    updatedAt *articleValue.ArticleUpdatedAt
}

2. UseCase Layer(アプリケーション層)

ドメイン層を使用してビジネスユースケースを実現します。

構成要素

UseCase説明ファイルパス
Article Create記事作成internal/usecase/article/create.go
Article List記事一覧取得internal/usecase/article/list.go
Article Get記事詳細取得internal/usecase/article/get.go
Article Update記事更新internal/usecase/article/update.go
Article Delete記事削除internal/usecase/article/delete.go
Tag CRUDタグの CRUD 操作internal/usecase/tag/*.go

3. Infrastructure Layer(インフラストラクチャ層)

外部システムとの接続を担当します。

構成要素

コンポーネント説明ファイルパス
HTTP HandlerHTTPリクエスト処理internal/infrastructure/http/echo/handler/
Repository Implementationデータアクセス実装internal/infrastructure/mysql/repository/
ORM Schemaent ORM スキーマinternal/infrastructure/ent/schema/
Middleware認証、ログ等internal/infrastructure/http/echo/middleware/

依存性注入(DI)

本サービスではGoogle Wireを使用して依存性注入を実現しています。

Wire構成

Wire設定ファイル

ファイル説明
di/wire.goメインのWire設定
internal/infrastructure/http/echo/wireset.goHTTPレイヤのWire設定
internal/infrastructure/mysql/wireset.goデータベースレイヤのWire設定

データベース設計

ER図

テーブル詳細

articles

カラム制約説明
idVARCHAR(255)PK記事ID
titleVARCHAR(255)NOT NULLタイトル
contentTEXTNOT NULL本文
categoryENUM('tech','life')NOT NULLカテゴリ
created_atDATETIMENOT NULL作成日時
updated_atDATETIMENOT NULL更新日時

tags

カラム制約説明
idVARCHAR(255)PKタグID
nameVARCHAR(255)NOT NULL, UNIQUEタグ名

article_tags

カラム制約説明
article_idVARCHAR(255)FK記事ID
tag_idVARCHAR(255)FKタグID

セキュリティ

認証・認可

保護されるエンドポイント

エンドポイント認証要否
GET /v1/articles不要
GET /v1/articles/{id}不要
POST /v1/articles必要
PUT /v1/articles/{id}必要
DELETE /v1/articles/{id}必要
GET /v1/tags不要
GET /v1/tags/{id}不要
POST /v1/tags必要
PUT /v1/tags/{id}必要
DELETE /v1/tags/{id}必要

パフォーマンス考慮

データベース最適化

  • インデックス戦略:
    • articles.category にインデックス
    • article_tags(article_id, tag_id) に複合インデックス
    • tags.name にユニークインデックス

ページネーション

go
// クエリパラメータ例
page=1&page_size=10&tag_id=123&category=tech

監視・ログ

構造化ログ

json
{
  "level": "info",
  "timestamp": "2024-01-01T00:00:00Z",
  "method": "POST",
  "path": "/v1/articles",
  "status": 201,
  "latency": "45ms",
  "user_id": "user123"
}

メトリクス

  • HTTPリクエスト数・レスポンス時間
  • データベースクエリ実行時間
  • エラー率・成功率