Spring Boot入門
Spring Bootで何が作れるのか
このレッスンでは、Spring Boot がどんな道具なのか、Spring Framework とどういう関係にあるのか、そしてこのコースをどう進めていくのかを掴みます。
Spring Boot は「Java で Web サーバーを作るための土台」です
Java でユーザー登録の API を作る場面を思い浮かべてください。ブラウザやスマートフォンのアプリから POST /users というリクエストが飛んできて、送られてきた JSON を読み、名前が空でないかを確かめ、データベースに保存し、201 Created と保存結果の JSON を返す。やることはこれだけです。
ところが、これを何の道具もなしに書こうとすると、本題に入る前にやることが山ほど出てきます。TCP のポートを開いて接続を待ち受け、届いたバイト列を HTTP のリクエストとして解釈し、リクエストラインからメソッドとパスを取り出し、ヘッダを読み、ボディの JSON を Java のオブジェクトに変換し、URL に応じてどのコードを呼ぶか判断し、返す側でも JSON に直してヘッダを組み立てて書き戻す。しかも同時に何百人がアクセスしてもさばけるようにスレッドを管理する。
Spring Boot はこの「本題ではない部分」をまるごと肩代わりしてくれる土台です。開発者が書くのは、次のような数行だけになります。
Java
@RestController
public class UserController {
@PostMapping("/users")
public User create(@RequestBody @Valid UserRequest request) {
return userService.register(request.name(), request.email());
}
}ポートを開く処理も、HTTP を解析する処理も、JSON と Java オブジェクトを行き来させる処理も、この中には一切書かれていません。それでもこのコードは動きます。書かれていない部分を全部やってくれるのがフレームワークだからです。
Spring Framework と Spring Boot の関係
名前が似ているので混同されがちですが、この 2 つは別物で、しかも重なっています。関係は次の通りです。
| 名前 | 何か |
|---|---|
| Spring Framework | DI コンテナ、Web MVC、トランザクション管理などの本体。2003 年から続く土台 |
| Spring Boot | Spring Framework を「設定なしですぐ動く」状態に整えて配る仕組み |
Spring Framework は非常に強力ですが、その分だけ設定項目が多く、かつては動かすまでに XML の設定ファイルを何百行も書く必要がありました。どのライブラリのどのバージョンを組み合わせるかも自分で決める必要があり、組み合わせを間違えると起動すらしませんでした。
Spring Boot はここに 3 つの答えを持ち込みました。1 つめが スターター依存 です。spring-boot-starter-web を 1 行書けば、Web アプリに必要なライブラリ一式が、互いに噛み合うバージョンでまとめて入ります。2 つめが 自動設定 です。クラスパスに何が置かれているかを見て、Spring Boot が「Web ライブラリがあるなら Web サーバーを起動する設定をしておこう」と自分で判断します。3 つめが 組み込みサーバー です。かつては Tomcat という Web サーバーを別途インストールして、そこにアプリを配置していましたが、Spring Boot ではアプリ自身が Tomcat を内蔵しているので、ただの Java プログラムとして java -jar で起動します。
つまり Spring Boot は Spring Framework の置き換えではありません。Spring Framework を使いやすく包んだものです。このコースで学ぶ @Autowired や @Transactional は Spring Framework 由来の機能で、@SpringBootApplication や自動設定が Spring Boot の担当です。
Spring Boot で何が作れるのか
実務で最も多いのは、スマートフォンアプリやフロントエンドから呼ばれる REST API サーバー です。JSON を受け取り、データベースを読み書きし、JSON を返すという形で、このコースが主に扱うのもこれです。
それ以外にも、サーバー側で HTML を組み立てて返す従来型の Web アプリケーション、定期実行のバッチ処理、メッセージキューを読み続ける常駐プログラム、複数のサービスに分割したマイクロサービスの各サービスなど、幅広く使われます。日本の業務システム開発では Java と Spring Boot の組み合わせが定番になっており、求人でも最もよく見かける技術の 1 つです。
このコースの進め方について、正直にお伝えします
このコースには、はっきりさせておきたい制約があります。この学習環境では、Spring Boot のアプリケーションそのものを起動して実行することはできません。
理由は環境の作りにあります。ブラウザ上の演習は、Main クラスの static メソッドを 1 つ呼び出して、その 戻り値 を期待値と比べる、という単純な仕組みで採点しています。ここには Web サーバーもデータベースも、Spring の DI コンテナも存在しません。@RestController を書いても、それを読み取って動かしてくれる人がいないので、ただのコメントのような飾りになってしまいます。
そこでこのコースは、次の方針を取ります。
- Spring の書き方そのもの は、本文のコード例と選択式クイズで身につけます。アノテーションの意味、どこに何を書くか、Spring が何を判断しているかは、読んで確認します
- 演習では、Spring が裏側でやっている判断そのものを pure Java で書きます。たとえば「URL からどのメソッドを呼ぶか決める」「送られてきた値が正しいか検証する」「Java オブジェクトを JSON 相当の文字列に組み立てる」といった処理です
これは苦し紛れの代替ではなく、むしろ狙いのある構成です。フレームワークは便利ですが、便利すぎて「何が起きているのか分からないまま動いてしまう」という副作用があります。@GetMapping("/users/{id}") と書いたら URL が繋がる、それはなぜかと聞かれると答えられない。この状態はエラーが出た瞬間に手が止まります。
たとえば次のレッスンでは、"GET /users/12 HTTP/1.1" という文字列からメソッドとパスを取り出す関数を自分で書きます。これは Spring Boot が内蔵する Tomcat が毎リクエスト実際にやっている処理と同じことです。一度自分で書いておくと、@GetMapping という 1 行が「ルーティング表への登録」であることが実感として分かります。同じように、DI コンテナも自分で小さいものを作り、リクエスト検証も自分で書きます。
前提知識と、手元の環境について
Java の基本文法、つまり変数、if と for、メソッド、クラスとインターフェースが読み書きできることを前提にします。HTTP のメソッドとステータスコードの意味、SQL の単純な SELECT が読めることも想定しています。
ブラウザ上の演習だけでコースは完走できますが、余裕があれば手元に JDK 17 以上と IntelliJ IDEA などのエディタを用意し、本文で紹介する Spring Boot のコードを実際に動かしてみることを強くおすすめします。本文のコードは、コピーして動く形で書いていきます。
次のレッスンから、まずは「フレームワークが無かったらどれだけ大変なのか」を実際に手を動かして確かめていきます。