@RestControllerと@RequestMappingでリクエストを処理する仕組みを理解しよう【Spring Boot】

  • LINEで送る
@RestControllerと@RequestMappingでリクエストを処理する仕組みを理解しよう

 Spring BootでWebアプリを作るとき、最初に立ちはだかるのが「コントローラー」。でも安心してください。この記事では、@RestController@RequestMapping を使って、実際にブラウザからのリクエストを受け取ってレスポンスを返すまでの流れを、シンプルなサンプルとともにやさしく解説します。ちょっとでもSpring Bootに触れてみたい方は、まずこのステップから始めてみましょう。

🎮 Controllerの役割とは?

 コントローラーは、外部からのHTTPリクエストを受け取り、処理してレスポンスを返す役割を担う重要なコンポーネントです。Spring Bootでは、こうした処理を行うクラスやメソッドに「アノテーション」という記述を用いて意味づけをします。アノテーションは、「@」から始まる特別なキーワードで、クラスやメソッドに対して特定の機能や動作を与える仕組みです。

 今回は特に以下の2つのアノテーションに注目し、それぞれの役割と使い方を詳しく見ていきます:

  • @RestController
  • @RequestMapping

 これらを使うことで、外部からのアクセスに応じて正しい処理を行うシンプルなAPIを実装することができます。

なぜアノテーションを使うの?

 Spring Bootではアノテーションを多用することで、XMLなどの複雑な設定を省略し、シンプルな記述で直感的に機能を実装できるのが特徴です。

 もしアノテーションを付けなければ、Springはそのクラスがコントローラーであると認識せず、リクエストを受け取ることもルーティングすることもできません。単なるJavaクラスとして無視されてしまいます。

💡例えるなら、受付係のような存在。来訪者(リクエスト)が何を求めているかを判断し、適切な部署(サービスやロジック)に取り次ぎ、回答(レスポンス)を返します。

@RestControllerと@RequestMappingの基本

@RestController は、以下2つのアノテーションを組み合わせたものです:

  • @Controller:このクラスがWebリクエストを処理することを示します。
  • @ResponseBody:メソッドの返り値をそのままHTTPレスポンスの本文として返します。

 この組み合わせにより、テンプレートエンジン(Thymeleafなど)を使わずに、プレーンテキストやJSONなどをそのままクライアントに返すAPIを簡潔に作成できます。

💡 補足:Thymeleafとは? Thymeleafは、HTMLテンプレートとJavaのデータを組み合わせて動的にページを生成するためのテンプレートエンジンです。Web画面を返すようなアプリ(MVC構成)では@Controllerと一緒に使いますが、今回のようにデータだけを返すAPIでは不要です。

たとえば次のように書くだけで、文字列やオブジェクトを返すREST APIが完成します:

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

@RequestMappingとその他のマッピングアノテーションの違い

 @RequestMappingと似たような機能を提供するものとして@GetMappingや@PostMappingがあります。これらのアノテーションと@RequestMappingとの違いは下記になります。:

  • @RequestMapping はもっとも基本的で汎用的なマッピングアノテーションであり、GET、POST、PUT、DELETE など、あらゆるHTTPメソッドに対応可能です。
  • ただしその分、method = RequestMethod.GET のようにHTTPメソッドを明示的に指定する必要があり、コードがやや冗長になりがちです。
  • 対して、@GetMapping, @PostMapping, @PutMapping などは、それぞれのHTTPメソッド専用に設計されたショートカットアノテーションで、簡潔で読みやすく、RESTful APIの構築にも適しています。
// GETリクエストに対応する方法(どちらも同じ意味)
@RequestMapping(value = "/hello", method = RequestMethod.GET)
@GetMapping("/hello")

 専用アノテーションは意味が明確で、意図が読み取りやすくなるため、チーム開発や保守性を重視する場合には特に推奨されます。(GET、POST、PUTなど)を明示的に指定しない場合は全てのメソッドに対応します。

💡実務ではそれぞれのパスで意図を明確にすることが多いため、特別な理由がない限りは専用アノテーションを使いましょう。

その他のマッピングアノテーション

アノテーション名対応するHTTPメソッド使用例
@GetMappingGETデータの取得
@PostMappingPOST新規データの作成
@PutMappingPUT既存データの更新(全体)
@PatchMappingPATCH既存データの一部更新
@DeleteMappingDELETEデータの削除

利用例

@PostMapping("/create")
public String create() {
    return "データを作成しました";
}

@DeleteMapping("/delete")
public String delete() {
    return "データを削除しました";
}

🛠️ オプション設定(属性)

以下は、マッピング系アノテーション(@GetMapping@PostMapping など)でよく使われる主な属性の一覧です:

属性名説明
value / path対象とするURLパス。valuepath は同じ意味で、どちらか一方を使用可能です。
method対応させるHTTPメソッド。@RequestMappingでのみ使用(GET, POST など)
headers特定のHTTPヘッダーが含まれている場合のみマッチさせる条件
params指定されたリクエストパラメータが存在する場合のみ処理を実行
consumes対応するリクエストのContent-Type(例:application/json
producesレスポンスのContent-Type(例:application/json)を指定

 これらの属性を適切に組み合わせることで、条件に応じた細かなルーティング制御が可能になります。

 @RestController 自体には属性はありませんが、クラスに @RequestMapping を組み合わせて共通のURLプレフィックスを指定したり、各マッピングアノテーションに属性を付けて詳細な条件を指定することができます。

以下は、さまざまなマッピングアノテーションに属性を設定した例です:

@RestController
public class SampleController {

    // GETメソッド、特定のヘッダーが必要
    @GetMapping(value = "/hello", headers = "X-Custom-Header=123")
    public String hello() {
        return "Hello with header!";
    }

    // POSTメソッド、特定のContent-TypeとAcceptに対応
    @PostMapping(value = "/submit", consumes = "application/json", produces = "application/json")
    public String submit(@RequestBody String data) {
        return "Received: " + data;
    }

    // PUTメソッド、パスにパラメータあり
    @PutMapping("/update/{id}")
    public String update(@PathVariable String id) {
        return "Updated ID: " + id;
    }

    // DELETEメソッド
    @DeleteMapping("/delete")
    public String delete() {
        return "Deleted!";
    }
}

クラス全体に @RequestMapping を組み合わせて、共通のURLプレフィックスを指定することもできます:

@RestController
@RequestMapping("/api")
public class ApiController {
    // /api/hello にマッピングされる
    @GetMapping("/hello")
    public String hello() {
        return "Hello from API!";
    }

    // /api/delete にマッピングされる
    @DeleteMapping("/delete")
    public String delete() {
        return "Deleted!";
    }
}

 このように、@RestController はSpring BootにおけるREST API開発の出発点となる重要なアノテーションです。

▶️ サンプルコードと実行例

 簡単なサンプルですが、このコードを動かしてWeb上に表示されることを確認してみましょう。

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

    @GetMapping("/greet")
    public String greet() {
        return "Hello from Spring Boot!";
    }
}

spring-boot-starter-webの依存が含まれていることを確認して下記の手順で確認してみましょう:

  1. アプリケーションを起動
  2. ブラウザで http://localhost:8080/api/greet にアクセス
  3. 「Hello from Spring Boot!」と表示されれば成功!

まとめ

 この記事では、Spring Bootにおけるリクエスト処理の基本として @RestController@RequestMapping の役割と使い方を学びました。リクエストを受け取ってレスポンスを返すという、Webアプリの土台となる動作を支えるのがコントローラーです。

 さらに、@GetMapping@PostMapping などのマッピング専用アノテーションを使うことで、コードの可読性が向上し、RESTfulな設計にも対応しやすくなります。これらのアノテーションには多彩なオプション(パス、パラメータ、ヘッダー、Content-Typeなど)が用意されており、条件に応じた細かなルーティング制御が可能です。

 コントローラーの構成とルーティングの柔軟性を理解することは、Spring BootによるAPI開発の第一歩。次回はその一歩をさらに踏み込んで、リクエストに含まれるパラメータを受け取る方法、つまり @PathVariable@RequestParam の使い分けについて学びます。

 URLに含まれるIDを取り出したり、検索条件をクエリとして受け取ったりといった、実用的な機能の基礎となる内容です。ぜひ次の記事もお楽しみに!

最新の投稿

SNSでもご購読できます。

コメントを残す