Spring BootでREST APIを作る
Spring Boot は、サーバー側のプロジェクトを素早く動かすための Java フレームワークです。組み込みの Tomcat サーバー、データベース接続、JSON 変換など、ほとんどの初期設定が用意されています。この記事では、Controller、Service、Repository の三つの層で小さな REST API を作ります。
テストに関する注意:この記事を書いたコンピューターには Maven や Gradle がなく、Spring のライブラリのダウンロードもここではテストしていません。以下のコードは標準的な書き方です。実際に使う前に自分で実行して結果を確認してください。
必要なもの
- JDK 17 以上
- Maven または Gradle
- Spring Boot 拡張を入れた VS Code、または IntelliJ IDEA
三つの層
手順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
よくあるミス
- **パッケージ名とフォルダ構造が一致しない:** Spring はメインのパッケージからクラスを探すため、`@SpringBootApplication` を付けたクラスと同じパッケージ配下にクラスを置きます。
- **データベースのドライバーを追加していない:** 接続に失敗します。ドライバーを追加し、`application.properties` を設定します。
- **不正な入力を検査せずに保存する:** 保存前に Bean Validation でデータを検査します。
次のステップ
入力の検証を追加し、`@ControllerAdvice` でエラー処理をまとめ、JUnit で Service をテストしましょう。
まとめ
Spring Boot は REST API を三つの層に分けて構成します。Controller がリクエストを受け取り、Service がロジックを担当し、Repository がデータベースと通信します。この分離により、コードのテストと保守がしやすくなります。