サーバーサイドkotlinは怖くない:Kotlin ✖︎ Spring Boot

E9a8393b5ad337ea9103d50169aa6d32?s=47 Lukas
August 24, 2017

サーバーサイドkotlinは怖くない:Kotlin ✖︎ Spring Boot

E9a8393b5ad337ea9103d50169aa6d32?s=128

Lukas

August 24, 2017
Tweet

Transcript

  1. Kotlin ✖ Spring Boot サーバーサイドKotlinは怖くない どこでもKotlin #1 2017-08-24 エムスリー株式会社 Lukas

    Prasuhn
  2. 自己紹介 - M3のSoftware Engineer - 日本歴12年のドイツ人 - Java経験が少ない → いきなりKotlin

    - よくやってきた言語 - C++ (C++11まで) - PHP5 - Ruby - Github: lukasjapan - RaspberryPiをイジるのが好き - モデル1 は 1台 - モデル3 は 3台
  3. 目次 - イントロダクション - Part I: まずはTutorialを動かしてみる - Part II:

    使いたい機能検証 - A) Spring/Javaで使いたい機能編 - B) Kotlinで使いたい機能編 - Part III: Kotlin/Javaの相違による検証 - 結論
  4. イントロダクション

  5. Kotlinとは - JVM言語 - Javaのエコシステムが使えるように頑張っている - 自分にとってのKotlin - めちゃ書きやすいJava -

    色々な言語が混ざっている - Java - Ruby - … - val/varが最高
  6. Spring Bootとは - JavaのMVC Webフレームワーク - 厳密にいうと - Springフレームワークをセットアップする -

    Boilerplateをなくする - Webアップリケーションをすぐ書ける
  7. Spring BootのKotlinサポート https://spring.io/blog/2017/01/04/introducing-kotlin-support-in-spring-framework-5-0 • Official Kotlin Support in Spring 5

    • よってOfficial Kotlin Support in Spring Boot 2 • 現在のstableバージョン(2017年8月) ◦ Spring 4.3.10 ◦ Spring Boot 1.5.6
  8. Part I: まずはTutorialを動かしてみる

  9. SpringBootのサンプルコード - Spring BootのSampleコード - https://spring.io/guides/gs/spring-boot/ - gradle bootRunで実行

  10. Kotlinで動かしてみる - GradleでKotlinを有効にする - https://kotlinlang.org/docs/reference/using-gradle.html - build.gradleに定義をそのまま追加 - IntelliJ IDEAでコンバート

    - Kotlin知らなくてもできる(はず)
  11. やってみた結果 - だがそのままではコンパイルに失敗 - 自動変換ツールが完璧じゃなかった - じゃ、ソースを動くように修正 - Reflectionを使うからbuild.gradleに compile("org.jetbrains.kotlin:kotlin-reflect")

    の追 加も必要 修正後サンプルコード
  12. 実行成功! - KotlinでSpring Bootのサンプルプ ロジェクトを動かせた! - Beanも表示された!

  13. これでわかったこと - KotlinはやっぱりJavaとの互換性を求めていた - SpringはKotlinで定義したクラスを利用できた - Annotationも問題なく使えた - (AnnotationもJVM Bytecodeにコンパイルされる)

    - Spring BootはKotlinと一緒に使える!
  14. サーバーサイドKotlinはいける! 怖くない!

  15. Part II: 使いたい機能検証

  16. A) Spring/Javaの使いたい機能編

  17. RestController - Webの基礎(HTTP) - GET, POST, DELETE, … - CURLで動作確認

  18. RestControllerは 怖くない!

  19. Configuration - ソースコードから拾うConfig - JSONレスポンスのキーケース変換 - 例)fooBar → foo_bar -

    Kotlinのfinal classポリシーに引っかかる - @Configuration class 'Config' may not be final. Remove the final modifier to continue. - Kotlinのクラスは全てfinal - 解決策 - 1) 毎回openを書く - 2) kotlin-springのプラグイン - classpath("org.jetbrains.kotlin:kotlin-allopen:$kotli n_version") - apply plugin: 'kotlin-spring' - Applicationクラスのopenも不要になる
  20. Configurationも 怖くない!

  21. Dependency Injection - Spring Bootがインスタンスの自動生成 機能 - Constructorに自動で渡す - Controllerの生成後にセット

    - @Autowired + lateinit
  22. Dependency Injectionも 怖くない!

  23. Bean Validation (1) - Javaでバリデーションを行う時の定番 - Class fieldに@NotNull, @Min, アノテーション

    - バリデーショングループ - GET parameterはsetterでobjectに挿入 - 成年と性別をバリデートする 残念なポイント: - arrayOfは書きづらい - lateinit varを使いたい気持ちもあるが - Int/Boolean/...の場合は使えない - Javaと同じようにする
  24. Bean Validation (2) - 自分をバリデート

  25. バリデーションはそんなに 怖くない!

  26. DBアクセス(DOMA2) - DOMA2のSpring Boot用パッケージを検証 - Doma は Java のDBアクセスフレームワーク -

    日本製 - 生SQLもそこそこ書ける - Kotlin実験的サポートのみ - kapt(Kotlin annotation processing tool)の力が必要 - それでも部分的にJavaを書かないといけない - 長く挑戦していないがダメだった - ネットで調べると他の人は使えた - Springのせい? - 生Javaを書いた方が安心
  27. Doma2 + Spring + Kotlinは 少しだけ怖い!

  28. B) Kotlinの使いたい機能編

  29. Data Class レスポンス - Kotlinのデータクラスをレスポンスで使いたい

  30. Data Classレスポンスも 怖くない!

  31. Kotlin Generics - Kotlin/Spring Boot両方でよく使うGenericタイプはリスト系 - List - Map -

    など - Kotlin の Java 相互性があるので問題なし
  32. Kotlin Genericsも 怖くない!

  33. Part III: Kotlin/Javaの相違による検証

  34. 意図 - Kotlinが生成するJVMコードを簡単にコールできる - 逆でも大丈夫? - どこが心配? - SpringがKotlinのクラスを操作する場合 -

    Kotlinが生成するJVMコードがSpringに使われる
  35. Checked Exceptions - Springはあまり使わない - あったとしても@Throwsアノテーションを使える

  36. JavaのChecked Exceptionsも 怖くない!

  37. Static Class Members - Spring Bootがstatic fieldをget/setしたい場合 - Stack Overflowの回答より:

    Spring does not allow injecting to static fields. - あったとしても@JvmStaticアノテーションをつけられる
  38. JavaのStatic Class Methodsも 怖くない!

  39. Non Private Fields - Kotlinでは全てのfieldアクセスがgetter/setter方式 - あったとしても@JvmFieldアノテーションをつけられる

  40. JavaのNon Private Fieldsも 怖くない!

  41. Wildcard Types - Wildcard Typeへの依存はSpringで見たことない

  42. JavaのWildcard Typesも 怖くない!

  43. 結論

  44. Spring BootのサーバーサイドKotlinは 全然怖くない! 使いましょう!