GradleでSpring Boot RESTアプリケーションを構築する

このチュートリアルでは、Spring BootとGradleを使用してシンプルなRESTfulウェブサービスを作成します。Spring Bootは、スタンドアロンの生産レベルのSpringベースのアプリケーションを簡単に作成できるようにするものであり、Gradleはビルドプロセスを簡素化する強力なビルドツールです。

RESTとは何ですか?

REST、表現的状態転送は、APIが相互運用可能、スケーラブル、保守可能であることを保証する一連のアーキテクチャの原則です。レゴブロックを構築することを想像してください。異なるアプリケーションは、RESTfulガイドラインに従う限り、シームレスにAPIと対話できます。レゴのセットに関係なく、レゴがくっつくのと同じです。

Spring Bootとは何ですか?

Spring Bootは、開発プロセスを簡素化する強力なフレームワークです。それは、コンポーネントや機能でストックされたプリビルトツールキットとして考えてください。アプリケーションインフラストラクチャのセットアップに時間と労力を費やすことなく、APIのコアロジックを作成することに集中できます。

API開発者の内なる力を解放できる準備はできていますか?このガイドは、あなたが最初のSpring Boot RESTアプリケーションを作成するためにGradle、人気のあるビルドツールを使用することを可能にします。あなたが経験豊富なJavaプログラマであろうと、あなたの探求を始めたばかりであろうと、このステップバイステップの旅はあなたに動的でインタラクティブなウェブサービスを構築するための基本的な知識を提供します。

重要なポイント

  • RESTful APIをSpring Bootで作成する: Spring Bootは、RESTful APIの開発プロセスを簡素化する人気のあるJavaフレームワークです。自動構成や依存性注入など、箱詰めで幅広い機能を提供し、時間と労力を節約します。
  • RESTful APIの基本概念を理解する: RESTはRepresentational State Transferの略です。APIが相互運用可能、スケーラブル、そして保守可能であることを保証する一連のアーキテクチャの原則です。RESTful APIの主要な概念には、リソース表現、HTTPメソッド、およびステータスコードが含まれます。
  • 基本的なCRUD操作を実装する: CRUDはCreate、Read、Update、およびDeleteの略です。これらは、ユーザーがデータと対話できるようにするためにAPIエンドポイントで実装する必要がある基本操作です。
  • APIを徹底的にテストする: 本番環境にデプロイする前にAPIを徹底的にテストすることが重要です。これにより、APIが期待どおりに動作しており、バグがないことを確認できます。
  • 高度な機能を探索する: Spring BootとRESTful APIに慣れてくると、データ管理、セキュリティ、認証などのより高度な機能を探索できます。

RESTの力とSpring Bootのストレートフォワードなアプローチを組み合わせることで、他のアプリケーションとシームレスに統合できる効率的でユーザーフレンドリーなAPIを作成できます。さて、Spring BootとGradleでRESTful APIの可能性を引き出す準備はできていますか?始めましょう!

前提条件

  • Java Development Kit (JDK) 11 インストール済み
  • 最新版のGradle インストール済み
  • JavaおよびSpringの概念の基本的な理解

ステップ1: プロジェクトのセットアップ

プロジェクトを開始するためには、以下の3つのステップを実行する必要があります。

  • ターミナルまたはコマンドプロンプトを開く
  • プロジェクト用の新しいディレクトリを作成する
  • プロジェクトディレクトリに移動する
  • 基本的なSpring Bootプロジェクト構造を初期化する

Shell

 

mkdir spring-boot-rest-gradle
cd spring-boot-rest-gradle
gradle init --type spring-boot

ステップ2: Spring Bootプロジェクトの作成

ディレクトリ内に存在するbuild.gradleファイルを以下の内容で編集してください。

Groovy

 

plugins {
    id 'org.springframework.boot' version '2.6.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '1.0-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

これにより、必要な依存関係を含む基本的なSpring Bootプロジェクトが設定されます。

ステップ3: RESTコントローラの作成

以下の内容でHelloController.javaという名前の新しいファイルをsrc/main/java/com/exampleディレクトリに作成してください。

Java

 

import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/api")
public class HelloController {

    private final List<String> messages = new ArrayList<>();

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot!";
    }

    @GetMapping("/messages")
    public List<String> getMessages() {
        return messages;
    }

    @PostMapping("/messages")
    public String addMessage(@RequestBody String message) {
        messages.add(message);
        return "Message added: " + message;
    }

    @PutMapping("/messages/{index}")
    public String updateMessage(@PathVariable int index, @RequestBody String updatedMessage) {
        if (index < messages.size()) {
            messages.set(index, updatedMessage);
            return "Message updated at index " + index + ": " + updatedMessage;
        } else {
            return "Invalid index";
        }
    }

    @DeleteMapping("/messages/{index}")
    public String deleteMessage(@PathVariable int index) {
        if (index < messages.size()) {
            String removedMessage = messages.remove(index);
            return "Message removed at index " + index + ": " + removedMessage;
        } else {
            return "Invalid index";
        }
    }
}

これは、GET、POST、PUT、DELETE操作のエンドポイントを持つRESTコントローラを定義します。

ステップ4: アプリケーションの実行

ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行してください。

Java

 

./gradlew bootRun

ブラウザでhttp://localhost:8080/api/helloにアクセスして、初期エンドポイントを確認してください。curl、Postman、または任意のRESTクライアントを使用して他のエンドポイントをテストすることができます。

ステップ5: テストケースの記述

HelloControllerTest.javasrc/test/java/com/exampleディレクトリに作成し、以下の内容を追加してください:

Java

 

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
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.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;

@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @BeforeEach
    public void setUp() {
        // テストごとにメッセージをクリアします
        // これにより、各テストのクリーンな状態が確保されます
        // 代わりに、テストデータベースやモックデータを使用することもできます
        // 要件に応じて
        HelloController messagesController = new HelloController();
        messagesController.getMessages().clear();
    }

    @Test
    public void testSayHello() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/api/hello"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Hello, Spring Boot!"));
    }

    @Test
    public void testGetMessages() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.get("/api/messages"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.jsonPath("$", hasSize(0)));
    }

    @Test
    public void testAddMessage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/messages")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Test Message\""))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Message added: Test Message"));
    }

    @Test
    public void testUpdateMessage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/messages")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Initial Message\""));

        mockMvc.perform(MockMvcRequestBuilders.put("/api/messages/0")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Updated Message\""))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Message updated at index 0: Updated Message"));
    }

    @Test
    public void testDeleteMessage() throws Exception {
        mockMvc.perform(MockMvcRequestBuilders.post("/api/messages")
                .contentType(MediaType.APPLICATION_JSON)
                .content("\"Message to Delete\""));

        mockMvc.perform(MockMvcRequestBuilders.delete("/api/messages/0"))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Message removed at index 0: Message to Delete"));
    }
}

これらのテストケースでは、Spring Bootのテスト機能を使用してHTTPリクエストをシミュレートし、RESTコントローラの動作を検証します。

ステップ6:テストを実行します

ターミナルまたはコマンドプロンプトを開き、次のコマンドを実行してテストを実行します:

Java

 

./gradlew test 

すべてのテストが正常に合格したことを確認するためにテスト結果を確認してください。

結論

おめでとうございます!Spring BootとGradleを使用してCRUD操作を備えた基本的なRESTful Webサービスを作成しました。このチュートリアルでは、GET、POST、PUT、DELETE操作のエンドポイントの実装とそれに対応するテストケースをカバーしました。

追加の注意事項:

  • これは非常に基本的な例です。エンドポイントを追加したり、異なるHTTPメソッド(POST、PUT、DELETE)を処理したり、データ管理などの機能を追加することで拡張できます。
  • JUnitなどのフレームワークを使用してコントローラーのユニットテストを追加することを検討してください。
  • Spring Initializr (https://start.spring.io/)を使用して、追加の依存関係と設定を含むプロジェクトを迅速に生成できます。

さらに学習するために、以下のリソースをチェックアウトしてください:

覚えておいてください、これはSpring Bootの旅の始まりに過ぎません! さらに探求し、素晴らしいアプリケーションを構築していきましょう。

Source:
https://dzone.com/articles/build-your-first-spring-boot-rest-application-with