Spring BootでREST APIを作る

Spring BootでREST APIを作る

Spring Boot は、サーバー側のプロジェクトを素早く動かすための Java フレームワークです。組み込みの Tomcat サーバー、データベース接続、JSON 変換など、ほとんどの初期設定が用意されています。この記事では、Controller、Service、Repository の三つの層で小さな REST API を作ります。

テストに関する注意:この記事を書いたコンピューターには Maven や Gradle がなく、Spring のライブラリのダウンロードもここではテストしていません。以下のコードは標準的な書き方です。実際に使う前に自分で実行して結果を確認してください。

必要なもの

三つの層

概略図:Controller が HTTP リクエストを受け取り、Service に渡し、Service が Repository を通じてデータベースにアクセスする
概略図:Controller が HTTP リクエストを受け取り、Service に渡し、Service が Repository を通じてデータベースにアクセスする

手順1:プロジェクトを作る

https://start.spring.io にアクセスし、Maven と Java 17 を選び、Spring Web と Spring Data JPA を追加してプロジェクトを生成し、解凍します。

手順2:データクラス

package com.example.demo;

import jakarta.persistence.*;

@Entity
public class Note {
    @Id
    @GeneratedValue
    private Long id;
    private String title;

    public Note() {}
    public Note(String title) { this.title = title; }

    public Long getId() { return id; }
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }
}

手順3:Repository

package com.example.demo;

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

public interface NoteRepository extends JpaRepository<Note, Long> {
}

Spring Data は、`JpaRepository` を継承するだけで `findAll`、`save`、`deleteById` などの基本メソッドを自動的に提供します。

手順4:Service

package com.example.demo;

import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class NoteService {
    private final NoteRepository repository;

    public NoteService(NoteRepository repository) {
        this.repository = repository;
    }

    public List<Note> all() {
        return repository.findAll();
    }

    public Note create(String title) {
        return repository.save(new Note(title));
    }
}

手順5:Controller

package com.example.demo;

import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/api/notes")
public class NoteController {
    private final NoteService service;

    public NoteController(NoteService service) {
        this.service = service;
    }

    @GetMapping
    public List<Note> list() {
        return service.all();
    }

    @PostMapping
    public Note create(@RequestBody Note body) {
        return service.create(body.getTitle());
    }
}

手順6:実行とテスト

./mvnw spring-boot:run

curl でテストします。

curl -X POST http://localhost:8080/api/notes -H "Content-Type: application/json" -d "{\"title\":\"ซื้อกาแฟ\"}"
curl http://localhost:8080/api/notes

よくあるミス

次のステップ

入力の検証を追加し、`@ControllerAdvice` でエラー処理をまとめ、JUnit で Service をテストしましょう。

まとめ

Spring Boot は REST API を三つの層に分けて構成します。Controller がリクエストを受け取り、Service がロジックを担当し、Repository がデータベースと通信します。この分離により、コードのテストと保守がしやすくなります。