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

Server Side Kotlin と Spring Boot v2

BulBulPaul
August 09, 2018

Server Side Kotlin と Spring Boot v2

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

BulBulPaul

August 09, 2018
Tweet

More Decks by BulBulPaul

Other Decks in Programming

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