Spring Bootを使ったWebAPIの作成

2022/10/08に公開

Spring Bootを使ったWebAPIの作成

今回からSpringを使ったWebアプリ開発についての記事を書いていこうと思います。

まず初めにということで、Spring Bootを使って、簡単なWebAPIを1本作成します。
まずはこのWebAPIアプリをもとに開発フローを一通り実施してみたいと思います。

  • テストコードの作成
  • GitHubへのPUSH
  • AWS上のEC2へのデプロイ
  • ビルド/デプロイの自動化

ソースコード

本Blogで開発するソースコードはGitHubのPublic Repositoryで公開しています。
今回、開発するソースコードは以下を参照ください。

spring-boot-demo v1.0.0

要約

  • IntelliJ IDEAはインストールされていること前提
  • IntelliJ IDEAで新規プロジェクトの作成
  • Spring BootはInitilizerを使う
  • APIを追加
  • 動作確認
  • テストコードの作成
  • GitHubへPush

環境情報

筆者の環境は以下の通りです。

分類 環境
PC MacBook Air(M1, 2020)
OS macOS Monterey(バージョン12.3.1)
IDE IntelliJ IDEA 2022.2.2 (Community Edition)
JDK Amazon Corretto 17.0.4.1
Framework Spring Framework 5.3
Spring Boot Spring Boot 2.7.3

IntelliJ IDEAで始めるSpring Boot

前提条件

IntelliJ IDEAはインストールされているものとします。

IDEAプロジェクトの新規作成

新規にプロジェクトを作成します。

IntelliJ IDEAのFile -> New -> Projectから作成します。

空のプロジェクトを作成するために左メニューからはNew Projectを選択。
JDKはcorretto-17(Amazon Corretto version)を選択。

それ以外のNameやLocationは適宜任意のものを入力して問題ありません。

https://start.spring.io/

Spring Bootプロジェクトの新規作成

次にSpring Bootプロジェクトのスケルトンソースコードを作成していきます。

ここでは、spring initializerというWebサイトから必要な情報を入力するとソースコードを生成してzipでダウンロードできるサイトで生成します。

各パラメータは下記スクリーンショットの通り入力しました。

  • Spring Bootのバージョンは2022年10月時点の安定版2.7.4
  • Javaは最新の長期サポート(LTM)版の17
  • 依存関係には以下の二つ
    • Spring Boot Dev Tools - 何かと使用するため
    • Spring Web - 今回はAPIを開発するため
      spring-initializer
      spring initializer

上記の通り入力したら、GENERATEボタンを押下すると、zipダウンロードが開始されます。

Spring Bootのスケルトンコードを上書き

上記でダウンロードしたzipファイルを解凍し、新規作成したプロジェクトに上書きコピーする。

Reload Maven All Projectボタンを押下して、依存関係のあるライブラリ等を最新化。
(下記の図参照)
maven reload
maven reload

実行と動作確認

下図の通り、Spring Applicationとして実行。

ブラウザを開いて、http://localhost:8080と入力。
下図の通り、エラーとはなるが、表示が返ってくることを確認。
まだAPIも画面も実装していないので、現時点ではこれでOK。

WebAPIの追加

IDと名称をJSON形式で返却するAPIを開発する。
返却するJSONは以下の通り。

{
    "id" : 100,
    "name" : "taro"
}

JSONのデータを格納するDTOクラスの作成

getter/setterの記述を省略するためにLombokを使用する。
pom.xmlに以下の依存関係を追加する。
(spring initializerでも選択できたのですが、忘れていました。。)
追記後は、上記の手順同様にReload Maven All Projectボタンを押下します。

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.24</version>
		</dependency>

レスポンスとして返却するためのクラスを以下の通り実装する。

package com.example.springbootdemo.dto;

import lombok.Data;

@Data
public class Sample {
    private int id;
    private String name;
}

Controllerクラスの作成とAPIの実装

HelloControllerクラスを新規に作成し、以下の通り実装する。
ここでは一旦細かい解説は結愛するが、/helloにアクセスするとJSON形式でレスポンスを返却するようになる。

package com.example.springbootdemo.controller;

import com.example.springbootdemo.dto.Sample;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/hello")
public class HelloController {
    @GetMapping
    public Sample hello()
    {
        Sample sample = new Sample();
        sample.setId(100);
        sample.setName("taro");

        return sample;
    }
}

APIの動作確認

下図の通り、画面上部メニューからSpring Applicationを実行。

ブラウザを開いて、http://localhost:8080/helloと入力。
以下の通りのJSONが表示されればOK。

{"id":100,"name":"taro"}

APIのテスト

テストコードの作成

上記で作成したAPIのテストコードを書いてみます。
Springでのテスト方法はいくつかありますが、ここではDBへのアクセスもないシンプルなAPIですので、テストコードから実際のAPIを呼び出して、想定通りのレスポンスが返却されることを確認します。

IntelliJ IDEAで新規にプロジェクトを作成した際に自動で作成されたテストクラスを以下の通り修正します。

package com.example.springbootdemo;

import com.example.springbootdemo.dto.Sample;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@SpringBootTest
@AutoConfigureMockMvc
class SpringBootDemoApplicationTests {

	// APIを発行するためのMockオブジェクトを生成
	@Autowired
	private MockMvc mockMvc;
	@Test
	void contextLoads() throws  Exception{
		// JavaのObjectをJSONに変換するためのクラスを生成
		ObjectMapper objectMapper = new ObjectMapper();

		// 結果を検証するためのクラスを生成して、期待値をセット
		Sample sample = new Sample();
		sample.setId(100);
		sample.setName("taro");

		// 「/hello」パスのAPIを実行してレスポンスを検証
		this.mockMvc.perform(MockMvcRequestBuilders.get("/hello"))
				.andDo(MockMvcResultHandlers.print())
				.andExpect(status().isOk())
				.andExpect(content().json(objectMapper.writeValueAsString(sample)));
	}
}

テストの実行

下図の通り、テストを実行します。

実行後は、IntellJ IDEAのRunコンソールに結果が表示されます。
一番下に以下が出力されていれば、OKです。
その他、レスポンス内容なども出力されているかと思います。

Process finished with exit code 0

ここまでで、APIの作成とテストまで完了です。
次回はGitHubへのPUSHについて記事を作成します。

記事一覧

第一回 Spring Bootを使ったWebAPIの作成

第二回 IntelliJ IDEAを使って、Spring BootプロジェクトをGitHubにPush

第三回 Dockerコンテナ上でSpring Bootアプリケーションのビルド

第四回 AWS CodeBuildでSpring Bootアプリケーションをビルド

第五回 AWS CodeDeployでSpring Bootアプリケーションのデプロイ

第六回 CodePipelineでSpring BootアプリをCI/CD

Discussion