Slide 1

Slide 1 text

Server Side Kotlinと Spring Boot v2 Mix Leap Study #21
 2018/08/09 ヤフー株式会社 おかだ のぶお @bulbulpaul

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

Agenda !4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

現⾏ Infrastructure Language !8

Slide 9

Slide 9 text

移⾏期 Infrastructure Language !9

Slide 10

Slide 10 text

最終形 Infrastructure Language !10

Slide 11

Slide 11 text

Kotlin? !11 なんで ?

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Extension Functions !26 拡張関数?

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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


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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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”)

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

!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)

Slide 39

Slide 39 text

Annotation !39

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

@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

Slide 42

Slide 42 text

Router Functions !42

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

@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

Slide 45

Slide 45 text

ま と め !45

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

お わ り !49