はじめに
第1章 Kotlinとは
第2章 入門!サーバーサイドKotlin
第3章 実践
付録A DBをdockerで動かしたい!
付録B ローカルにMySQLをインストールする
あとがき
この本を手に取っていただきどうもありがとうございます。著者のFORTE(フォルテ)です。今回は「実践!入門!サーバーサイドKotlin」という技術書を書きました。この本は12年以上レガシーな環境で開発してきた筆者が、モダンな開発を勉強せねば!と思い、そして勉強するなら技術書を書くか!と思って書いたものです。技術書を書くのが目的か、勉強が目的か自分でもよくわからないのですが、両方とも大事なポイントなのは確かです。
筆者がモダンな開発を学ぶ対象としてサーバーサイドKotlinを選んだのは次の理由からです。
・AndroidでKotlinを使いたい
・ずっとJavaをやってきたので互換性が高そう
・ここらでWebのモダンなバックエンド開発を経験したい
・フレームワークを使用したWeb開発を経験したい
筆者はITエンジニア歴12年以上のうち、ほぼ10年間JavaでWebアプリケーションを開発してきました。このことから、まったく新しい言語ではなく、Java互換の言語の方がハードルが低いと考えました。
さらに私はOSSなどで一般に公開されているフレームワークを使用した開発経験が一度もありません。Servletか、PHPの独自フレームワークでの開発しか経験がありません。そのため、フレームワークを用いた(自分にとっては)モダンなWeb開発が学びたいと思ったとき、需要にぴったりであると思ったのがサーバーサイドKotlinを選んだ理由です。
今回この本を書くにあたり、ペルソナを自分自身としました。つまりずっとJavaのレガシーな環境にいたITエンジニア向けに書く、ということです。そんなITエンジニアでもこの本を読めばサーバーサイドKotlinが書ける、フレームワークを使った開発経験を積むことができることを目標に書き始めました。具体的には次のような人におすすめの本となっています。
・Kotlinをやってみたい
・Javaを書いたことあるけどそれ以外のJVM言語をしらない
・OSSのフレームワークを使ってWebアプリを書いたことが無い
・ずっとレガシーなWeb開発環境にいた(と思っている)
・モダンな開発の勉強したいけど何をやっていいかわからない
・業務ではずっとWindowsだったからMacで例を出されても困る
・○○やってます(例:Rails、Spring Boot、React……)と言いたいが、今は言えない
前述したとおり、私自身が経験したことがない言語、経験したことがないフレームワーク(フレームワークの使用自体が初めてのようなもの!)という状況で本が書ければ、きっとこの本を読む"私"のようなエンジニアにも分かりやすく、またきっと自信になると思うのです。同じ様にレガシーな状況にいて少しでもモダンな開発がしたい人に届けば良いなと思っています。
この本は、JavaなどでWeb開発の経験がある人向けに、サーバーサイドKotlinに入門して実践してみる本です。この本を読み終わると次のような状態になります。
・Kotlinがなんだかわかる
・サーバーサイドKotlinがなんだかわかる
・サーバーサイドKotlinの開発環境を作れる
・サーバーサイドKotlinで掲示板を作成した
・掲示板を作成した際に以下の開発を経験した
─Webページ表示
─DB操作
─テスト
あなたが本書を読むことで、より早く簡単にサーバーサイドKotlinに入門し実践していただけたら、さらに業務や趣味の開発に学べたことを生かしていただけたら、こんなに幸せなことはありません。
この本は前提として「JavaなどでWeb開発の経験がある人向け」となっています。そのため、次のようにWeb開発の基礎(HTTPとは?リクエストとは?など)やJavaの基礎については解説しません。解説しないことについては次の一覧をご覧ください。
・Web開発の基礎
・Javaの基礎
・Kotlinの文法
・フレームワークの詳細な解説
Kotlinについては極力解説を入れていきますが、すべての文法を説明しようとするとそれだけで本が一冊できてしまいます。クラス定義やメソッド定義くらいであれば、なんとなく見ただけでわかると思いますので、Javaと大きく変わっている点や特筆すべき点のみ本文にて補足していきます。もし不明な点があればぜひ公式サイト基本構文などをご覧ください。
https://Kotlinlang.org/docs/reference/basic-syntax.html
もしフレームワークの仕組みなど「これ気になるなー」と思うことがあれば、ぜひ調べてみましょう。それが、新しいことを勉強する良いきっかけになります。
この本は、筆者がサーバーサイドKotlinを学ぶ中で疑問に思ったことや調べたことを、技術書の形でアウトプットしたものです。そのため、Kotlinとはなにか?その歴史は?みたいな基礎的なところから、実際に開発環境を用意してWebアプリケーションを開発するまでをまとめた形式になっています。もしあなたが「Kotlinは知ってるから、開発環境から知りたい!」と思っていたら第2章「入門!サーバーサイドKotlin」のページからご覧ください。または「だいたい分かるけど勉強するのに適したお題がほしい!」と思っていたら第3章「実践」からご覧ください。もちろんKotlinに初挑戦であれば最初から全部読んでいただいても大丈夫です。
本書はこの本の通りにやれば動くものができる、というところを目指して書かれています。この本を読めば理屈や仕組みがすべて理解できるようには書かれていません。この本を入り口として、その更に奥にあることに興味を持っていただけたら幸いです。
このように、ご自身の需要に合わせて本書をご活用いただければ幸いです。必ずしもすべて読む必要はありません。もし必要になったら前のページに戻ればよいのです。ぜひご自身のペースに合わせて、サーバーサイドKotlinに入門して実践してみてください。
本書に記載する内容は筆者の所属する組織の公式見解ではありません。また、本書は可能な限り正確を期すように努めていますが、筆者がその内容を保証するものではありません。そのため、本書の記載内容に基づいた読者の行為、及び読者が被った損害について筆者はなんら責任を負うものではありません。
本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。
本書籍は、技術系同人誌即売会「技術書典7」で頒布されたものを底本としています。
まずはKotlinについて解説していきましょう。KotlinはJetBrains社が開発したJVM、Android、JavaScript、NativeがターゲットのOSS静的型付けプログラミング言語です。ここでNativeとはプラットフォームネイティブのことを指し、例えばiOSやMacOS、Linux、Windowsなどの各OSで動作するネイティブアプリの開発向けである、ということです。本書はWebアプリケーションの開発に特化した本ですが、Kotlinがこれだけ様々な分野で活用できるのでKotlinが書けると様々な場面で役に立つのがわかります。
KotlinはOSS静的型付けプログラミング言語です。OSSであるため無料で提供され、Apache 2.0ライセンスの下で開発されておりソースコードはGitHubで入手できます。静的型付け言語であるため、プログラムの実行前に型が解決される言語です。しかし、Javaよりもより洗練された静的型付け言語となっています。
またKotlinはオブジェクト指向のみならず、関数型プログラミングの特徴も含んでいます。いわゆる高階関数、関数型、ラムダといったような機能のことです。
Kotlinの開発がスタートしたのは2010年です。そして2011年7月にJetBrains社のウェブサイトでKotlinを開発していることを公表しました。1当時、モダンJavaと呼ばれるJavaの後継言語はScalaが有名でしたが、JetBrainsの開発リーダーであるDmitry Jemerov氏はScalaの欠点は非常に遅いコンパイルだと言っていました。また公表した記事でJavaは下位互換性の問題から修正が不可能であるか非常に難しい問題があると書かれています。さらに他の言語はJetBrainsが求める機能セットに対する要件を満たしていない問題があるとも言っています。
そのためJetBrainsは、KotlinをJavaより安全にすること、nullポインタ対策やJavaより簡潔なこと、型を静的にチェックすることを望んでいました。もうひとつ、最も成熟した競争相手であるScalaよりもシンプルにすることを目指したそうです。その後、2012年2月にJetBrainsはApache 2.0ライセンスの下でKotlinをオープンソース化しました。
Kotlinのバージョン1.0は2016年2月15日にリリースされました。JetBrainsはこのバージョンから長期の後方互換性を約束しています。さらに翌年のGoogle I/O 2017でGoogleはAndroidの公式言語としてKotlinをサポートすることを表明しました。その後バージョン1.2ではJVMとJavaScript間でコードを共有する機能を、バージョン1.3ではコルーチンが追加されました。2019年の現在、多くのAndroidの開発者がKotlinを使用して開発しています。実際、Android KaigiというAndroidの国内カンファレンスではほぼすべてのセッションのサンプルコードがKotlinになっています。
このようにAndroidで活用されている事例が目立っていますが、JVMで動作するモダンJava言語としてWebサービスのバックエンド側としての事例も増えています。開発元であるJetBrainsではライセンス販売などを管理するJetBrainsアカウントでは100%Kotlinで書かれており、2015年から運用されていて問題はまったく無いそうです。またCordaというオープンソースの分散元帳プラットフォームでも採用されています。信頼性が重要なBlockchain技術にも使用されている実績があります。
Kotlinの開発に携わっているAndrey Breslavによると「JavaがインドネシアのJava島にちなんで命名されたのであれば島にちなんで命名することに決めた」そうです。そのため、ロシアのサンクトペテルブルクの近くにあるコトリン島から名付けられました。ここはフィンランドに近い場所でもあります。
ちなみにJavaは恐らく島ではなくコーヒーにちなんで名付けられたようです。
Kotlinの言語としての特徴を説明していきます。わかりやすく説明するため、Javaと比較して説明していきます。
KotlinはJavaと比べて様々なことがシンプルに書けます。いくつかKotlinとJavaのコードの例を挙げて比べてみましょう。
例えばIDや名称などを持つ単純なデータクラスであれば以下のような実装になります。
1: data class HogeData(val id: Integer, val name: String, val memo: String)
同じコードをJavaで表現すると以下のようになります。
1: public class HogeData {
2: public Integer id;
3: public String name;
4: public String memo;
5:
6: private Integer getId() { return id; }
7:
8: private void setId(Integer id) { this.id = id; }
9:
10: private String getName() { return name; }
11:
12: private void setName(String name) { this.name = name; }
13:
14: private String getMemo() { return memo; }
15:
16: private void setMemo(String memo) { this.memo = memo; }
17: }
Javaの場合、GetterとSetterが非常に長いのが分かります。IDEで自動生成できるのでそこまで手間ではないですが、それでもKotlinではGetterとSetterの生成が不要なのはメリットとなります。こういった手間の軽減が積み重なりが開発の楽さや開発のスピードに繋がってきます。
次にラムダ式を使ってリストをフィルタリングします。次のコードは数値リストから0以上の値を取り出すコードです。
1: val list = listOf(-3, -2, -1, 0, 1, 2, 3)
2:
3: // 1, 2, 3
4: val positiveNumbers = list.filter { it > 0 }
同様にJavaで表現すると以下のようになります。
1: List<int> list = Arrays.asList(-3, -2, -1, 0, 1, 2, 3);
2:
3: // 1, 2, 3
4: List<int> positiveNumbers = list.stream()
5: .filter(o -> o > 0)
6: .collect( Collectors.toList() );
こちらはStream Apiを使用しているため、Stream Api未使用のコードと比べてだいぶ短くなっていますが、それでもKotlinに比べれば文字数や行数も多くなっています。特に文字数や呼び出すメソッドの数が少ないとIDEで補完する操作が少なくなりますし、単純に手を動かす労力が少なくなるので簡潔であることのメリットは非常に大きいものがあります。
Kotlinでシングルトンパターンを実装する場合は以下の通りです。
1: object ThisIsASingleton {
2: val companyName: String = "JetBrains"
3: }
Javaでは以下のようになります。
1: public class ThisIsASingleton {
2: private static ThisIsASingleton thisIsASingleton;
3: public String companyName = "JetBrains";
4:
5: private ThisIsASingleton() {
6:
7: }
8:
9: public static ThisIsASingleton getInstance() {
10: if (thisIsASingleton == null) {
11: thisIsASingleton = new ThisIsASingleton();
12: }
13:
14: return thisIsASingleton;
15: }
16: }
Kotlinでは「object」を指定することで生成されるJavaコードが、Javaのシングルトン生成処理と同じ内容になります。そのため、Kotlinでは「object」を指定するだけでシングルトンが実現できるようになっています。
nullチェックやインスタンスの宣言、保持などのコードはどこでも同じ実装になるので省略して実装できるのがありがたいです。このあたりが「簡潔」という特徴を感じられる部分でしょう。
KotlinはJavaに比べて安全な実装が可能です。ここで言う「安全」とは不具合の原因になるようなコードを書きづらい、実行時例外を起こしにくいコードを書きやすくなる、システムを運用していて安全なシステムを構築しやすい、ということです。Kotlinが安全である特徴を見ていきましょう。
Javaでシステムを開発して運用した際に悩むことの代表格が、NullPointerExceptionsです。これは処理しようとしたオブジェクトがNullだったときに発生する例外ですが、意図しないタイミングでオブジェクトが初期化されたり、異常時にnullがリターンされて発生することが多い例外です。
この例外に対するKotlinの対応を見ていきましょう。
1: var output: String // Null非許可
2:
3: output = null // コンパイルエラーとなる
Kotlinの場合、同じStringでも実際には2種類の型が存在します。それはNull許可のStringとNull非許可のStringの2種類です。そのままStringとして実装するとNull非許可になるので、nullを代入しようとするとコンパイルエラーとなります。そのため、Nullが入りそうな実装をコンパイル段階で気づくことができます。これによって知らずのうちにNullPointerExceptionsが起こりそうな実装を防ぐことができます。
さらにKotlinではNull許可の型を使用している場合でも安全ではない実装をコンパイル段階で検知してくれます。
1: val name: String? = null // Null許可
2:
3: println(name.length()) // コンパイルエラーとなる
Javaの場合、こういった実装をしてもコンパイルが通り実行できてしまいます。IDEによっては警告を出してくれるので気づく可能性がありますが、コンパイルは通ってしまうので見過ごしてしまうことはあるでしょう。Kotlinの場合はコンパイルが通らないので、こういった危険性がプロダクトコードとして本番環境に入り込んでしまうことはありません。こういった安全性もKotlinの特徴となっています。
KotlinはJVMで動作する既存のライブラリを使用することができます。そのため、新しい言語を導入するといっても既存のライブラリ資産がそのまま流用できるのが非常に楽になります。特にJava自体が歴史が長い言語なので、フリーのライブラリから、自分たちが作成したライブラリをそのまま使用できるのは大きなメリットになります。
開発元がIDEを開発しているJetBrainsなので、IntelliJを使用することでKotlinの開発をスムーズに始める事ができます。なにより言語の開発元が提供しているIDEなので、そのサポート具合はまさに100%といって良いでしょう。Kotlinは他のIDEでもサポートしていますが、公式サポートという安心感は大きいです。
本書のテーマであるサーバーサイドKotlinを代表としたJVM環境での開発です。100%Java互換であるKotlinは当然JVMでの開発に適しています。そしてJVMの主戦場のひとつであるサーバーサイドでKotlinを使用することができます。Kotlinは既存のJavaで書かれた資産を流用することができます。またJavaで開発されたプロジェクトの一部分、例えば古い部分はJavaのまま、これから開発する新しい機能だけをKotlinに置き換えることも可能です。Kotlin自体、Javaからの移行がしやすく古いシステムを良くしていく手助けになります。
Kotlinと聞いて真っ先に思い浮かべる開発シーンはAndroidアプリの開発だと思います。特にGoogleが公式に開発言語として公認していることもあり、最も有名だと言っても過言ではないでしょう。さらにGoogle I/O 2019では、今後のAndroid開発はKotlinファーストになるでしょうという発表を行っています。AndroidアプリでKotlinが正式にサポートされたのは2017年ですが、たった2年でプロのAndroid開発者の50%がKotlinを使用し、Stack OverflowやGitHubでも人気の言語のひとつとなっています。筆者の周りのAndroidエンジニアでもコミュニティでも、Kotlinを使用しているのが当たり前になっていると感じています。Androidアプリ開発では今後ますますKotlinの利用が加速していくことが予想されます。
意外にもKotlinで書いたコードをJavaScriptに変換することでKotlinでJavaScriptを書く方式がサポートされています。フロントエンドでDOMの処理に使用したり、WebGLなどのグラフィック処理に使用できます。さらにNode.jsなどのサーバーサイドJSとの連携にも利用可能です。特にReactとの連携のために、kotlin-reactなどのラッパーが提供されています。また初期のプレビュー版ではありますが、ビルド構成なしでKotlinでReactアプリを開発可能なcreate-react-kotlin-appもあります。インストールすればコマンド一発でアプリの構築が可能です。環境構築に煩わされずに開発に集中できます。
仮想マシンが望ましくないまたは不可能な組込機器やiOS向けなどのプラットフォーム用にコンパイルすることができます。これはKotlin/Nativeとして提供されています。Kotlin/NativeはC/C++用の静的、動的ライブラリ、SwiftやObjective-C用のAppleフレームワークを作成可能です。またKotlin/Nativeはそれらの環境の既存ライブラリを利用可能にするための相互運用性をサポートしているため、Kotlinで開発しつつ既存のライブラリ資産も利用可能です。ネイティブはその環境でサポートされている言語で開発できればベストかもしれませんが、それぞれの環境用にプログラマを雇用するのがベストとは限りません。Kotlinですべての環境に価値を提供するという方式によって取れる選択肢が広がり、より柔軟な対応が可能となります。
Kotlinは関数型プログラミングの機能として高階関数、関数型、ラムダなどをサポートしています。本書の内容的に使用する機会がなかったので、今回は細かく説明してません。しかし、Kotlinで実装されたフレームワークKtorやKotlin/Nativeでは多用されています。理解して使いこなせば非常に便利なのが伺いしれます。
Kotlin/Everywhereとは開発者、Kotlinユーザーグループ、GDG(Google Developer Group)などを対象としたコミュニティ主導のイベントです。Kotlinとそのエコシステムについて学びたい方、知識を共有したい方、Kotlinをテーマとしたイベントを主催したい方など、誰でも参加できるようです。開催は世界で行われます。日本でも5月に大分で開催されました。
このようにAndroidを開発しているGoogleもサポートしているのも特徴のひとつと言えるでしょう。これからますます盛り上がっていくと思われます。
Kotlin/Everywhereのページ(英語)
https://events.withgoogle.com/kotlin-everywhere/
Kotlinユーザーグループは日本にもあります。「日本Kotlinユーザグループ」という名前で活動していて、頭文字を取ってJKUGと呼ばれています(Japan Kotlin User Group)。私は先日、JKUGによって開催されたKotlin Fest 2019に参加してきましたが大変な盛り上がりでした。Kotlinの開発に参加しているエンジニアをお呼びしたり、Android、サーバーサイド、Native、JSと様々な環境でのKotlinに関する発表がありました。
大変な賑わいだったので、世界に負けず劣らず日本でもこれからKotlinが盛り上がっていくことが確信できました!
JKUGのページ
Kotlin Koansは公式から提供されているKotlinの構文に慣れるためのチュートリアルです(現在は英語のみ)。このチュートリアルはオンラインで受けることができ、ローカルに開発環境を必要としません。チュートリアルは失敗したテストが通るようにKotlinコードを修正する形になっています。また参考として公式ドキュメントへのリンクが付属しているため、勉強しながら進めることができます。
もしローカルの環境で実施したい場合は「EduToolsプラグイン」をインストールすることで、IntelliJ IDEAまたはAndroid Studioで実施可能です。
英語しかないのでハードルが高いと思われるかもしれませんが、私がいくつか解いてみた感じではブラウザーの翻訳機能とググることで普通に解けました。興味がある方はぜひチャレンジしてみてください。おすすめです。
Kotlin Koans(英語)