backend-api-design について
backend-api-designは、記載された規約に沿ってバックエンドAPIを実装する開発者向けのリファレンススキルです。URL設計、レイヤー分担、レスポンス処理、ページネーション、エラー処理、実装上の注意点を扱います。
主な機能
- 01URLとHTTPメソッドの規約
- 02Controller・Manager・Repositoryの役割
- 03Eitherによるエラーとトランザクション
- 04レスポンスモデルとページネーション
- 05Micronaut実装上の注意点
活用シーン
- 01リソース操作用エンドポイントの設計
- 02APIとデータアクセスの責務分離
- 03ページ付き一覧レスポンスの実装
- 04記載された注意点に沿ったコード確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ c0x12c/ ai-toolkit --skill backend-api-designインストール後、Claude Code で/backend-api-designを入力して読み込まれたか確認します。
同梱ファイルcode-patterns.md
詳細
バックエンド API 設計 — クイックリファレンス
URL パターン
GET /api/v1/employees # List (plural)
GET /api/v1/employee # Get one (?id=xxx)
POST /api/v1/employee # Create
POST /api/v1/employee/update # Update (?id=xxx)
POST /api/v1/employee/delete # Soft delete (?id=xxx)
POST /api/v1/employee/restore # Restore (?id=xxx)
POST /api/v1/sync/employees # Action
厳守ルール
- パスパラメーターは使用しません — 常に
@QueryValueを使い、@PathVariableは使用しません - 単一リソースには単数形を使用します —
/employees/{id}ではなく/employee - コレクションには複数形を使用します —
/employees - アクションには動詞のサブパスを使用します —
/delete、/restore、/sync
レイヤードアーキテクチャ
Controller → thin, just delegates
↓
Manager → business logic, transactions, Either returns
↓
Repository → data access only, no business logic
コントローラー:薄いラッパー
- デフォルト値を指定してクエリパラメーターを解析します
- マネージャーに処理を委譲します
.throwOrValue()で Either をアンラップします- ビジネスロジックは禁止、リポジトリーへのアクセスは禁止です
マネージャー:ビジネスロジック
Either<ClientException, T>を返します- DB 操作を
transaction(db.primary) { }でラップします - 複数のリポジトリーをオーケストレーションします
- ビジネスルールを検証します
リポジトリー:データアクセス
- エンティティまたは null を返します
- 読み取りには
db.replica、書き込みにはdb.primaryを使用します - 常に
deletedAt.isNull()を確認します
クイックコードリファレンス
コントローラーでの基本的な委譲パターン:
@Get("/employee")
suspend fun getEmployee(@QueryValue id: UUID): EmployeeResponse {
return employeeManager.findById(id).throwOrValue()
}
- レスポンスモデル —
module-client/response/{domain}/内にcompanion object { fun from(entity) }を定義します - ページネーション — オフセットベースです。マネージャーは
items、total、page、limit、hasMoreを持つEmployeeListResponseを返します - エラー — マネージャーから
ClientError.NOT_FOUND.asException().left()を返し、例外をスローしないでください - ファクトリービーン —
@Factoryクラスに@Singletonメソッドを定義し、リポジトリーと db をマネージャーに接続します
コントローラー、レスポンスモデル、ページネーション、エラー処理、ファクトリービーンのテンプレートについては、code-patterns.md を参照してください。
注意点
- 複数単語からなる
@QueryValueパラメーターには、明示的な snake_case 名が必須です。 フロントエンドの axios インターセプターはproject_idを送信しますが、Micronaut はパラメーター名を文字どおりに照合します。@QueryValue projectId: UUIDのように省略せず、@QueryValue("project_id") projectId: UUIDと記述してください。 @Put、@Delete、@Patchは使用しないでください。 これは RPC スタイルです。すべての変更操作には@Postを使用します。読み取りに使用する@Getは 1 つだけです。- リポジトリーを注入するコントローラーは、コードの問題を示す兆候です。 コントローラー内に
private val fooRepository: FooRepositoryがある場合は、マネージャーに移動してください。 - 2 つ目の
.where {}ではなくandWhere {}を使用します。.where {}を 2 回呼び出すと、最初の条件が置き換えられます。条件をつなげるには.andWhere {}を使用してください。 @ExecuteOn(TaskExecutors.IO)を忘れないでください。 これがないと、suspend 関数が停止したり、誤ったスレッドプールで実行されたりする場合があります。すべてのコントローラーに必要です。
コメント
Markdown 対応