Kotlin+Spring Bootで簡単なAPIをClean Architectureで実装してみた

Kotlin+Spring Bootで簡単なAPIをClean Architectureで実装してみた

2022年4月3日
アーキテクチャ

Kotlin + Spring Bootを触ってみたので、Clean ArchitectureでちょっとしたAPIを作ってみました。

  • Kotlin: 1.6.10
  • SpringBoot: 2.4.4

Spring BootでのDI

そもそもDIとはDependeny Injectionの略で依存性の注入という意味です。DIはオブジェクト間に生じる依存関係をオブジェクト内のコードに直接記述せず、外部から何らかの形で与えるようにする手法です。

@Component

クラスにComponentアノテーションを付与するとDIの対象であることを表します。
そのクラスをDIコンテナが管理してくれるようになります。

他にも@Controllerや@Serviceがありますが、以下の使い分けをします。

  • @Controller: MVCでコントローラー層のクラスに付与
  • @Service: MVCでサービス層のクラスに付与
  • @Repository: MVCでデータ層のクラスに付与
  • @Component: MVCに限らず、DIで利用したいクラスへ付与する

@Bean

付与した関数で返却したインスタンスがDIコンテナに登録され、そのインスタンスをDIで使用できるようになります。

@Componentと@Beanの使い分けは以下の記事が参考になりました。

https://www.greptips.com/posts/1318/

@Autowired

注入されるフィールドに付けます。

DIコンテナはAutowiredアノテーションを付けたフィールドに対して、合致するオブジェクトを探してインジェクションします。

lateinit var

このフィールドへのインジェクションは変数の読み込みと同時に初期化されるのではなく、後からインジェクションされるためvar定義しておく必要があります。

 

Clean ArchitectureでTODOアプリを意識したAPIを実装してみる

Clean ArchitectureでTODOアプリを意識したAPIを実装してみました。といってもDBも用意せずスタブみたいな感じにしています。メソッドもgetTasks()とgetTask()だけでちょっとしたAPIとなっています。

Enterprise Business Rules

Enterprise Business Rulesではアプリケーション全体の最重要ビジネスルールをカプセル化したドメインを格納しています。

今回はTODOアプリを意識しているので、タスクIDとタイトル、コンテンツを含むTaskドメインとListとで持つTasksドメインを作っています。

・Task.kt

 

Application Business Rules

Application Business Rulesではアプリケーション固有のビジネスルールが含まれ、入出力するデータの流れを調整します。

TaskPortにインターフェイスを定義し、TaskGatewayで具象クラスを実装するようにしています。TaskUseCaseではTaskPortを呼び出すように実装しています。

・TaskPort.kt

 

・TaskUseCase.kt

 

Interface & Adapter

Interface & Adapterではドメインやユースケースに便利な形式からDBに便利な形式にデータを変換します。

TaskGatewayはTaskPortで定義したinterfaceを実装しています。またTaskDriverで取得したJSONをドメインに変換する処理をしています。

TaskControllerでは逆にドメインをレスポンスの形に変換する処理をしています。

・TaskGateway.kt

 

・TaskController.kt

 

Framework & Driver

Framework & Driverはフレームワークやツールで構成されています。

今回はスタブでJSON形式の値を返すようにしていますが、本来ならDB操作やAPIリクエストを行う想定です。

・TaskDriver.kt