BLOG
ブログ
  • TOP
  • BLOG
  • JavaSpring入門_Interceptorとは?共通処理を差し込む仕組み

JavaSpring入門_Interceptorとは?共通処理を差し込む仕組み

JavaSpring入門_Interceptorとは?共通処理を差し込む仕組み

CONTENT

みなさんこんにちは!スタイラジーエンジニアのOです。

JavaやSpringを学習していると、Controller、Service、Repositoryといった構成はよく目にすると思います。一方で、実務では Interceptor という仕組みを見かけることがあります。

InterceptorはJavaの基本文法として学ぶものではなく、フレームワーク側で提供される仕組みです。そのため、初めて見ると「いつ動くのか」「何のために使うのか」が少し分かりづらいかもしれません。

今回は、Interceptorの考え方と、代表的な使い方について整理します。

■ Interceptorとは
Interceptorとは、本来の処理の前後に共通処理を差し込む仕組みです。

たとえば、Webアプリケーションでは以下のような処理を複数の場所で行いたいことがあります。
• ログ出力
• 認証チェック
• トークン付与

これらを毎回ControllerやServiceの中に直接書くと、同じような処理が複数箇所に散らばってしまいます。

Interceptorを使うことで、共通処理を一箇所にまとめ、本来の処理をシンプルに保つことができます。ただし、Interceptorという言葉は1種類だけを指すものではありません。

Spring MVCで使うInterceptorもあれば、外部API呼び出しで使うRestTemplate Interceptorもあります。

そのため、Interceptorを読むときは、何の処理に対するInterceptorなのかを意識すると理解しやすくなります。

■Interceptorの種類とその役割
Interceptorにはいくつか種類があります。また、Interceptorと似た役割を持つ仕組みもあるため、ここでは代表的なものを整理します。

・Spring MVC Interceptor
Spring MVC Interceptorは、Controllerの前後で動作するInterceptorです。リクエストがControllerに渡る前にログを出力したり、認証チェックを行ったりする場合に使われます。

Spring MVCの設定ファイルに対象パスを定義することで、「どのURLに対してInterceptorを動かすか」を指定できます。

・RestTemplate Interceptor
RestTemplate Interceptorは、外部APIを呼び出す前後で動作するInterceptorです。自分のアプリケーションから外部システムへHTTPリクエストを送信する際に、リクエストヘッダへトークンを付与したり、通信ログを出力したりする場合に使われます。

Spring MVC Interceptorが「外から来たリクエスト」を対象にするのに対して、RestTemplate Interceptorは「外部へ送るリクエスト」を対象にする点が異なります。

・AOP
AOPは、ControllerやServiceなどのメソッド実行前後に共通処理を差し込む仕組みです。代表的な例として、@Transactional によるトランザクション制御があります。

Serviceメソッドの実行前後でログを出したい場合や、例外発生時の処理を共通化したい場合などにも使われます。

・Servlet Filter
Servlet Filterは、Spring MVCに入る前の入口付近で動作する仕組みです。文字コード設定、CORS対応、セキュリティ系の処理など、Webアプリケーション全体に関わる処理で使われることがあります。

Spring MVC Interceptorよりも前段で動くため、より広い範囲のリクエストを対象にしたい場合に使われます。

■使用例
Spring MVC InterceptorとRestTemplate Interceptorについて、具体的な使用方法を紹介します。
・Spring MVC Interceptor
Spring MVC Interceptorは、spring-mvc.xml などに定義できます。

<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/**" />
<mvc:exclude-mapping path="/api/healthcheck" />
<bean class="" />
</mvc:interceptor>
</mvc:interceptors>

この例では、/api/** に一致するリクエストに対して SampleInterceptor が実行されます。ただし、/api/healthcheck は exclude-mapping に指定されているため、Interceptorは実行されません。

つまり、mappingに一致し、exclude-mappingに一致しない場合のみInterceptorが動くということです。

実際の処理内容は、指定したInterceptorクラス側に実装します。たとえば、Controller実行前にログ出力や認証チェックを行う、といった処理を記載します。

・RestTemplate Interceptor
RestTemplate Interceptorは、RestTemplateで外部APIを呼び出すときに動作します。Controllerの前で動くのではなく、RestTemplateを使ってHTTP通信を行うタイミングで動く点がポイントです。

<bean id="sampleRestTemplate" class="">
<property name="interceptors">
<list>
<ref bean="tokenInterceptor" />
<ref bean="loggingInterceptor" />
</list>
</property>
</bean>
<bean id="tokenInterceptor" class="" />
<bean id="loggingInterceptor" class="" />

この例では、Service内で sampleRestTemplate を使って外部APIを呼び出した場合に、tokenInterceptor と loggingInterceptor が実行されます。

■おわりに
今回は、Interceptorの基本的な考え方と、代表的な種類について紹介しました。

Interceptorは、本来の処理の前後に共通処理を差し込む仕組みです。ただし、Interceptorという名前が出てきたときに、すべてが同じものを指しているとは限りません。

Interceptorの考え方を理解しておくと、既存プロジェクトの設定ファイルや処理の流れを追いやすくなると思います。