Kotlin Springboot -- Part 10 포트 라고 하는 인터페이스 を作っ て 유스케이스 와 게이트웨이 をつなぐ

7194 단어 springbootkotlinca



前回まで、CA で必須である Port を省略していた.

이 Kotlin 기반으로 포트에서 사용하는 인터페이스를 사용하는 방법

interface である 포트 を作る




package com.example.springboot

interface PersonPort {
    fun getAllPersons(): Persons
}


名前と返り値の型だけ定義


Gateway をインターフェースから実装するようにする



Kotlin の文法に従って interface の中身を実装する.
クラスに実装元?の 인터페이스 を書く.型みたいに.
override を関数につけて中身を書く.

クラスの引数では Driver の インスタンスを取れなくなる.
なのでクラス外部に Driver のインスタンスを作成して
そのinstanceをclasの内部の関数で使う.

package com.example.springboot

import org.springframework.stereotype.Component

val personsDriver = PersonsDriver()
@Component
class PersonsGateway: PersonPort {
  override fun getAllPersons():Persons {
    val persons = personsDriver.findAll()
    return Persons(persons.map { person ->
      Person(
        Name(person.name),
        Age(person.age)
      )
    })
  }
}



Usecase で Port 에서 Gateway の関数を呼び出す




class PersonsUsecase(
  private val personPort: PersonPort,
) {
  fun getAllPersons():Persons {
    println("Usecase/")
    println("getAllPersons/")
    return personPort.getAllPersons()
  }
  fun getPersonsByAge(age: Age):Persons {
    val persons = personPort.getAllPersons()
    return persons.filterByLessThan(age)
  }
}


Usecase では引数を Gateway の instancesから Port の instancesに変更する.

そして Port の Instance에서 呼ぶ と、 Gateway の Instance に つながる.


쉬다




// 20220921234906
// http://localhost:8080/persons

{
  "persons": [
    {
      "name": "taro",
      "age": 3
    },
    {
      "name": "hana",
      "age": 5
    },
    {
      "name": "Dominique",
      "age": 11
    },
    {
      "name": "Jackson",
      "age": 11
    }
  ]
}


나머지 は何も変わらず、これでクリーンに API が分離できた.

依存性逆転、中央に依存性を持ってくることができたのだ.


まとめ



criーンアーキテクチャで依存性逆転をしたい時は

포트니인타페스를 작

そこから Gateway で実装を書いて

Usecase로는 @Component の依存性注入로 Port を入れ라고
포트 の関数を呼ぶようにする.それで 게이트웨이 が呼ばれる.

これでようやく

휴식 > (도메인) > 사용 사례 > 포트 > 도메인 > 게이트웨이 > 드라이버

というクリーンアーキテクチャの 6 層の分離ができた.

좋은 웹페이지 즐겨찾기