NewCoreを行うことで何ができるようになるか(暗記)
code:go
1. 依存性がすべて注入された完全なHandler構造体の作成
【結果】: *handler.Core構造体(すべての依存性が注入済み)
core := handler.NewCore(
logger,
firebaseAuth,
userUseCase,
publisherUseCase,
authorUseCase,
masterBookUseCase, // ← 全ての依存性が注入される
)
// coreには以下がすべて入っている:
core.Logger // ログ機能
core.firebaseAuthGlue // 認証機能
core.userUsecase // ユーザー機能
core.publisherUsecase // 出版社機能
core.authorUsecase // 著者機能
core.masterBookUsecase // 本検索機能 ← 新しく追加
2. HTTPハンドラーとしてサーバーに登録可能
【層】: Main層
【ファイル】: /cmd/core/main.go
func main() {
// NewCoreで作成したハンドラーを使用
core := injector.InjectCore(dbClient)
// HTTPサーバーに登録
server := http.Server{
Addr: ":8080",
Handler: oapi.NewStrictHandler(core, middlewares), // ← coreをサーバーに登録
}
// サーバー起動
server.ListenAndServe()
}
3. すべてのAPIエンドポイントが動作可能
【結果】: 以下のAPIがすべて動作する
// User関連
POST /api/users → core.CreateUser()
GET /api/users/current → core.GetCurrentUser()
// Author関連
POST /api/authors → core.CreateAuthor()
GET /api/authors → core.ListAuthors()
GET /api/authors/:id → core.GetAuthorById()
// Publisher関連
POST /api/publishers → core.CreatePublisher()
// MasterBook関連(新しく追加される機能)
GET /api/master-books/search → core.SearchMasterBooks() // ← 新機能
GET /api/master-books → core.ListMasterBooks()
POST /api/master-books → core.CreateMasterBook()
GET /api/master-books/:id → core.GetMasterBookById()
PUT /api/master-books/:id → core.UpdateMasterBook()
4. 各ハンドラーメソッドで依存性が使用可能
【層】: Handler層
【ファイル】: /core/handler/master_book.go
func (h Core) SearchMasterBooks(ctx context.Context, request oapi.SearchMasterBooksRequestObject) {
// NewCoreで注入された依存性を使用できる
result, err := h.masterBookUsecase.Search(ctx, input) // ← 注入された依存性を使用
if err != nil {
h.Logger.ErrorContext(ctx, "search failed", "error", err) // ← 注入されたLoggerを使用
return oapi.SearchMasterBooks500JSONResponse{}, nil
}
return oapi.SearchMasterBooks200JSONResponse{Books: books}, nil
}
5. 完全な機能が動作する流れ
HTTPリクエスト
↓
core.SearchMasterBooks() // ← NewCoreで作られたハンドラー
↓
core.masterBookUsecase.Search() // ← 注入されたUseCase
↓
usecase内でQuery/Repository使用 // ← さらに注入された依存性
↓
データベースアクセス
↓
レスポンス返却
NewCoreなしではどうなるか
// もしNewCoreしなかった場合
var core handler.Core // 空の構造体
// 依存性が注入されていないため
core.masterBookUsecase == nil // パニック発生!
core.Logger == nil // パニック発生!
// APIを呼んでもエラー
GET /api/master-books/search → パニック(nil pointer dereference)
まとめ
NewCoreを行うことで:
1. 完全に機能するハンドラーが作成される
2. HTTPサーバーに登録できる
3. すべてのAPIエンドポイントが動作する
4. 各種依存性(UseCase、Logger等)が使用可能
5. 本格的なWebアプリケーションとして稼働可能
答え: NewCoreにより、すべての依存性が注入された完全に動作するWebアプリケーションのハンドラーが完成します。