Spring Boot API連携

Spring Bootで特定のテーブルのデータ取得・追加・更新・削除を行うRest APIサービスを作成してみた

Spring Bootアプリケーションでは、@RestControllerアノテーションを利用することで、Rest APIサービスを作成することができる。

Rest APIサービスについては、以下のサイトを参照のこと。
https://qiita.com/masato44gm/items/dffb8281536ad321fb08

今回は、STS(Spring Tool Suite)を利用したSpring Bootアプリケーション上で、特定のテーブルのデータ取得・追加・更新・削除を行うRest APIサービスを作成してみたので、そのサンプルプログラムを共有する。

前提条件

STSをインストールし、以下の記事のLombokの設定が終わっているものとする。

STS(Spring Tool Suite)上でlombokを利用してみた今回は、STSを利用して、lombokを利用してみたので、その手順を共有する。STS上でlombokを利用できるようにするには、あらかじ...

また、Oracleデータベース上に、以下のUSER_DATAテーブルとデータが作成済であること。
前提条件

さらに、以下の記事のPostmanをインストール済であること。

POSTメソッドでリクエストされるAzure FunctionsのAPIをPostmanによって呼び出してみたAzure App Serviceを利用せずに、HTTPトリガーによって呼び出されるAzure Functionsの動作確認を行うには、...



ウズウズカレッジJavaコースはわかりやすい動画教材と充実した就業サポートで優良企業を目指せるプログラミングスクールだったJavaは、世界中で広く使われていて、現在の需要が高く将来性もある開発言語になります。 https://www.acrovision....

サンプルプログラムの作成

今回はSTS(Spring Tool Suite)上で、Spring Bootアプリケーションを作成するところから開始する。その手順は、以下の通り。

1) STSを起動し、「ファイル」の「新規」メニューから「Spring スターター・プロジェクト」を選択する。
サンプルプログラムの作成_1

2) プロジェクト名やグループ・パッケージ等を指定し、「次へ」ボタンを押下する。
サンプルプログラムの作成_2

3) 必要なライブラリを選択し、「完了」ボタンを押下する。今回は、DevTools・Lombok・Spring Data JPA・Oracle Driver・Spring Webが必要なので、これらを選択している。
サンプルプログラムの作成_3

4) プロジェクトが作成でき、以下のようなフォルダ構成になる。
サンプルプログラムの作成_4

5) 作成されたプロジェクトの、pom.xmlの内容は、以下の通り。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example.demo</groupId>
    <artifactId>demoRestApi</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demoRestApi</name>
    <description>Demo Api Project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

6) 作成されたプロジェクトの、Spring Bootのメインクラスの内容は、以下の通り。

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoRestApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoRestApiApplication.class, args);
    }

}

7) 上記プロジェクトの内容に、以下の赤枠のソースコードを追加・変更する。
サンプルプログラムの作成_7

application.propertiesの内容は以下の通りで、Spring Bootアプリケーションを起動するポート番号と、Oracleデータベースへの接続先を定義している。

# ポート番号:8085で起動するよう設定
server.port = 8085

# Oracle DBの接続先を設定
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=USER01
spring.datasource.password=USER01
spring.datasource.driverClassName=oracle.jdbc.driver.OracleDriver

Oracleデータベース上のUSER_DATAテーブルにアクセスするエンティティ・リポジトリの内容は以下の通りで、JPAによってデータベースにアクセスしている。

package com.example.demo;

import lombok.Data;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;

/**
 * ユーザーデータテーブル(user_data)アクセス用エンティティ
 */
//テーブル名を「@Table」アノテーションで指定
@Entity
@Table(name="user_data")
@Data
public class UserData {

    /** ID */
    //主キー項目に「@Id」を付与
    @Id
    private long id;

    /** 名前 */
    private String name;

    /** 生年月日_年 */
    //カラム名を「@Column」アノテーションで指定
    @Column(name="birth_year")
    private int birthY;

    /** 生年月日_月 */
    @Column(name="birth_month")
    private int birthM;

    /** 生年月日_日 */
    @Column(name="birth_day")
    private int birthD;

    /** 性別 */
    private String sex;

    /** メモ */
    private String memo;
}
package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

/**
 * ユーザーデータテーブル(user_data)アクセス用リポジトリ
 */
// JpaRepositoryクラスを継承することによって、ユーザーデータテーブル(user_data)への
// select, insert, delete, updateを行うメソッドを自動で生成してくれる
@Repository
public interface UserDataRepository extends JpaRepository<UserData, Long> {
}

RESTコントローラクラスの内容は以下の通りで、USER_DATAテーブルのデータ取得・追加・更新・削除を行うRest APIサービスを作成している。

package com.example.demo;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * Rest API定義クラス
 */
@RestController
public class DemoRestController {

    /** ユーザーデータテーブル(user_data)アクセス用リポジトリ */
    @Autowired
    private UserDataRepository repository;
    
    /**
     * ユーザーデータリストを取得する.
     * @return ユーザーデータリスト
     */
    @GetMapping("/users")
    public List<UserData> getAllUserData() {
        return repository.findAll();
    }
    
    /**
     * 指定したIDをもつユーザーデータを取得する.
     * @param id ID
     * @return 指定したIDをもつユーザーデータ
     */
    @GetMapping("/users/{id}")
    public UserData getOneUserData(@PathVariable long id) {
        Optional<UserData> userData = repository.findById(id);
        // 指定したIDをもつユーザーデータがあればそのユーザーデータを返す
        if(userData.isPresent()) {
            return userData.get();
        }
        // 指定したIDをもつユーザーデータがなければnullを返す
        return null;
    }
    
    /**
     * 指定したユーザーデータを登録する.
     * @param userData ユーザーデータ
     * @return 登録したユーザーデータ
     */
    @PostMapping("/users")
    public UserData saveUserData(@RequestBody UserData userData) {
        // 本来は引数のチェック処理が必要であるが、ここでは実施していない
        return repository.save(userData);
    }
    
    /**
     * 指定したユーザーデータを更新する.
     * @param id ID
     * @param userData ユーザーデータ
     * @return 更新したユーザーデータ
     */
    @PutMapping("/users/{id}")
    public UserData updateUserData(@PathVariable long id
            , @RequestBody UserData userData) {
        // 本来は引数userDataのチェック処理が必要であるが、ここでは実施していない
        userData.setId(id);
        return repository.save(userData);
    }
    
    /**
     * 指定したIDをもつユーザーデータを削除する.
     * @param id ID
     */
    @DeleteMapping("/users/{id}")
    public void deleteUserData(@PathVariable long id) {
        Optional<UserData> userData = repository.findById(id);
        // 指定したIDをもつユーザーデータがあればそのユーザーデータを削除する
        if(userData.isPresent()) {
            repository.deleteById(id);
        }
    }
}

これらのソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-rest-api-crud/demoRestApi



サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) Spring Bootアプリケーションを起動し、「http://(ホスト名):(ポート番号)/users」にアクセスすると、以下のように、USER_DATAテーブルの全データが取得できることが確認できる。
サンプルプログラムの実行結果_1

2) Postmanを起動し、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users」として「Send」ボタンを押下すると、先ほどと同じように、USER_DATAテーブルの全データが取得できることが確認できる。
サンプルプログラムの実行結果_2_1

サンプルプログラムの実行結果_2_2

3) Postmanで、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users/1」として「Send」ボタンを押下すると、USER_DATAテーブルのid=1のデータが取得できることが確認できる。
サンプルプログラムの実行結果_3_1

サンプルプログラムの実行結果_3_2

4) Postmanで、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users/10」として「Send」ボタンを押下すると、USER_DATAテーブルのid=10のデータが存在しないため、NULL値が返却されることが確認できる。
サンプルプログラムの実行結果_4_1

サンプルプログラムの実行結果_4_2

5) Postmanで、リクエストを「GET」、URLを「http://(ホスト名):(ポート番号)/users/a」として「Send」ボタンを押下すると、aは数値でないため、HTTP 400( Bad Request)エラーが返却されることが確認できる。
サンプルプログラムの実行結果_5_1

サンプルプログラムの実行結果_5_2

6) Postmanで、リクエストを「POST」、URLを「http://(ホスト名):(ポート番号)/users」、リクエストボディに追加するデータをJSON形式で設定して「Send」ボタンを押下すると、追加したデータが返却される。
サンプルプログラムの実行結果_6_1

サンプルプログラムの実行結果_6_2

7) 6)で追加されたデータをAPIやOracleデータベースで確認した結果は以下の通りで、指定したデータが追加されていることが確認できる。
サンプルプログラムの実行結果_7_1

サンプルプログラムの実行結果_7_2

8) Postmanで、リクエストを「PUT」、URLを「http://(ホスト名):(ポート番号)/users/4」、リクエストボディに更新するデータをJSON形式で設定して「Send」ボタンを押下すると、更新したデータが返却される。
サンプルプログラムの実行結果_8_1

サンプルプログラムの実行結果_8_2

9) 8)で更新されたデータをRest APIやOracleデータベースで確認した結果は以下の通りで、指定したデータが更新されていることが確認できる。
サンプルプログラムの実行結果_9_1

サンプルプログラムの実行結果_9_2

10) Postmanで、リクエストを「DELETE」、URLを「http://(ホスト名):(ポート番号)/users/4」、リクエストボディに更新するデータをJSON形式で設定して「Send」ボタンを押下すると、何もレスポンスは返却されないが処理が正常終了する。
サンプルプログラムの実行結果_10_1

サンプルプログラムの実行結果_10_2

11) 10)で削除されたデータをRest APIやOracleデータベースで確認した結果は以下の通りで、指定したidのデータが削除されていることが確認できる。
サンプルプログラムの実行結果_11_1

サンプルプログラムの実行結果_11_2

要点まとめ

  • Spring Bootアプリケーションでは、@RestControllerアノテーションを利用することで、Rest APIサービスを作成することができる。
  • Rest APIサービスの実行確認には、Postmanを利用すると便利である。
  • Rest APIサービスの各メソッドに追加するアノテーションは、データ取得時は@GetMappingアノテーション、データ更新・追加時は@PostMappingアノテーション、データ削除時は@DeleteMappingアノテーションとなる。