Spring 3分クッキング

初めましての投稿になります! Spring だいすきな 菊池 (Yoichi-KIKUCHI/yo1000) です!
社内では、Spring の導入・技術支援などを行っています。

Spring と聞くと、昔のイメージで重厚長大な設定ファイルをイメージしたりする方もいるかと思いますが、最近の Spring はそうではありません。

昨年末ごろから Spring Boot が話題を集めており、これまで Spring に触れてきていた方も、そうでない方にも、たいへん好評なようです。

今回はそんな Spring Boot を使用した、3分クッキングをやってみようと思います。
プロジェクト初期構成に時間のかかっていた古き Spring のイメージ払拭となるのか、乞うご期待。

執筆環境

  • Oracle JDK 1.8.0_45
  • Maven 3.3.3

実践

早速試してみます。

今回は、リクエストに応じた JSON レスポンスを返却する、非常にシンプルな REST エンドポイントを作成してみたいと思います。

プロジェクトのセットアップ

はじめにプロジェクトの雛形を入手します。

Spring Boot で初期構成の作成はかなり簡単になりましたが、それでも雛形があるなら使ったほうがもっとラク、ということで。

Spring Initializr へアクセスし、
プロジェクト情報の入力と、必要なコンポーネント (今回は [Web]) にチェックを入れたら、
[Generate Project] をクリックして、プロジェクトをダウンロードします。

SpringInitializr

エンドポイントの作成

ダウンロードしたプロジェクトを展開して、 好きなエディタで以下のように編集します。

1
$ vi demo/src/main/java/demo/DemoApplication.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
@RestController
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    @RequestMapping("demo/{arg1}")
    public Map<String, Object> getIndex(@PathVariable String arg1,
                                        @RequestParam(required = false) String arg2) {
        Map<String, Object> map = new HashMap<>();
        map.put("arg1", arg1);
        map.put("arg2", arg2);
        return map;
    }
}

内容をすこしだけ解説します。

  • @RestController

コンポーネントが REST を取り扱うコントローラーとして、DI コンテナに登録されます。

  • @RequestMapping

URL とコントローラーメソッドを紐付けます。
引数に指定した URL パターンに合致したリクエストをこのメソッドに導きます。
{var} とすることで、URL 内に指定された文字を変数として受け取ることができます。

今回の例では、demo/{arg1} としているので、demo/123 のようなリクエストがあった場合、
メソッドの引数 @PathVariable String arg1"123" を受けます。

  • @PathVariable

先の説明にもある通り、URL 内に登場した変数を、メソッドの引数で受け取るためのアノテーションです。

  • @RequestParam

クエリパラメーターを、メソッドの引数で受け取るためのアノテーションです。

今回の例では、demo/123?arg2=abc のようなリクエストがあった場合、
メソッドの引数 @RequestParam(required = false) String arg2"abc" を受けます。

なお、required = false を指定しているため、URL での指定は任意となり、
パラメーターが指定されなかった場合、メソッドの引数には null が設定されます。

プロジェクトの実行

たったこれだけでエンドポイントの作成は完了です。

より詳細な設定を行いたい場合は、今回指定した他にも、様々な設定が用意されているので、
これらを活用していくことになりますが、まずは動かしてみましょう。

以下のコマンドで、依存関係解決とプロジェクトの実行が行われます。

1
2
$ cd demo
$ mvn spring-boot:run

SpringBootRun

実行結果の確認

では早速、ブラウザなどでアクセスして、レスポンスを確認してみましょう。

レスポンスを確認

良さそうですね!!

なお、今回の例では最小構成でどれだけ簡単に始められるかを紹介したため、DemoApplication クラスにコントローラーを実装していますが、
本来このクラスにはアプリケーションの起動構成等を定義していくため、実際のプロジェクトではコントローラークラスは別途作成するようにしてください。もちろんパッケージも適切に分けるようにしてください。

個人的にオススメなパッケージ例も残しておきます。(@ 付き表記はコンポーネントに対応する Spring アノテーション。括弧内は担当する責務。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
src.main.java.{rootPackage}/
  component/
    advice/
  configuration/
    properties/
      {ConfigName}Properties.java ....... (Configuration properties)
    {ConfigName}Configuration.java ...... @Configuration (Configuration)
  controller/
    api/
      {FeatureName}Resource.java ........ @RestController (REST Controller)
    page/
      {FeatureName}Controller.java ...... @Controller (Controller)
  domain/
    model/
    repository/
      jdbc/
        {DataName}JdbcRepository.java ... @Repository (Persister)
      {DataName}Respository.java ........ (Persister interface)
    service/
      {FeatureName}Service.java ......... @Service (Service)
  util/
  {ProjectName}Application.java ......... @SpringBootApplication (App launcher)

まとめ

以上のように現在の Spring では、非常にパワフルな機能群の提供だけでなく、
導入にかかるコストも小さく抑えられるよう、様々な工夫が施されています。

このように、Spring は現在も進化を続けており、執筆時点の最新リリースは 4.2.1 (Boot は、1.2.6) ですが、すでに Spring Framework 5 も計画が始まっています。
(Feedback welcome: Spring 5 system requirements)

老舗フレームワークでありながら、錆びないようしっかりとメンテナンスが継続されている、実績と展望の期待できるフレームワークに成長した Spring。

今後の動きにも注目です!

付録

ほんとうに3分クッキングが可能なのかどうか、実際に試してみました。

その結果は…