Upgrade to Pro — share decks privately, control downloads, hide ads and more …

SpringBootとKotlinでサクッと作るWebサービス

 SpringBootとKotlinでサクッと作るWebサービス

DocurainのWeb-API部分の実装やバックエンドについての資料です。

https://quality-start.in/docurain

YUMOTO Michitaka

December 05, 2017
Tweet

More Decks by YUMOTO Michitaka

Other Decks in Technology

Transcript

  1. Spring boot + Kotlinで
    Webサービスをサクッと作ってみた
    by makoto yuri

    View Slide

  2. 自己紹介
    経験が長い→ C, C#
    最近やってる→Java / Spring boot / JS
    好き → Scala / Play Framework
    由利 誠 (withpop)
    @anoparanominal (twitter)
    https://anopara.net (blog)
    フリーランス

    View Slide

  3. 伝えたいこと
    • ScalaやPlayと比較してJavaやSpringはど
    う感じたか
    • Spring bootを使った感想
    • Spring boot + Kotlinの組み合わせはどうな
    のか

    View Slide

  4. View Slide

  5. 帳票作成サービス Docurain
    • Excelで作った帳票テンプレートにJSONでデー
    タを流し込んでPDF/Excel/画像を返却
    • If/foreachなどの制御構造を使用可能
    • Excelの機能(グラフ、スタイル、数式)が大体
    動作する
    • プレビュー版公開中なのでご興味がある方は是

    View Slide

  6. 簡単なデモ

    View Slide

  7. Docurainの開発
    Load Balancer
    Console / API
    Application Server
    Core Engine Server
    Redis Maria DB
    Spring boot / Kotlin
    S3

    View Slide

  8. Spring bootの良い点
    • デプロイが超絶簡単
    – executable jarへのシンボリックリンクをinit.d下に貼
    るだけ
    • フルスタックなのでライブラリ選定で悩まない
    • Spring Security便利
    – Redisへのセッション吐き出し
    – 認可
    – BCrypt
    • Tomcatで動く
    – Tomcatで動くことを要求されることが多い
    • あまり特殊なことをしなければ生産性がとても
    高い

    View Slide

  9. Spring bootのつらみ
    • annotationに頼りすぎ
    – 処理が散逸する 関心事が一つにまとまらない
    – 実行しないとエラーが分からない
    – 知らないと辛い(学習コストが高い)
    • Controllerの作り方がわかりにくい
    – クッキーをいじるには?Statusコードはどうすれ
    ばいいの?入出力のContent-Typeを動的に変更す
    るには?
    – 入力(Request)と出力(Response)の型がガッ
    チリ決まっててほしい

    View Slide

  10. Spring bootのつらみの例
    @Controller
    @ResponseBody
    class UserController {
    @GetMapping(“/users/{userId}”)
    fun getUser(@PathVariable userId: String): Boolean {
    return userModel.getUserId(userId) ?:
    UserNotFoundException()
    }
    }
    @ResponseStatus(HttpStatus.NOT_ACCEPTABLE)
    class UserNotFoundException() : Exception()
    @ControllerAdvice
    class ExceptionHandler {
    @ExceptionHandler(UserNotFoundException::Class)
    fun userNotFound(): ResponseEntity{
    return ResponseEntity(“user not found.”, HttpStatus.NOT_FOUND)
    }
    Userを返却するという関心事が
    散逸してしまう。
    せめてgetUser()の中で完結して
    ほしい

    View Slide

  11. Kotlin + Springの良い点
    • 「Kotlinだから出来ない」は無かった
    • 拡張メソッドが充実してて痒いところに
    手が届く
    – joinString, stripMargin, use
    • Null safetyの演算子はまあまあ便利
    – 特定の問題を解決するためだけに演算子を定
    義してしまうのは個人的にはあんまり綺麗と
    は思わない
    • Kotlinの学習コストは低め

    View Slide

  12. Kotlin + Springのつらみ
    • String Interpolationが常時動作するのがうざい
    例: @Value(“¥${foo.baa}”)
    • Beanを定義するときにdata classの恩恵が薄い。
    Lombokのほうが楽に感じた
    • パターンマッチもScala比で出来ることが少なく
    なってる
    • 落とし穴が多い気がする(Kotlinの言語仕様)

    View Slide

  13. fun foo(): Boolean {
    return listOf(1, 2, 3).all {
    return it == 1
    }
    }
    落とし穴の例
    foo()の実行結果は?
    その他の愚痴→ http://anopara.net/2017/09/16/kotlinの気に入らないところ/

    View Slide

  14. まとめ
    • Spring boot / Kotlinの組み合わせはプロダク
    トでも十分使える
    • なんだかんだでKotlinはBetter Javaと言うに
    相応しいと思う。Kotlin使えるなら使ったほ
    うが良い
    • Javaからの乗り換えを容易にした分、アドバ
    ンテージも小さくなってる気が
    • Javaも進化しているので、今Kotlinに積極的
    に乗り換える理由があるかというと…?そもそ
    も人は集められるのか…?

    View Slide

  15. おわり
    Docurain使ってみてね!!

    View Slide

  16. Scala / Play との比較
    • シンプルでわかりやすい
    – 学習コストはSpring bootよりPlayのほうが低いと感
    じる
    • ライブラリの選定で悩むところが多い
    – JSONライブラリだけで5~6くらいある?
    • filterやAOP相当の処理は関数合成で行う
    – ソースコードを追っていける
    • より型安全
    • Scalaはコミュニティが殺伐としてる(※個人的感想)

    View Slide

  17. Kotlin - Null Safety
    val x = request.getHeader(“Authorization”) ?:
    throw NoAuthInfoException(“auth header required.”)
    val y = bob?.department?.head?.name
    C#にもNull許容型に似たような演算子がある。
    PHPにもある?(よく知らない)
    Null安全のためにしか使えない演算子よりも、モナドとモナド用の構文
    があったほうが汎用性があるような…しかしそれを言うとKotlinである必
    要が無いし…以下略

    View Slide