Nobezawa Takuro

延澤 拓郎(のべざわ たくろう)
1989年生まれ。

© All rights reserved.

Spring BootとKotlin

Spring BootとKotlinを勉強してから1ヶ月たったので感想を書いてみる。
そもそもSpring Bootを勉強した理由はサーバサイドで何か作りたい時に今は何で作るのが良いのだろうかと考えた結果こうなった。

KotlinとSpring Framework

そもそもSpring BootをやりたいというよりもKotlinでサーバサイドを書いてみたかった。理由としては現在は主に書いているSwiftの言語仕様と近く、またAndroidの正式な言語となり伸びがすごい。 個人的にはScalaの方が言語としては好きなのだが、自分がフリーランスという立場から考えるとKotlinの方が仕事として親和性が高いと感じている。

その中でKotlinのサーバサイドのフレームワークの候補としてはメジャーなのはKtorとSpring Framework。 KtorはKotlin純正で書かれているが、Springの方はJavaで書かれていて5.0からKotlinに対応したみたい。熟慮した結果Springをやり始めたのだが、理由としてはKtorであれば必要な時に勉強すればなんとかなりそうなので、別にわざわざ時間を取ってまでやる必要はないと感じたからだ。

またSpringのサンプルコードはJavaが多いので読めることが暗黙的に必要となってくるみたい。 実際自分もSpringを勉強中にJavaのコードを書いたのだが、どうしても普段はSwiftを書いているのもあって冗長なコードやnull判定がだるく感じた。

Spring FrameworkとSpring Bootの関係

勉強するまでこの関係性がよく知らなかった。結論から言うとSpring Frameworkを動かすための初期設定をSpring Bootでは予め自動で設定してくれていること。 つまり全く別のフレームワークということではなくて、Spring BootはSpring Frameworkのラッパー的なフレームワークということなので、Spring Bootで凝ったことをしようするとSpring Frameworkの知識が必要になってくる(遅かれ早かれ必要にはなりそう)

なので理想的な勉強というとSpring Frameworkを勉強した後にSpring Bootをやるのが正しいのだが、それだと初学者のモチベーションが続かないのでSpring Bootからとりあえずやってしまうのが個人的には良い。

Spring Frameworkの印象

自分はRailsに代表されるような設定よりも規約のフレームワークをよく使ってきたので少し新鮮だった。しいて言うならPHPのフレームワークであるFuel PHPに経験上似ている。 フレームワークのコンポーネントは疎結合で作られており、その疎結合を実現しているのがSpringのDIコンテナである。 DIコンテナはつまりSpring Frameworkの根幹であるため、ここの知識が無いと使うのがキツい。

他のフレームワークでDIコンテナを使おうとすると後からDIコンテナのライブラリを導入することが多いのだがSpring Frameworkでは使用が必須になっているので避けて通ることは難しい。 逆にWebプログラミングで必須となるRouterやControllerへのDispatchがコンポーネントとして提供されているので、Web以外の目的でも使うことができる。

そして、印象的にはとにかくアノテーションをフル活用している。そのため、アノテーションを付与することによってどのような機能が追加されたのかある程度経験者でないと分かりづらい。記述を少なくさせることができる反面、アノテーションに関しては完全に覚えゲーである。 Railsがよくメタプログラミングしていて実装が分かりづらいという批判もあるが、この辺はSpringも大概な気がした。

それはともかくモジュールをとにかく疎結合にすることを念頭に作られているので、このレールに乗っていればテストは書きやすそう。

WebFluxの導入された

バージョン5.0から導入されたリアクティブかつノンブロッキング対応しているSpringのWebフレームワーク。既存のSpring Web MVCと同じ目的だけど機能や書き方が全然違うフレームワーク。 リアクティブはとか意識高いみたいな風潮もあるが、ここ何年もフロントでリアクティブで実装することが多かったのでそこは経験が活きている。

一応、RxJavaでも書けるらしいがPivotalが提供しているReactorというライブラリでReactive Streamを書くのがデフォルト。Kotlinでは1.3からコルーチンが導入されたので、コルーチンベースで書くことも可能らしい。ただ、少しやった感じだと全くリアクティブプログラミングの経験がないとコルーチンベースでも厳しそうな気がした。

別にリアクティブで書かなくてもSpring Web MVCでいいじゃんと思うかもしれないが、マルチスレッドで並行性を担保するのはかなり経験上難しいと思っている。特にチーム開発でマルチスレッドを使った排他制限を管理するのが難しく自分もバグを埋め込んだことがある。 そのためActor・コルーチン・Reactive Streamの土台の上で並行性を伴うプログラミングは解決する方が良いと考えている。

反対にマルチスレッドではなくブロッキングを使ったプログラミングでいいじゃんとなるが、その辺に関してはあんまり自分がやる意味が無いような気がしている。 Springのブロッキングで普通に書いている人なんて沢山いるのでわざわざ自分がやる必要が無い。

そういう訳でWebFluxが導入されたことが勉強する大きなキッカケになった。

まとめ

そういう訳で暇な時間を見つけて勉強したりしている。やはり複数人で比較的大規模なサービスを作るのであれば静的言語の方が安心して書ける。ただ、個人的には静的・動的のどちらが良いという話はあまり興味がなく、良い書き方を強制される言語の方がコミュニケーションコストも含めてコスパが良いと思うが 現実はあまりそういう兆候はない。

とりあえずRailsベースのフレームワークしか経験無い人には新鮮なのでオススメ。