まえがき
APIからAPIをコールする場合や、テストプログラム内からAPIをコールしたい場合に「何使えばいいの?」というところで以下の3つが挙げられる。
・RestTemplate(org.springframework.web.client.RestTemplate)
・WebClient(org.springframework.web.reactive.function.client.WebClient)
・MockMvc(org.springframework.test.web.servlet.MockMvc)
いずれもSpringFrameworkで提供されているやつだが、どういう時にどれを使えばいいのかちゃんと理解できていなかったので、この記事でまとめていく。
比較表
特徴 | |
---|---|
RestTemplate | ・Spring提供のAPIクライアントライブラリ ・APIレスポンスが返ってくるまでスレッドは待機状態となる。 |
WebClient | ・Spring WebFlux提供のAPIクライアントライブラリ ・APIレスポンスを待機せずスレッドは処理を進める。 |
MockMvc | ・テスト時のAPIコール用(パッケージ名に"test"が含まれているくらいだし) |
Spring WebFluxって何?
リアクティブプログラミングによってノンブロッキングで非同期なアプリケーションを開発できるSpring Framework
リアクティブプログラミング って何?
データストリームと変更の伝播に関係する宣言型プログラミングパラダイム
「データストリームと変更の伝播」が一体何を指しているのか、下記の記事が分かりやすかったのでおすすめ。
ノンブロッキングで非同期なアプリケーション って何?
・ノンブロッキングとは「スレッドをブロックしない(待機状態としない)」ことを指す。
・Tomcatは1リクエストを処理するのに1スレッドを割り当てるのだが、このリクエスト内で取得に時間のかかる外部APIをコールする処理がある場合に、この外部APIのレスポンスが返ってくるまでスレッドは待機状態となる。これが"スレッド"がブロッキングされている状態である。Spring MVC(RestTemplate)ではブロッキングされるが、Spring WebFlux(WebClient)ではノンブロッキングを実現できる。
・「外部APIのレスポンスを待たずに後続処理を続けられる」ことから、非同期なアプリケーションと呼ばれる。
ブロッキングとノンブロッキングの違い
実際にRestTemplate(ブロッキング)とWebClient(ノンブロッキング)で動作検証しているサイトで、わかりやすいサイトがあったので掲載させていただく。
RestTemplate
下記参照。
WebClient
下記参照。
MockMvc
下記参照。