SpringFrameworkから始めるSpringBoot Part.0

SpringBootってよく分からない?

みなさん、SpringBoot、つかってますか?

使ったことがない方へ。 最低限Getting Started Guideをいくつかやったことがないと、この先は読み進めても面白くないです。今すぐコーヒーを淹れて、1時間ほどSpringの世界を楽しんできてください。それから次の行を読んでください。

SpringBootは簡単でシンプル?

さて、みなさんはSpringBootにどんなイメージをお持ちですか?私は仕事で使ってみるまで、 開発に必要な機能が全部揃ってて簡単に始められてシンプルでJava開発ではよく聞くWebフレームワークみたいなイメージでした。

@SpringBootApplication // こう書いとけばSpringBootだってことになる
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
@Controller // こう書いとけばリクエストを受け付けるクラスになる
public class UserController {
    @RequestMapping("/user/hoge") // こう書いとけばこのURLにリクエストが来た時このクラスが動く
    public String index() {
        return "user/index"; // こう書いとけばあるディレクトリのHTMLファイルが勝手に呼び出される
    }
}

「こう書いとけば○○」って便利ー!シンプルですごいなー!って私は思ってました。

でもこれが通用するのはチュートリアルをやっている間だけでした。

HTMLの置き場を変えなければいけなくなったらどうしたらいいの? DB接続の方法を変えなければいけなくなったらどうしたらいいの? UTF-8以外の文字コードが使いたい時どうしたらいいの? どこにも何も書いてないのに変な挙動をする... etc...

その他すべての、便利でシンプルな方法では解決できない問題を、私は解決できませんでした。

どうやらSpringBootは、少なくとも簡単ではないようです。

SpringBootは巨大なブラックボックス

たったひとつのアノテーションをつければ期待どおりに動くSpringBootが、なぜ少し道から外れたことをしようとすると途端に手も足も出ない複雑さで牙を向くのでしょうか。

答えは歴史が知っています。SpringBootはもともとWeb開発専用ではないライブラリをいくつもくっつけて、それらを隠して簡単に使えるようにした巨大なブラックボックスなのです。

DIライブラリから始まった

詳しくて正確な歴史はここでは必要ないのでより詳しい方にお任せしますが、SpringBootの元となっているのは、SpringFrameworkというDI用ライブラリです。

みなさん、SpringBootを使ってて@Autowiredとか@Serviceとか書いたことありませんか?あれがDIで、あれこそがそもそもSpringFrameworkが担っていたものです。

その後、そのDIライブラリを元にしてWebフレームワークやバッチフレームワーク、そして今やSNS連携やクラウド、マイクロサービスにも対応するようになった巨大なライブラリ群が、Springなのです。

そしてSpringBootはこれらのうち基礎的なWebアプリ開発用フレームワークを簡単に使えるようにしたツールです。その中にはもちろんDIが入っており、DB接続部品が入っており、Web開発用ライブラリも入っています。

こうしてみると、SpringBootが巨大なブラックボックスであることが少しずつ分かってきます。SpringBootは、もともとWeb開発専用に作られたわけではないツールをたくさん内包しているのです。

だから、少し違うことをしようとすると私たちはSpringFrameworkの中身と向き合うことになります。これが私が感じていた複雑さの原因でした。

避けてはもったいない!

さて、SpringBootはどうやら必ず簡単というわけではなさそうです。 でもこれはとてもワクワクすることだと思いませんか? SpringBootが隠してくれていた複雑さをそっと紐解いて眺めることができれば、きっともっとSpringBootと仲良くなれることでしょう。 HTMLテンプレートのディレクトリを自由に変える方法を知っていれば、胸を張ってコードを書いてよく眠れるかもしれません。

それに、これはJavaでのWeb開発やSpringFramworkが時代と一緒に試行錯誤してきた成果を少しだけ垣間見るチャンスにもなりそうです。

だから、「こう書いとけば○○する」の一歩先へ進んでみましょう。

というか進んできました

半年ほど、たまたま仕事でSpringBootを使う機会があって、SpringBootを構成するライブラリ群を少しずつ眺めてきました。 諸先輩方に比べればたいしたことのない道程ではありますが、それは楽しい時間だったので、少し時間は経っていますが改めて記事におこしてみようと思います。

次回は、SpringFrameworkからはじめましょう。