$30 off During Our Annual Pro Sale. View Details »

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

    View Slide

  2. about me
    おかだ のぶお
    @bulbulpaul
    Yahoo!カレンダー
    Software Engineer
    !2

    View Slide

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

    View Slide

  4. Agenda
    !4

    View Slide

  5. [ 話すこと ]
    • Yahoo!カレンダーでどんな技術を使っているか
    • Spring BootでのKotlin Supportについて
    [ 話さないこと ]
    • 詳細な⾔語仕様, Spring全体の仕様
    !5
    Agenda

    View Slide

  6. • Yahoo!カレンダーの技術ポートフォリオ
    • なぜKotlinをつかってるか
    • 使ってるライブラリ
    • Spring BootのKotlin サポート
    • まとめ
    !6
    Agenda

    View Slide

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

    View Slide

  8. 現⾏
    Infrastructure
    Language
    !8

    View Slide

  9. 移⾏期
    Infrastructure
    Language
    !9

    View Slide

  10. 最終形
    Infrastructure
    Language
    !10

    View Slide

  11. Kotlin?
    !11
    なんで

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. • Null Safe
    • sealed class
    • 型推論
    • Smart Cast
    • IDEのサポートが強⼒
    • data classが便利
    • Javaのエコシステムを使える
    !16
    Why Kotlin?
    巨⼈の肩に乗れる
    ⾼い利便性
    制約と規律
    開発が楽しい


    ※ฐνʔϜͷΤϯδχΞஊ

    View Slide

  17. 利⽤技術
    !17
    なに使ってんの?

    View Slide

  18. • Athenz(認証 / 認可)
    • Pulsar (MQ)
    • Hystrix

    (サーキットブレーカー)
    Use library
    • SpringBoot (Framework)
    • Moshi (Json)
    Javaライブラリ Kotlin対応ライブラリ
    !18

    View Slide

  19. • Athenz(認証 / 認可)
    • Pulsar (MQ)
    • Hystrix

    (サーキットブレーカー)
    Use library
    • SpringBoot (Framework)
    • Moshi (Json)
    Javaライブラリ Kotlin対応ライブラリ
    !19

    View Slide

  20. ライブラリのKotlin対応とは?
    !20
    どゆこと?

    View Slide

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

    e.g. GsonでNullSafeの定義にしてもnullが⼊る

    View Slide

  22. • Spring Frameworkを容易に扱うことができるFW
    • 実⾏可能なjarを⽣成してくれる
    • Spring Initializer から簡単にプロジェクトを作成できる
    • Spring Boot v2(Spring 5)からKotlinを公式サポート
    !22
    Spring Boot

    View Slide

  23. Spring Boot の Kotlin対応
    !23
    なにが変わったん?

    View Slide

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

    View Slide

  25. • idiomatic Kotlin code
    • Annotations
    • RouterFunctions
    • Bean definition DSL
    !25
    Kotlin support
    • Extension functions
    • Reified type parameters

    View Slide

  26. Extension Functions
    !26
    拡張関数?

    View Slide

  27. public class Example {
    public T create(Class clazz) {
    try {
    return clazz.newInstance();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    !27
    example

    View Slide

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

    View Slide

  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

    View Slide

  30. import kotlin.reflect.KClass
    fun Example.create(kclass: KClass) =
    create(kclass.java)
    !30
    extention
    Exampleの拡張関数を定義

    View Slide

  31. import kotlin.reflect.KClass
    fun Example.create(kclass: KClass) =
    create(kclass.java)
    val example = Example()
    example.create(Foo::class)
    !31
    idiomatic
    Kotlinらしい書き⽅!!

    View Slide

  32. Reified type parameters
    !32
    具象化された型?

    View Slide

  33. Javaのコンパイルで消えてしまうジェネリクスの型を

    inline展開して処理中に参照をする
    !33
    reified
    inline fun Example.create() =
    create(T::class.java)

    View Slide

  34. !34
    Examples
    inline fun Example.create() =
    create(T::class.java)
    val example = Example()
    val foo = example.create()
    



    val hoge: Hoge = example.create()
    左辺の型推論でも実⾏可能
    <>で型を指定して実⾏できる

    View Slide

  35. in Spring Boot
    !35
    で、どうなんの?

    View Slide

  36. SpringはClassで受け取る処理が多いので

    細々したところの記載が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(
    “SELECT count(*) FROM user”)
    val count: Long = jdbcTemplate.queryForObject(
    “SELECT count(*) FROM user”)

    View Slide

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

    View Slide

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

    View Slide

  39. Annotation
    !39

    View Slide

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

    View Slide

  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

    View Slide

  42. Router Functions
    !42

    View Slide

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

    View Slide

  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

    View Slide

  45. ま と め
    !45

    View Slide

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

    View Slide

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


    View Slide

  48. !48
    さいごに
    登壇します

    9⽉28⽇(⾦) 神⼾国際会議場
    13:50〜 Aトラック

    View Slide

  49. お わ り
    !49

    View Slide