まえがき
はじめまして、プロダクツ本部 プロダクツエンジニアグループ ビジネスアプリケーションチームのNTです。
私の業務の中で比較的多くの割合を占めるのが社内用のWebAPIの開発なのですが、メインで使用しているフレームワークであるSpringBootを用いたWebAPIの簡単な作り方について、触りだけですがざっくりと解説しようと思います。これまでもSpringBootを利用したWebAPIは数多く開発してきましたが、今の所フレームワーク起因の障害等は発生しておらずかなり安定して運用できていますので、WebAPIの開発等にオススメです。また、今回は開発言語にJavaを選んでいますが、Kotlinでの開発も可能な点が嬉しいですね。
SpringBootを使用する利点としては、大きく以下の項目が挙げられます。
- 膨大なSpring Frameworkのプロジェクトを比較的かんたんに利用できる
- 本番運用に耐えるTomcatを内蔵しているので、単体で動作可能
- XMLファイルの記述が不要
もちろんメリットばかりではなくデメリットも存在しますが、JavaやKotlinのフレームワークの中では人気と言ってもいいぐらいには使用されていると思います。ビジネスアプリケーションチームのJavaで使用しているフレームワークは圧倒的にSpring系が多いので、SpringBootへの理解も短くて済むので、多くのプロジェクトで活用しています。
開発環境
- Eclipse 2020-03(pleiades plugin導入版)
- Java 11
- SpringBoot 2.7.3(型にMavenを使用、パッケージングはJar)
IDEはEclipseの他にもIntellij IDEAでも良いです、好みに合わせて。Javaのバージョンについては当時最新のLTSだった11を選択していますが、今であれば17が次期LTSになります。
EclipseのこのバージョンであればデフォルトでSpringBootの開発に必要な機能が揃っています、SpringBootのプロジェクトの作り方については探せば腐る程情報が見つけられますので、今回は割愛します。ちなみに、Eclipseの機能でもプロジェクトは作れますが、Spring Initializrという公式のツールを使ってもプロジェクトを作成できます。
まずは実行してみる
SpringBootプロジェクトの作成まで進んだという前提で、まずは正常にSpringBootのプロジェクトが動作するかをチェックしてみます。SpringBootの実行はプロジェクトを右クリック→実行の「Spring Boot アプリケーション」を選択すればコンソールが流れると思います。最終的にStarted~の文言で始まるログが流れてくれば正常に起動した証拠です。
この様にSpringBootでは初期プロジェクトにサンプルソースコードが含まれていますので、後はここから必要な機能を開発者が追加していくだけで済む様になっています。
WebAPIの作成
WebAPIの作成に入ります、SpringBootでは大きく分けて「Controllerクラス」「Serviceクラス」「Repositoryクラス」といったそれぞれの役目を担うクラスが存在しますが、今回は単純に定形的なレスポンスを返すだけのWebAPIになるので、Controllerクラスのみを作成してみます。
Controllerクラスを作成する
どんなアプリケーションでも、SpringBootではControllerクラスの作成は必須になります。Controllerクラスは外部からのHTTPリクエストを一番最初に処理するものなので、WebアプリでもWebAPIでも必ず作成する必要があります。試しにHTTP GETリクエストで反応を返すControllerを作ってみます。
GET HTTPリクエストパターン
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("get")
public String get() {
return "get http request test";
}
}
controllerパッケージの下にDemoControllerクラスを作成し、/getにHTTP GETリクエストを渡すと「get http request test」と返すだけのコードになります。たったの13行しか書いてないですが、これだけでも超簡単なWebAPIが完成しました。
まず、Controllerクラスには@RestControllerアノテーションを付与し、GET HTTPリクエストを受け取る場合は該当のメソッドに大して@GetMappingアノテーションで受け付けるリクエストURLの記述をします。SpringBootではこの様にアノテーションを多用する場面が多く、そのおかげで少ないコード量で機能を実装することが可能です。パラメータを受け取る場合は@RequestParamアノテーションを引数に指定し、パラメータが無い場合のデフォルト値も指定可能です。
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("get")
public String get(@RequestParam(value = "name", defaultValue = "hoge") String name) {
return name;
}
}
この例だと、パラメータ「name」を取得しレスポンスとしてそのまま返却しますが、もしパラメータの指定が無かった場合は「hoge」がデフォルト値として設定されます。
POST HTTPリクエストパターン
POST HTTPリクエストの場合は@RequestMappingアノテーションを使用します、よく社内で使用するjsonフォーマットのPOST HTTPリクエストを処理する場合のControllerクラスの書き方は以下の様になります。
package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.model.Sample;
@RestController
public class DemoController {
@RequestMapping("post")
public String post(@RequestBody Sample sample) {
return sample.getName();
}
}
引数では@RequestBodyアノテーションを指定していますが、この場合jsonフォーマットのリクエストをSampleモデルに自動的にバインドしてくれます。POSTを投げる際にContent-Typeがapplication/jsonでないとエラーになります。
Sampleモデルは今回modelパッケージの下に作成しました、またSpringBootとは関係ないですがGetterとSetterは書くのが面倒なのでいつもLombokを使っています。Lombokは@Getterと@Setterアノテーションを記述するだけで自動的にGetterとSetterを追加してくれる便利なライブラリです。
package com.example.demo.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class Sample {
@JsonProperty("name")
private String name;
}
nameプロパティには@JsonPropertyを付与していますが、今回の様なjson内のパラメータの名前と完全一致するパターンでは必要ありません。例えばfirstNameの様なプロパティがあるとして、jsonではfirst_nameという名前でパラメータを指示する場合には@JsonProperty("first_name")を指定することで完全一致でなくても値のバインドが可能になります。
jarファイルを作成する
今回作成したプロジェクトを一つのjarファイルにまとめて出力してみます。今回はMavenを使用しているので、プロジェクトを右クリック→実行の「Maven ビルド」を選択し、ゴールに「clean package」を入力して実行すればtargetフォルダの中にjarファイルが作成されます。簡単ですね。
jarファイルにはtomcatが内包されてますので、そのままjarコマンドで実行すればすぐにWebAPIとして動作し始めます。
java -jar api-demo-0.0.1-SNAPSHOT.jar
ただし、本番のサービスで運用する場合にはサービスとして登録してデーモン実行する方法が推奨されています。nohupで直接jarを実行するのはテストまでにとどめておいた方が良さそうです。
SpringBootなら簡単にWebAPIが作れた
今回作成したWebAPIは特に何もしないで値を返すだけでしたが、数十分あればこれぐらいのものであればサクッと作れてしまいます。初期構築もそうですが、基本的にはアノテーションを駆使してコードの記述量を減らしているので、無駄なコードも減りますし何よりこの記述方法に慣れるとコードの可読性も上がるので保守もしやすいといったメリットもあります。
社内では様々な部分でマイクロサービス化を進めていますが、これよりも何倍も複雑なロジックで構成されたWebAPIも開発され実運用に投入されています。正直SpringBootだからできたものもありましたし、個人的にはSpringBoot様々です。