DocurainのWeb-API部分の実装やバックエンドについての資料です。
https://quality-start.in/docurain
Spring boot + KotlinでWebサービスをサクッと作ってみたby makoto yuri
View Slide
自己紹介経験が長い→ C, C#最近やってる→Java / Spring boot / JS好き → Scala / Play Framework由利 誠 (withpop)@anoparanominal (twitter)https://anopara.net (blog)フリーランス
伝えたいこと• ScalaやPlayと比較してJavaやSpringはどう感じたか• Spring bootを使った感想• Spring boot + Kotlinの組み合わせはどうなのか
帳票作成サービス Docurain• Excelで作った帳票テンプレートにJSONでデータを流し込んでPDF/Excel/画像を返却• If/foreachなどの制御構造を使用可能• Excelの機能(グラフ、スタイル、数式)が大体動作する• プレビュー版公開中なのでご興味がある方は是非
簡単なデモ
Docurainの開発Load BalancerConsole / APIApplication ServerCore Engine ServerRedis Maria DBSpring boot / KotlinS3
Spring bootの良い点• デプロイが超絶簡単– executable jarへのシンボリックリンクをinit.d下に貼るだけ• フルスタックなのでライブラリ選定で悩まない• Spring Security便利– Redisへのセッション吐き出し– 認可– BCrypt• Tomcatで動く– Tomcatで動くことを要求されることが多い• あまり特殊なことをしなければ生産性がとても高い
Spring bootのつらみ• annotationに頼りすぎ– 処理が散逸する 関心事が一つにまとまらない– 実行しないとエラーが分からない– 知らないと辛い(学習コストが高い)• Controllerの作り方がわかりにくい– クッキーをいじるには?Statusコードはどうすればいいの?入出力のContent-Typeを動的に変更するには?– 入力(Request)と出力(Response)の型がガッチリ決まっててほしい
Spring bootのつらみの例@Controller@ResponseBodyclass UserController {@GetMapping(“/users/{userId}”)fun getUser(@PathVariable userId: String): Boolean {return userModel.getUserId(userId) ?:UserNotFoundException()}}@ResponseStatus(HttpStatus.NOT_ACCEPTABLE)class UserNotFoundException() : Exception()@ControllerAdviceclass ExceptionHandler {@ExceptionHandler(UserNotFoundException::Class)fun userNotFound(): ResponseEntity{return ResponseEntity(“user not found.”, HttpStatus.NOT_FOUND)}Userを返却するという関心事が散逸してしまう。せめてgetUser()の中で完結してほしい
Kotlin + Springの良い点• 「Kotlinだから出来ない」は無かった• 拡張メソッドが充実してて痒いところに手が届く– joinString, stripMargin, use• Null safetyの演算子はまあまあ便利– 特定の問題を解決するためだけに演算子を定義してしまうのは個人的にはあんまり綺麗とは思わない• Kotlinの学習コストは低め
Kotlin + Springのつらみ• String Interpolationが常時動作するのがうざい例: @Value(“¥${foo.baa}”)• Beanを定義するときにdata classの恩恵が薄い。Lombokのほうが楽に感じた• パターンマッチもScala比で出来ることが少なくなってる• 落とし穴が多い気がする(Kotlinの言語仕様)
fun foo(): Boolean {return listOf(1, 2, 3).all {return it == 1}}落とし穴の例foo()の実行結果は?その他の愚痴→ http://anopara.net/2017/09/16/kotlinの気に入らないところ/
まとめ• Spring boot / Kotlinの組み合わせはプロダクトでも十分使える• なんだかんだでKotlinはBetter Javaと言うに相応しいと思う。Kotlin使えるなら使ったほうが良い• Javaからの乗り換えを容易にした分、アドバンテージも小さくなってる気が• Javaも進化しているので、今Kotlinに積極的に乗り換える理由があるかというと…?そもそも人は集められるのか…?
おわりDocurain使ってみてね!!
Scala / Play との比較• シンプルでわかりやすい– 学習コストはSpring bootよりPlayのほうが低いと感じる• ライブラリの選定で悩むところが多い– JSONライブラリだけで5~6くらいある?• filterやAOP相当の処理は関数合成で行う– ソースコードを追っていける• より型安全• Scalaはコミュニティが殺伐としてる(※個人的感想)
Kotlin - Null Safetyval x = request.getHeader(“Authorization”) ?:throw NoAuthInfoException(“auth header required.”)val y = bob?.department?.head?.nameC#にもNull許容型に似たような演算子がある。PHPにもある?(よく知らない)Null安全のためにしか使えない演算子よりも、モナドとモナド用の構文があったほうが汎用性があるような…しかしそれを言うとKotlinである必要が無いし…以下略