カテゴリ: Spring 更新日: 2025/10/21

Spring BootのETagとCache-Controlを完全解説!初心者でもわかるブラウザキャッシュ設計

Spring BootのETag/Cache-Control:ブラウザキャッシュを設計する
Spring BootのETag/Cache-Control:ブラウザキャッシュを設計する

先生と生徒の会話形式で理解しよう

生徒

「ページの読み込みを速くしたいんですが、ブラウザキャッシュってどうやって使えばいいんですか?」

先生

「それならETagCache-Controlヘッダーを使うといいですよ。Spring Bootではこれらを簡単に使える仕組みがあります。」

生徒

「キャッシュってなんとなくは分かるんですが、実際にどう設定するかまでは分からなくて…」

先生

「では、ETagやCache-Controlの基本から、Spring Bootでの実装まで、わかりやすく解説していきましょう!」

1. ブラウザキャッシュの基本とは?

1. ブラウザキャッシュの基本とは?
1. ブラウザキャッシュの基本とは?

Webアプリケーションのパフォーマンスを向上させるために欠かせないのがブラウザキャッシュです。キャッシュを活用すれば、画像やJSONなどのレスポンスデータを一度取得すれば、次回以降はダウンロードせずに表示できるようになります。

代表的な仕組みには以下の2つがあります。

  • ETag:レスポンスのハッシュ値などを返して、変更がなければ304(Not Modified)を返す仕組み
  • Cache-Control:クライアント側で一定期間キャッシュを保存できるようにするヘッダー

2. Spring BootでETagを有効にするには?

2. Spring BootでETagを有効にするには?
2. Spring BootでETagを有効にするには?

Spring Bootでは、WebMvcConfigurerの設定でETagを簡単に有効化できます。下記のように設定ファイルに記述するだけです。


@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        configurer.favorPathExtension(false);
    }

    @Bean
    public FilterRegistrationBean<ShallowEtagHeaderFilter> shallowEtagFilter() {
        FilterRegistrationBean<ShallowEtagHeaderFilter> filter = new FilterRegistrationBean<>(new ShallowEtagHeaderFilter());
        filter.addUrlPatterns("/*");
        return filter;
    }
}

このShallowEtagHeaderFilterは、レスポンス内容のハッシュを自動で生成し、If-None-Matchリクエストヘッダーに基づいて304を返してくれます。

3. Cache-Controlでキャッシュ期間を明示的に設定

3. Cache-Controlでキャッシュ期間を明示的に設定
3. Cache-Controlでキャッシュ期間を明示的に設定

Cache-Controlヘッダーを使うことで、ブラウザに対してキャッシュの保存期間や動作を指示できます。Spring Bootでは以下のようにControllerで個別に設定できます。


@GetMapping("/static-content")
public ResponseEntity<String> getContent() {
    return ResponseEntity.ok()
        .cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
        .body("キャッシュ可能なコンテンツ");
}

maxAgeの設定により、ブラウザはその間リクエストせず、キャッシュを使用します。CDNと組み合わせるとさらに効果的です。

4. 静的リソース(JS・CSS・画像)へのキャッシュ設定

4. 静的リソース(JS・CSS・画像)へのキャッシュ設定
4. 静的リソース(JS・CSS・画像)へのキャッシュ設定

Spring Bootではapplication.propertiesで静的リソースのキャッシュ制御が可能です。


spring.web.resources.cache.cachecontrol.max-age=60d
spring.web.resources.cache.cachecontrol.cache-public=true

この設定により、/static/publicフォルダ内の画像やJavaScriptに対して、自動的にキャッシュヘッダーが付与されます。

5. ETagとCache-Controlを組み合わせて最適化

5. ETagとCache-Controlを組み合わせて最適化
5. ETagとCache-Controlを組み合わせて最適化

ETagとCache-Controlは、併用することで非常に高いパフォーマンスを発揮します。

  • まずはCache-Controlで期限内のアクセスをキャッシュで処理
  • 期限が切れた場合、ETagによる304判定で再ダウンロードを回避

このように組み合わせることで、ユーザーにとっても快適で、サーバー負荷も軽減される仕組みを構築できます。

6. APIレスポンスにETagを独自に設定する方法

6. APIレスポンスにETagを独自に設定する方法
6. APIレスポンスにETagを独自に設定する方法

自動生成されたETagだけでなく、独自ロジックで生成したETagを手動で設定することも可能です。例えば、データベースの更新日時やハッシュを使って次のように実装できます。


@GetMapping("/api/data")
public ResponseEntity<String> getData(@RequestHeader(value = "If-None-Match", required = false) String ifNoneMatch) {
    String currentEtag = "\"123456789\"";

    if (currentEtag.equals(ifNoneMatch)) {
        return ResponseEntity.status(HttpStatus.NOT_MODIFIED).eTag(currentEtag).build();
    }

    return ResponseEntity.ok().eTag(currentEtag).body("データの内容");
}

If-None-Matchヘッダーが送信されたときに、それと一致すれば304を返すことで、効率的な通信が可能になります。

7. キャッシュ設計時の注意点

7. キャッシュ設計時の注意点
7. キャッシュ設計時の注意点

キャッシュは便利ですが、設計を間違えると古いデータが表示されたままになるなどの不具合が発生します。以下のポイントを意識しましょう。

  • 更新頻度が高いAPIにはキャッシュを使わない
  • ユーザー別のレスポンスにはキャッシュさせない
  • URLやパラメータでバージョン管理をする(例:?v=1.2
カテゴリの一覧へ
新着記事
Javaのラムダ式で戻り値とvoidの使い方を解説!returnの書き方も完全理解
Javaのメソッド参照とコンストラクタ参照の使い方を完全ガイド!初心者向けに::とClass::newを解説
Javaのラムダ式の書き方を徹底解説!アロー演算子->の基本と使い方
Thymeleafのth:eachの使い方!ループ回数やindexなどの繰り返し処理を学ぼう
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
Spring Boot JPA入門:エンティティ/リポジトリの基本と作り方
No.3
Java&Spring記事人気No3
Javaの@Validアノテーションを徹底解説!初心者でもわかる入力値検証の基本
No.4
Java&Spring記事人気No4
Springの@Repositoryアノテーションの使い方を徹底解説!初心者でもわかるSpringフレームワークのデータアクセス