アーキテクチャ概要
システム全体図
アーキテクチャパターン
本サービスはクリーンアーキテクチャを採用し、以下の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 Handler | HTTPリクエスト処理 | internal/infrastructure/http/echo/handler/ |
Repository Implementation | データアクセス実装 | internal/infrastructure/mysql/repository/ |
ORM Schema | ent 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.go | HTTPレイヤのWire設定 |
internal/infrastructure/mysql/wireset.go | データベースレイヤのWire設定 |
データベース設計
ER図
テーブル詳細
articles
カラム | 型 | 制約 | 説明 |
---|---|---|---|
id | VARCHAR(255) | PK | 記事ID |
title | VARCHAR(255) | NOT NULL | タイトル |
content | TEXT | NOT NULL | 本文 |
category | ENUM('tech','life') | NOT NULL | カテゴリ |
created_at | DATETIME | NOT NULL | 作成日時 |
updated_at | DATETIME | NOT NULL | 更新日時 |
tags
カラム | 型 | 制約 | 説明 |
---|---|---|---|
id | VARCHAR(255) | PK | タグID |
name | VARCHAR(255) | NOT NULL, UNIQUE | タグ名 |
article_tags
カラム | 型 | 制約 | 説明 |
---|---|---|---|
article_id | VARCHAR(255) | FK | 記事ID |
tag_id | VARCHAR(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リクエスト数・レスポンス時間
- データベースクエリ実行時間
- エラー率・成功率