Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환

13182 단어 caspringbootkotlin

前回



前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 で で 受け取っ た リクエスト ボディ の 処理 を 表示 表示 する ところ まで 確認 し た た.. の の の の の の の

とりあえず動くようにする.
에라한드링이나 레스폰스코도의 対応は後日.

今回



今回はその関数で受け取った JSON を Usecase に渡して処理していく.

포트



依存性逆転しているので、中央のportから実装していく.

interface PersonPort {
    fun getAllPersons(): Persons
    fun postPerson(): Person
}


インターフェースで postPerson として作成して


게이트웨이




    override fun postPerson(): Person {
        TODO("Not yet implemented")
    }


Alt Enter 로 추상 함수 구현 を実行して

実装が TODO 状態で Gateway に作成される.


유스케이스



ここまでで、Usecase에서 呼び出してみる.

  fun postPerson(person: Person) {
    personPort.postPerson(person)
  }


返り値はないので返り値と型はなく,
引数だけ型を指定して実行させる.

쉬다



  @PostMapping("/persons")
  fun postPerson(@RequestBody request: PersonJson): String {
    personsUsecase.postPerson(Person(Name(request.name), Age(request.age)))
    return request.toString()
  }

Rest 와 Usecase を呼び出す.
요청 から中身を取り出して、
사람 ドメインと内部の Name, Age ドメインにいれて呼び出す.

Curl 데리크에스트루



Gateway が TODO の状態で外部から実行してみる

curl -X POST -H "Content-Type: application/json" \
-d '{"name":"test", "age":20}' \
http://localhost:8080/persons



{
"timestamp":"2022-10-16T12:22:33.962+00:00",
"status":500,
"error":"Internal Server Error",
"path":"/persons"
}


타르미날의 레스폰스에는 500 が返ってきて

kotlin.NotImplementedError: 
An operation is not implemented: Not yet implemented


未開発 エラーが想定通りでる.
TODO だからね.

Gateway でドメインの中身を .value 出して 드라이버 に渡す



  override fun postPerson(person: Person) {
    personsDriver.add(person.name.value, person.age.value)
  }

사람 ドメインで渡されたデータの中身を取り出して
追加するための Driver に渡す

Era-handringは後日.

Driver & Entity に追加する



package com.example.springboot

import org.springframework.stereotype.Component

@Component
class PersonsDriver {
  data class PersonEntity(val name: String , val age: Int)

  val taro = PersonEntity("taro", 3)
  val hana = PersonEntity("hana", 5)
  val dom = PersonEntity("Dominique", 11)
  val jack = PersonEntity("Jackson", 11)
  val persons = listOf<PersonEntity>(taro,hana,dom,jack)

  fun findAll(): List<PersonEntity> {
    return persons
  }
  fun add(name: String, age: Int){
    val currentPersons = findAll()
  }
}

前回まではこうやって、PersonEntity のinstancesである people をデータの本體として、そこから findAll していた.

  val persons = mutableListOf(
    PersonEntity("taro", 3),
    PersonEntity("hana", 5),
    PersonEntity("Dominique", 11),
    PersonEntity("Jackson", 11),
  )


사람 を少し見やすくして, 가변 にした.
この people に付け加えるように今回は実装する.

データストアにいれたい



現状、ちゃんとデータを保持していなかった

게이지 E2E의 성장으로 또는 타데이타스트아를 사용하는

https://codelabs.developers.google.com/codelabs/cloud-spring-datastore#2

ググると GCP のデータストアがでてくる

Android의 데 이타스트를 시작하려면 이것이 불가능하기 때문입니다.

드라이버 で する 추가



  fun add(name: String, age: Int){
    persons.add(
      PersonEntity(name, age),
    )
    println(persons)
  }


people という変数に引数の値からEntitiitiを追加して,
一時的に people を全員表示して確認する

curl -X POST -H "Content-Type: application/json" \
-d '{"name":"test", "age":20}' \
http://localhost:8080/persons
PersonJson(name=test, age=20)



[PersonEntity(name=taro, age=3), PersonEntity(name=hana, age=5), PersonEntity(name=Dominique, age=11), PersonEntity(name=Jackson, age=11), PersonEntity(name=test, age=20)]


無事に追加された.


まとめ



휴식에서 POST로 送られ라고 한 JSON 데이타로인메모리로 保存するため에

Usecase에서 Port を通じて渡して

게이트웨이 では Domain から中身を抜いて渡して

Driver で Entity に詰めてEntiti の instancesとして作った変数に追加する.

これで実装できる


今後



POST まで作ったのでまず E2E を追加したい.
しかし、DB ならアサートできるが、変数作っただけのデーターでどう保存されたことをtestできるかは課題.

UUID も発行してないので、testする前にそれをつくってEraーhandringして 200 or 500 を返すようにしたい

좋은 웹페이지 즐겨찾기