Server Side Kotlin と Spring Boot v2

Server Side Kotlin と Spring Boot v2

Yahoo!カレンダーでのKotlin活用の状況や、Spring Boot v2 でのKotlin対応について発表しました。

7e2a8b6786e9dc67b692bc6f7395fcd3?s=128

BulBulPaul

August 09, 2018
Tweet

Transcript

  1. Server Side Kotlinと Spring Boot v2 Mix Leap Study #21


    2018/08/09 ヤフー株式会社 おかだ のぶお @bulbulpaul
  2. about me おかだ のぶお @bulbulpaul Yahoo!カレンダー Software Engineer !2

  3. !3 ˞:BIPPΧϨϯμʔΞϓϦͷྦྷܭμ΢ϯϩʔυ਺ʢ೥݄೔ूܭ࣌఺ʣʹͳΓ·͢ɻ

  4. Agenda !4

  5. [ 話すこと ] • Yahoo!カレンダーでどんな技術を使っているか • Spring BootでのKotlin Supportについて [

    話さないこと ] • 詳細な⾔語仕様, Spring全体の仕様 !5 Agenda
  6. • Yahoo!カレンダーの技術ポートフォリオ • なぜKotlinをつかってるか • 使ってるライブラリ • Spring BootのKotlin サポート

    • まとめ !6 Agenda
  7. Yahoo!カレンダーの 技術ポートフォリオ @Server Side !7 ざっくり

  8. 現⾏ Infrastructure Language !8

  9. 移⾏期 Infrastructure Language !9

  10. 最終形 Infrastructure Language !10

  11. Kotlin? !11 なんで ?

  12. !12 Why Kotlin? • Null Safe • sealed class •

    型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える
  13. !13 Why Kotlin? 制約と規律 • Null Safe • sealed class

    • 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える
  14. • Null Safe • sealed class • 型推論 • Smart

    Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える !14 Why Kotlin? ⾼い利便性
  15. !15 Why Kotlin? 巨⼈の肩に乗れる • Null Safe • sealed class

    • 型推論 • Smart Cast • data classが便利 • IDEのサポートが強⼒ • Javaのエコシステムを使える
  16. • Null Safe • sealed class • 型推論 • Smart

    Cast • IDEのサポートが強⼒ • data classが便利 • Javaのエコシステムを使える !16 Why Kotlin? 巨⼈の肩に乗れる ⾼い利便性 制約と規律 開発が楽しい ! ! ※ฐνʔϜͷΤϯδχΞஊ
  17. 利⽤技術 !17 なに使ってんの?

  18. • Athenz(認証 / 認可) • Pulsar (MQ) • Hystrix
 (サーキットブレーカー)

    Use library • SpringBoot (Framework) • Moshi (Json) Javaライブラリ Kotlin対応ライブラリ !18
  19. • Athenz(認証 / 認可) • Pulsar (MQ) • Hystrix
 (サーキットブレーカー)

    Use library • SpringBoot (Framework) • Moshi (Json) Javaライブラリ Kotlin対応ライブラリ !19
  20. ライブラリのKotlin対応とは? !20 どゆこと?

  21. !21 Support? • サポートされてない ≠ Kotlin動かない • Kotlinらしいコードで書ける為の処理対応 • 場合によってはJavaとの境界でNull Safeが守られない


    e.g. GsonでNullSafeの定義にしてもnullが⼊る
  22. • Spring Frameworkを容易に扱うことができるFW • 実⾏可能なjarを⽣成してくれる • Spring Initializer から簡単にプロジェクトを作成できる •

    Spring Boot v2(Spring 5)からKotlinを公式サポート !22 Spring Boot
  23. Spring Boot の Kotlin対応 !23 なにが変わったん?

  24. • idiomatic Kotlin code • Annotations • RouterFunctions • Bean

    definition DSL !24 Kotlin support
  25. • idiomatic Kotlin code • Annotations • RouterFunctions • Bean

    definition DSL !25 Kotlin support • Extension functions • Reified type parameters
  26. Extension Functions !26 拡張関数?

  27. public class Example { public <T> T create(Class<T> clazz) {

    try { return clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } } !27 example
  28. // Kotlin val example = Example() example.create(Foo::class.java) !28 example //

    Java Example example = new Example() example.create(Foo.class)
  29. val example = Example() example.create(Foo::class.java) !29 Kotlin class Example example

    = new Example() example.create(Foo.class) kotlin.reflection.KClass java.lang.Class
  30. import kotlin.reflect.KClass fun <T: Any> Example.create(kclass: KClass<T>) = create(kclass.java) !30

    extention Exampleの拡張関数を定義
  31. import kotlin.reflect.KClass fun <T: Any> Example.create(kclass: KClass<T>) = create(kclass.java) val

    example = Example() example.create(Foo::class) !31 idiomatic Kotlinらしい書き⽅!!
  32. Reified type parameters !32 具象化された型?

  33. Javaのコンパイルで消えてしまうジェネリクスの型を
 inline展開して処理中に参照をする !33 reified inline fun <reified T: Any> Example.create()

    = create(T::class.java)
  34. !34 Examples inline fun <reified T: Any> Example.create() = create(T::class.java)

    val example = Example() val foo = example.create<Foo>() 


 val hoge: Hoge = example.create() 左辺の型推論でも実⾏可能 <>で型を指定して実⾏できる
  35. in Spring Boot !35 で、どうなんの?

  36. SpringはClass<T>で受け取る処理が多いので
 細々したところの記載がKotlinらしく書ける !36 in Spring Boot // jdbcTemplate を使う時の従来の書き⽅ val

    count = jdbcTemplate.queryForObject( “SELECT count(*) FROM user”, Long::class.java) // Reified type parameters support val count = jdbcTemplate.queryForObject<Long>( “SELECT count(*) FROM user”) val count: Long = jdbcTemplate.queryForObject( “SELECT count(*) FROM user”)
  37. !37 Examples // 配列のJSONをList型で取得するHTTPリクエスト List<User> users = restTemplate.exchange( “https://example.com/users”, HttpMethod.GET,

    null, new ParameterizedTypeReference<List<User>>() {} ) .getBody();
  38. !38 Examples // 配列のJSONをList型で取得するHTTPリクエスト List<User> users = restTemplate.exchange( “https://example.com/users”, HttpMethod.GET,

    null, new ParameterizedTypeReference<List<User>>() {} ) .getBody(); val users: List<User> = restTemplate.exchange( “https://example.com/users”, HttpMethod.GET)
  39. Annotation !39

  40. @Controller class ExampleController(val foo: Foo, val bar: Bar?) { }

    !40 DI 必須のBean オプション Beanが無いとException
  41. @Controller class ExampleController(val foo: Foo, val bar: Bar?) { @GetMapping(“/article”)

    fun article(@RequestParam id: String, @RequestParam tag: String?) } !41 RequestParam オプション 必須 @RequestParam(required = false) String name
  42. Router Functions !42

  43. !43 Router Functions Ҿ༻: https://docs.spring.io/spring-framework/docs/5.0.0.BUILD-SNAPSHOT/spring-framework-reference/html/web-reactive.html

  44. @Configuration class Router(private val fooHandler: FooHandler, private val barHandler: BarHandler)

    { @Bean fun apiRouter() = router { accept(APPLICATION_JSON_UTF8).nest { GET("/", fooHandler::getDemo) GET("/foo", fooHandler::findAll) } } } !44 RequestParam Router
  45. ま と め !45

  46. !46 まとめ • SpringBootはKotlinの特性を邪魔せず書ける • Kotlinはサーバーサイドでも⼗分に活⽤できる • Javaのライブラリも問題なく使える

  47. みなさんも, もっと Server Side Kotlin やりましょう ! !

  48. !48 さいごに 登壇します ! 9⽉28⽇(⾦) 神⼾国際会議場 13:50〜 Aトラック

  49. お わ り !49