Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 - M3のSoftware Engineer - 日本歴12年のドイツ人 - Java経験が少ない → いきなりKotlin - よくやってきた言語 - C++ (C++11まで) - PHP5 - Ruby - Github: lukasjapan - RaspberryPiをイジるのが好き - モデル1 は 1台 - モデル3 は 3台

Slide 3

Slide 3 text

目次 - イントロダクション - Part I: まずはTutorialを動かしてみる - Part II: 使いたい機能検証 - A) Spring/Javaで使いたい機能編 - B) Kotlinで使いたい機能編 - Part III: Kotlin/Javaの相違による検証 - 結論

Slide 4

Slide 4 text

イントロダクション

Slide 5

Slide 5 text

Kotlinとは - JVM言語 - Javaのエコシステムが使えるように頑張っている - 自分にとってのKotlin - めちゃ書きやすいJava - 色々な言語が混ざっている - Java - Ruby - … - val/varが最高

Slide 6

Slide 6 text

Spring Bootとは - JavaのMVC Webフレームワーク - 厳密にいうと - Springフレームワークをセットアップする - Boilerplateをなくする - Webアップリケーションをすぐ書ける

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Part I: まずはTutorialを動かしてみる

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

Kotlinで動かしてみる - GradleでKotlinを有効にする - https://kotlinlang.org/docs/reference/using-gradle.html - build.gradleに定義をそのまま追加 - IntelliJ IDEAでコンバート - Kotlin知らなくてもできる(はず)

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

実行成功! - KotlinでSpring Bootのサンプルプ ロジェクトを動かせた! - Beanも表示された!

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

サーバーサイドKotlinはいける! 怖くない!

Slide 15

Slide 15 text

Part II: 使いたい機能検証

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

RestControllerは 怖くない!

Slide 19

Slide 19 text

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も不要になる

Slide 20

Slide 20 text

Configurationも 怖くない!

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Dependency Injectionも 怖くない!

Slide 23

Slide 23 text

Bean Validation (1) - Javaでバリデーションを行う時の定番 - Class fieldに@NotNull, @Min, アノテーション - バリデーショングループ - GET parameterはsetterでobjectに挿入 - 成年と性別をバリデートする 残念なポイント: - arrayOfは書きづらい - lateinit varを使いたい気持ちもあるが - Int/Boolean/...の場合は使えない - Javaと同じようにする

Slide 24

Slide 24 text

Bean Validation (2) - 自分をバリデート

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

DBアクセス(DOMA2) - DOMA2のSpring Boot用パッケージを検証 - Doma は Java のDBアクセスフレームワーク - 日本製 - 生SQLもそこそこ書ける - Kotlin実験的サポートのみ - kapt(Kotlin annotation processing tool)の力が必要 - それでも部分的にJavaを書かないといけない - 長く挑戦していないがダメだった - ネットで調べると他の人は使えた - Springのせい? - 生Javaを書いた方が安心

Slide 27

Slide 27 text

Doma2 + Spring + Kotlinは 少しだけ怖い!

Slide 28

Slide 28 text

B) Kotlinの使いたい機能編

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Kotlin Generics - Kotlin/Spring Boot両方でよく使うGenericタイプはリスト系 - List - Map - など - Kotlin の Java 相互性があるので問題なし

Slide 32

Slide 32 text

Kotlin Genericsも 怖くない!

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Checked Exceptions - Springはあまり使わない - あったとしても@Throwsアノテーションを使える

Slide 36

Slide 36 text

JavaのChecked Exceptionsも 怖くない!

Slide 37

Slide 37 text

Static Class Members - Spring Bootがstatic fieldをget/setしたい場合 - Stack Overflowの回答より: Spring does not allow injecting to static fields. - あったとしても@JvmStaticアノテーションをつけられる

Slide 38

Slide 38 text

JavaのStatic Class Methodsも 怖くない!

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

JavaのNon Private Fieldsも 怖くない!

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

JavaのWildcard Typesも 怖くない!

Slide 43

Slide 43 text

結論

Slide 44

Slide 44 text

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