本日はAWESOME-COPILOTの技術調査枠です。
AWESOME-COPILOTのドキュメントを読みながら実際に操作を試して記事に残します。
今回はカスタムインストラクションの一つNestJS Development Best Practicesについてです。
NestJS Development Best Practices
NestJS Development Best PracticesはNestJSでスケーラブルかつ保守性の高いバックエンドを構築するための設計・実装ルールです。
Node.js開発を“フレームワーク設計前提”に引き上げるインストラクションです。
以下のページからGenaiscriptのインストールボタンをクリックして取得します。
github.com
インストールボタンを押してNestJS Development Best Practicesをダウンロードします。
すると.github/instructions配下にインストラクションがインストールされます。

インストールしたインストラクションはCopilotの動作に自動的に適用されます。
このインストラクションを読み込むと、CopilotはNestJSのアーキテクチャに従った設計でコードを生成するようになります。
具体的にはCopilotは以下のような行動をとります。
Dependency Injection(DI)前提になる
Copilotは以下を利用して全てをDIで設計します。
- @Injectable() を使う
- constructorで依存注入
- 手動newを禁止
例えば以下のようなコードです。
constructor(private readonly usersService: UsersService) {}
モジュール構造を強制する
Copilotは機能ごとにモジュール分割します。
例えば以下のようにモジュール構成を生成します。
modules/ ├ users/ ├ auth/ └ products/
デコレーター中心設計
CopilotはNestJSの特徴であるデコレーター駆動設計を徹底します。
主なデコレーターは以下の通りです。
- @Controller()
- @Get()
- @Post()
- @Injectable()
Serviceにビジネスロジック集約する
CopilotはControllerにロジックを書かず、Serviceに委譲します。
例えば以下のようなコードを作成します。
return this.usersService.create(dto);
ロジックはServiceに集中します。
これにより以下のメリットがあります。
- 単一責任
- 再利用可能
- テストしやすい
DTO + Validationを必須化
CopilotはDTOで入力を管理します。
- @IsEmail()
- @IsString()
TypeORM前提のDB設計
CopilotはORMとしてTypeORMを使用します。
これは以下の特徴を持ちます。
- Entity定義
- Repositoryパターン
- Migration
認証・認可を標準装備する
Copilotはセキュリティを最初から考慮します。
例えば以下の考慮です。
- JWT認証
- Guard
- RBAC
Guard/Interceptor/Pipeを使い分け
Copilotは横断処理を分離します。
| 機能 | 役割 |
|---|---|
| Guard | 認証 |
| Interceptor | 処理前後 |
| Pipe | バリデーション |
| Filter | 例外 |
エラーハンドリングを標準化する
CopilotはException Filterを使います。
これは以下の特徴を持ちます。
- 一元管理
- ログ出力
- レスポンス統一
ログを適切に出力する
CopilotはLoggerを使います。
以下のログレベルを出力します。
- error
- warn
- log
- debug
テスト前提を設計する
Copilotはテストしやすいコードを書きます。
以下の種類のテストを設計します。
- Unitテスト(Jest)
- Integration
- E2E
パフォーマンス最適化する
Copilotは性能も考慮します。
例えば以下の要素を最適化します。
- キャッシュ(Redis)
- インデックス
- ページング
セキュリティを強制する
Copilotはセキュリティ対策を組み込みます。
例えば以下のセキュリティ要素を考慮します。
- 入力検証
- レート制限
- CORS
- XSS対策
アンチパターンを回避する
Copilotは以下のアンチパターンを避けます。
- Controllerにロジックを記述する
- DI無視
- バリデーションなし
- 同期処理
- 循環依存