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

Server-Side Kotlinで必要なJavaの知識

Server-Side Kotlinで必要なJavaの知識

2021年5月12日(水) 「Server-Side Kotlin Study #1」の登壇資料です。

Takehata Naoto

May 12, 2021
Tweet

More Decks by Takehata Naoto

Other Decks in Programming

Transcript

  1. Server-Side Kotlin
    で必要なJava
    の知識
    2021
    年5
    月12


    竹端 尚人

    View full-size slide

  2. Server-Side Kotlin
    で必要なJava
    の知識
    2021
    年5
    月12


    竹端 尚人

    View full-size slide

  3. 自己紹介

    View full-size slide

  4. 概要
    竹端 尚人

    フリーランスエンジニア
    Twitter: @n_takehata

    職種:
    バックエンドエンジニア

    好きな言語:Kotlin
    Server-Side Kotlin
    、Java
    、etc…
    (
    少し前まで)
    スマートフォンゲーム開発
    昨年12
    月からフリーランスに

    View full-size slide

  5. 登壇、執筆など
    CEDEC2018
    、2019
    登壇
    Software Design 2019
    年2
    〜4
    月号で短期連

    書籍「
    Kotlin
    サーバーサイドプログラミング
    実践開発」を2021
    年4
    月に発売

    View full-size slide

  6. 書籍の一節
    またJava
    との相互互換という特徴があり、世の中にすでに多くあるJava
    の資産を活用するこ ともでき、モダンかつ資産も豊富にあると
    いう素晴らしい言語です。
    しかし、その特徴ゆえ「Java
    がわかる人じゃないと難しいんじゃないか」と思われてしまうことも多い です。

    View full-size slide

  7. Kotlin
    を学ぶのにJava
    の知識はどれだけ必要なのか?

    View full-size slide

  8. アジェンダ
    1.Java
    の知識は絶対必要なのか?
    2.
    よく使う知識
    3.
    まとめ

    View full-size slide

  9. アジェンダ
    1.Java
    の知識は絶対必要なのか?
    2.
    よく使う知識
    3.
    まとめ

    View full-size slide

  10. 1.Java
    の知識は絶対必要なのか?

    View full-size slide

  11. 結論


    Java
    自体の知識はなくても学べる

    View full-size slide

  12. 書籍では「Java
    との相互互換」について書いた3
    章以外は、Java
    のコードは出てきません

    View full-size slide

  13. Java
    の知識があることを前提としなくても、Kotlin
    を学ぶことに問題はない
    Java
    経験がない場合の学習コストは、他の言語に比べて特別高いということはない
    ただし、知っていると学ぶのが圧倒的に楽になる

    View full-size slide

  14. 知っていると有利な点
    構文や機能で似たものを有している
    フレームワークやライブラリはJava
    製のものを活用することも多い
    世の中にある既存のJava
    の資産を活用できる

    View full-size slide

  15. Java
    を知っていると楽だが、なくても大丈夫
    (Kotlin
    やるためにJava
    を先に学ばなくては・・・ということはない)

    View full-size slide

  16. アジェンダ
    1.Java
    の知識は絶対必要なのか?
    2.
    よく使う知識
    3.
    まとめ

    View full-size slide

  17. 2.
    よく使う知識

    View full-size slide

  18. オブジェクト思考の知識
    フレームワーク、ライブラリの知識
    Java
    の言語自体の知識

    View full-size slide

  19. オブジェクト思考の知識
    クラス、インターフェースなどの基本的なオブジェクト思考の知識はあった方が学びやすい
    C#
    など他のオブジェクト思考言語をやっていると理解はしやすい
    (
    似たような話で関数型の知識なども)

    View full-size slide

  20. 広義の意味で
    Java
    の知識

    View full-size slide

  21. フレームワーク、ライブラリの知識
    Spring Boot
    が無難な選択肢として上がる
    各種ORM
    もJava
    製が使われることが多い(Exposed
    がなかなか正式版にならないので)
    テスティングフレームワークはJUnit
    が多い

    View full-size slide

  22. 例えば
    Spring Boot
    を知っていた場合

    View full-size slide

  23. 以下のようなメリットがある
    Java
    と同じようなアーキテクチャのアプリケーションなので実装が理解しやすい
    フレームワークの機能を把握している
    運用ノウハウがある

    View full-size slide

  24. コード例

    View full-size slide

  25. Spring Boot
    のアノテーション
    @RestController

    @RequestMapping("greeter")

    class GreeterController(

    private val greeter: Greeter

    ) {

    @GetMapping("/hello")

    fun hello(@RequestParam("name") name: String): HelloResponse {

    return HelloResponse("Hello ${name}")

    }

    }

    View full-size slide

  26. Spring Security
    のインターフェース実装
    class MyAuthenticationFailureHandler : AuthenticationFailureHandler {

    override fun onAuthenticationFailure(

    request: HttpServletRequest,

    response: HttpServletResponse,

    exception: AuthenticationException

    ) {

    response.status = HttpServletResponse.SC_UNAUTHORIZED

    }

    }

    View full-size slide

  27. Java
    のライブラリを使う場合

    View full-size slide

  28. Kotlin
    からJava
    のライブラリ呼び出し
    fun main() {

    val uuid = UUID.randomUUID()

    println(uuid.toString())

    val now = LocalDateTime.now()

    println(now)

    }

    View full-size slide

  29. いずれも
    Java
    の知識は使うが、
    Java
    のコードは書かない

    View full-size slide

  30. Java
    の言語自体の知識
    フレームワークでJava
    のコードを生成する部分
    Java
    との互換のための機能を使う時
    既存のJava
    の資産を活用したい場合

    View full-size slide

  31. フレームワークでJava
    のコードを生成する部分
    gRPC
    、各種ORM
    などで自動生成するコードでKotlin
    対応してないもの
    初めて扱う際などは読んでみた方が良い

    View full-size slide

  32. gRPC
    の実装
    @RestController

    class GreeterClientController {

    @GetMapping("/greeter/hello/{name}")

    fun hello(@PathVariable name: String): String = runBlocking {

    val channel = ManagedChannelBuilder.forAddress(HOST, PORT)

    .usePlaintext()

    .build()

    val request = HelloRequest.newBuilder().setName(name).build()

    val stub = GreeterGrpcKt.GreeterCoroutineStub(channel)

    val response = async { stub.hello(request) }

    response.await().text

    }

    }

    View full-size slide

  33. 生成されたコード
    public final class HelloRequest extends

    com.google.protobuf.GeneratedMessageV3 implements

    // @@protoc_insertion_point(message_implements:example.greeter.HelloRequest)

    HelloRequestOrBuilder {

    //
    ・・・

    public static Builder newBuilder() {

    return DEFAULT_INSTANCE.toBuilder();

    }

    //
    ・・・

    public Builder setName(

    java.lang.String value) {

    if (value == null) {

    throw new NullPointerException();

    //
    ・・・

    View full-size slide

  34. 自動生成なので書くことはないが、




    必要に応じて読むことはある

    View full-size slide

  35. Java
    との互換のための機能を使う時
    @JvmStatic
    などの各種アノテーション
    SAM
    変換
    etc…

    View full-size slide

  36. @JvmStatic
    class CompanyConstants {

    companion object {

    @JvmStatic

    val maxEmployeeCount = 100

    }

    }

    View full-size slide

  37. アノテーションがなかった場合
    public static void main(String[] args) {

    System.out.println(CompanyConstants.Companion.getMaxEmployeeCount());

    }
    Java
    からどう呼ばれるかの理解が必要

    View full-size slide

  38. SAM
    変換
    fun main() {

    val function = CalcJava { num1, num2 -> num1 + num2 }

    println(function.calc(1, 3))

    }
    @FunctionalInterface

    public interface CalcJava {

    Integer calc(Integer num1, Integer num2);

    }
    Java
    の何を呼んでいるかの理解が必要

    (
    今はKotlin
    同士でも使えるようになったのでJava
    独自のものではないが)

    View full-size slide

  39. Java
    からどう呼ばれているか、
    Java
    をどう呼んでいるかを


    理解する必要はある


    View full-size slide

  40. 既存のJava
    の資産を活用したい場合
    Java
    にしかないOSS
    を使いたい場合
    組織でJava
    の資産を持っていて活用したい場合

    View full-size slide

  41. この場合は多分組織内に有識者がいるので問題ない

    View full-size slide

  42. アジェンダ
    1.Java
    の知識は絶対必要なのか?
    2.
    よく使う知識
    3.
    まとめ

    View full-size slide

  43. Java
    を知らなくてもServer-Side Kotlin
    は始められる
    ただし、Java
    を知っていると学習コストは圧倒的に下がる
    Java
    を書く必要はないが、多少読んだり理解する必要がある場面は存在する(
    でもそんなに怖がらなくてい
    いレベル)

    View full-size slide