バックエンド開発のためのKotlinの使用:簡単な概要

公開: 2022-03-11

2017年5月にGoogleがKotlinをAndroid開発の公用語にすることを発表したので、ネイティブのAndroid開発者にKotlinを紹介する必要はありません。 それ以来、新しくて光沢のあるAndroidアプリを開発するための主要な言語の選択肢として、多くの注目を集めています。 これはJavaの多くの問題点を解決するため、新しいアプリはほとんどJavaで記述され、古いアプリはJavaで書き直されています。

アプリケーションのフロントエンド側で優れていることは間違いありません。Kotlinについて最初に言及したとき、ほとんどの人はそれをAndroidOSに関連付けています。 ただし、この記事では、バックエンド言語としてのKotlinについて説明し、Androidホビープロジェクト用に高速で信頼性の高い非同期のKotlinバックエンドを作成する方法について説明します。 この記事の範囲外であるため、プロジェクトの内容については説明しません。 むしろ、Kotlinを選択した理由と、Kotlinがサーバー側アプリケーションまたはRESTAPIを作成するための優れた言語であると考える理由を説明することに焦点を当てます。

なぜKotlinなのか?

旅の最初に戻りましょう。 私は常に起業家精神を持っていました。この道の最初のステップは、自分で何かを作ることだと思いました。 大きなものも、世界を変えるものも、私や家族や友人が使える小さなものもありません。 合理的なアイデアを思いついた後、私はそれに飛びつき、それを実装し始めました。 プロジェクトの開始時に最初に行うことは、ツールを選択することです。 結局のところ、適切なツールのセットは、長期的には多くの時間とお金を節約することができます。 これが私がしたことです。

私は主にJava開発者です。 私はJavaとSpringを使用していくつかのバックエンドシステムとRESTAPIを作成しましたが、これら2つはそのようなことを行うための優れたツールだと思います。 Java自体は包括的な言語ですが、Springと組み合わせると、実装できないものは何もありません。

ただし、スープには小さな髪が1本しかありません。 冗長性。 Springと最新バージョンのJavaはそれを大いに助けますが、それでも多くの定型コードを処理する必要があります。 そして、かつて偉大な男が私に言ったように、最も安全で、最も信頼性が高く、バグのないコードは、書き留められていないコードです。 たとえば、次の簡単なJavaクラスを考えてみましょう。

 public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }

私の意見では、これは単に「2つの読み取り専用フィールドを持つクラスが必要です」と言うための多くのコードです。 最悪の部分は、コンストラクターとメソッドが自動生成されたことです。 それでも、プルリクエストを確認するときは、プルリクエストを常に確認します。これは、プルリクエストが必要かどうかがわからないためです。 もちろん、これはLombokのようなサードパーティのライブラリで短縮できますが、箱から出してこれを実行できたら素晴らしいと思いませんか? Kotlinでこれとまったく同じクラスを見てみましょう。

 class Person( val name: String, val age: Int )

それは間違いなく短くて簡単です。 valキーワードを使用するため、変数は最終的なものです。 コンストラクターとゲッターはコンパイル時に生成されます。 不変の人物オブジェクトを使用したくない場合は、 valvarに変更するだけで済みます。出来上がり、可変の人物があり、1文字を変更するだけです。

単純なJavaPOJOクラスで2番目に好きな部分は、オーバーライドされたequals()hashCode()です。 これらはほとんどの場合再び自動生成されますが、念のため、常にそれらを確認する必要があります。 幸いなことに、Kotlinはこれも処理できます。 classdata classに変更するだけで、 equals()hashCode()をすぐに使用できます。

 data class Person( val name: String, val age: Int )

要するに、私はJavaが大好きですが、プロジェクトのために最小限の実行可能な製品をできるだけ早く作成したかったのです。 そして、ソフトウェア開発の場合、これを達成するための最も簡単な方法は、より少ないコードを書くことです。 したがって、バックエンド開発のためのより良い言語を探し続けました。 この考えを念頭に置いて、私は最初にNode.jsに移行しました。 これにはいくつかの重要な利点があります。数行でExpressサーバーが稼働しており、ポート8080でリッスンし、 Hello World!で応答します。 getリクエストを送信するたび。

 let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);

簡単、シンプル、そして高速。 世の中で最も人気のあるプログラミング言語の1つに期待するものです。 私はJavaScriptでの作業を楽しんでおり、少しの間、適切なツールを見つけたと思いましたが、JavaScriptが動的に型付けされているという事実に悩まされました。 誤解しないでください。動的型付けはフロントエンドで優れていると思いますが、私の経験では、静的型付けされたバックエンドを使用すると、型の不一致が原因でサーバーが実行時にクラッシュする可能性が低くなるという確信が得られます。 。 そして、ここで正直に言うと、バックエンドが数十万のユーザーにサービスを提供している場合、それが実際に発生することは望ましくありません。 ただし、Node.jsは、非同期のコードとサービスを簡単に記述できるという、私が維持したい1つの優れた機能を提供しました。

これらの要件を念頭に置いて、KotlinAndroidバックエンドをKotlinでも作成することにしました。

Kotlin:簡単な概要

これまで聞いたことがない人のために、Kotlinは、オブジェクト指向プログラミングと関数型プログラミングの両方をサポートする、オープンソースの静的型付けプログラミング言語です。 C#、Java、またはScalaと同様の構文と概念を提供し、主にJVMを対象としていますが、JavaScriptまたはネイティブコードを対象とするバリアントもあります。 Kotlin / JVMがJavaバイトコードにコンパイルされるという点でJavaと非常に似ているため、JVMのバックグラウンドを持つバックエンドエンジニアにとって、Kotlinは簡単に把握できます。

公式ページに記載されているように、Kotlinの目的は、独自のものではなく、何十年にもわたる言語開発からインスピレーションとベストプラクティスを引き出すことです。 これは、任意のJava IDEまたはコマンドラインから使用できますが、個人的にはIntelliJで使用することをお勧めします。 JetBrainsチームによって積極的に保守およびアップグレードされており、有料バージョンの購入について心配する必要はありません。Kotlinを使い始めたばかりの場合は、IntelliJのコミュニティバージョンがあらゆるニーズに対応します。 私が指摘したいKotlinの3つの最も重要な側面は、a)簡潔(ボイラープレートコードを大幅に削減)、b)安全(1つには、nullポインター例外を回避するために構築されている)、およびcです。 )相互運用可能(JVM、Android、またはブラウザー用の既存のライブラリーを活用できます)。

Kotlinコルーチン

誰もがユーザーに迅速にサービスを提供するサービスを望んでいます。 サーバーの最大容量に到達するために最初にできることは、マルチスレッドアプリケーションを使用することです。 Javaはそれでかなり面倒です。 Javaを学ぶとき、最初に、マルチスレッドアプリケーションが必要な場合は、Threadクラスを拡張するか、Runnableインターフェイスを実装する必要があることを学びます。 初心者は(もしあれば)違いが何であるかを実際に理解することはありませんが、混乱を増すために、startメソッドを使用せずに、常にrunメソッドでスレッドを開始するように指示されます。 または待って、それは逆でしたか? 結局のところ、それは問題ではありません。とにかく手動でスレッドを開始するべきではありません。それは高すぎるので、むしろスレッドプールを使用します。 単純ですが、そうではありません。

幸い、Kotlinにはコルーチンと呼ばれるさらに単純なソリューションがあります。 簡単に言えば、コルーチンを使用すると、非常に流暢な方法で非同期の非ブロッキングコードを記述できます。 中心的なアイデアは、一時停止できる機能を持つことです。 つまり、ある時点で計算を一時停止し、後で再開することができます。 最良の部分は、非ブロッキングコードを作成する場合、プログラミングモデルは実際には変更されないため、非ブロックコードを作成することは、基本的にブロッキングコードを作成することと同じです。 2つの例を見てみましょう。

 fun sendRequest(): Int { /* do some heavy work */ return 1; }

この例は、ブロッキング機能を示しています。 このコードスニペットを実行するスレッドは、関数が戻るまで他の作業を行いません。APIまたはデータベース呼び出しの場合、数秒かかる可能性があります。 別のサービスを待っている間はスレッドをブロックしたくないので、この関数を非ブロック関数に変えましょう。

 suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }

この例は、メソッドを一時停止可能な非ブロッキング関数に変換する方法を示しています。 これは、簡単にするために、重い作業が10秒の単純なdelay()関数呼び出しである場合、実行中のスレッドはその時間他のタスクで作業を続け、10秒が経過した後に関数の実行を再開することを意味します。 1つのキーワードで実現された優れた非ブロッキングコード。

Ktorによる非同期サービス

REST APIの作成に関しては、組み込みサーバーの起動やリクエストの解析など、いくつかの追加の手順を実行する必要があります。もちろん、手動で実行する必要はありません。 JavaにはSpringBootがあり、これにより作業が非常に簡単になります。幸い、KotlinにはKtorと呼ばれるフレームワークがあります。 Ktorは、非同期サーバーを構築するためのWebフレームワークです。 そのウェブサイトが述べているように、Ktorは「使いやすく、楽しく、非同期です」。 さて、楽しみは主観的なものなので、それを証明したくはありませんが、使いやすく非同期であることが証明されたスニペットを見てみましょう。

 fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }

上記の例は、組み込みのTomcatサーバーで実行され、ポート8080でリッスンし、「Helloworld!」と非同期で応答する完全に機能するKotlinKtorサーバーを示しています。 リクエストを取得します。 これらすべてを10行未満のコードで実行できます。

Ktorは明らかにこれ以上のことを行うことができます。 Ktorのすべての機能を紹介するには独自の記事が必要ですが、とりわけ、ログインと認証が簡単になります。 Ktorがサーバー側で実行できることと、それを構成する方法について詳しくは、こちらをご覧ください。

バックエンドでのKotlinのその他の利点

私が指摘したい最初の利点は、KotlinでJavaライブラリを使用できることです。私を信じてください。あなたの生活を楽にする、Java用のすばらしいサードパーティライブラリがたくさんあります。 仕事を完璧にこなすオープンソースのすぐに使えるライブラリがあるのに、なぜあなたはあなた自身の実装を書くのでしょうか? これらをKotlinで使用すると、問題なく機能します。

KotlinとKtorのもう1つの大きな利点は、使用できる広範なテストライブラリとフレームワークです。 JunitフレームワークはKotlinの魅力のように機能し、Ktorはこれに独自のテストライブラリを追加して、エンドツーエンドのテストと統合テストをすぐに作成できるようにします。 アプリケーション全体を実行し、ライブアプリケーションと同じようにリクエストを処理できるカスタムテストエンジンを使用できます。

結論

前に述べたように、私は主にJavaバックエンド開発者であり、いくつかのサーバー側アプリケーションとRESTAPIを背後に持っています。 私はJavaでのプログラミングが大好きですが、あらゆる仕事に最適で、あらゆる問題を解決できる最高の言語やフレームワークはないと思います。 私のアプローチは、できるだけ多くのツールに精通し、問題が発生したときに、その特定の問題を完璧に解決できる最適なツールを選択することです。

Kotlinサイトが述べているように、Kotlinの目的は一意ではありません。 代わりに、何十年にもわたる言語開発からインスピレーションとベストプラクティスを引き出しています。バックエンド開発に関しては、Kotlin、Coroutines、Ktorが素晴らしいトリオを作って仕事をしていると思います。 Kotlinとプログラミング言語としてのKotlinの有用性について詳しくは、こちらをご覧ください。