Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

今こそ知りたいSpring Web(Spring Fest 2020講演資料)

今こそ知りたいSpring Web
(Spring Fest 2020講演資料)

2020年12月17日

株式会社NTTデータ 伊藤司

  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

今こそ知りたいSpring Web(Spring Fest 2020講演資料)

  1. 1. © 2020 NTT DATA Corporation 今こそ知りたいSpring Web Spring Fest 2020 2020/12/17 株式会社NTTデータ 伊藤司
  2. 2. © 2020 NTT DATA Corporation 2 自己紹介 @Bean SelfIntroduction selfIntroduction() { return SelfIntroduction.builder() .name("伊藤", "司") .company("株式会社NTTデータ") .role("アーキテクト") .work("一般企業向けのシステム開発") .work("フレームワークの技術検証") .work("コンテナ・k8sの技術検証") .hobby("ガンプラ") .build(); }
  3. 3. © 2020 NTT DATA Corporation 3 はじめに • 本セッションで話すこと • Springの2つのWebアプリケーションフレームワークの特徴・違い • Spring MVCの基本的な処理の流れ • Spring WebFluxの基本的な処理の流れ • 本セッションで出てくるサンプルコードはGitHubで公開しています • https://github.com/itoutki/introduction-to-spring-web
  4. 4. © 2020 NTT DATA Corporation 4 目次 1. 今こそ知りたいSpringのWebアプリケーションフレームワーク 2. 今こそ知りたいSpring MVC 3. 今こそ知りたいSpring WebFlux 4. まとめ
  5. 5. © 2020 NTT DATA Corporation 今こそ知りたいSpringの Webアプリケーションフレームワーク 5
  6. 6. © 2020 NTT DATA Corporation 6 Webアプリケーションとフレームワーク アプリケーションサーバ Webアプリケーション HTTP リクエスト Webアプリケーション フレームワーク HTML アプリケーションサーバ Webアプリケーション HTTP リクエスト Webアプリケーション フレームワーク JSON など 画面アプリケーション APIアプリケーション
  7. 7. © 2020 NTT DATA Corporation 7 SpringのWebアプリケーションフレームワーク Servlet Container Netty, Servlet 3.1+ Containers Servlet API Spring MVC Reactive Streams Adapters Spring WebFlux Servlet Stack Reactive Stack フレームワーク 抽象レイヤ アプリケーションサーバ
  8. 8. © 2020 NTT DATA Corporation 8 Spring MVCとは • サーブレットAPIに基づくWebアプリケーションフレー ムワーク • Tomcatなどのサーブレットコンテナ上で動作 • Spring Frameworkの初期から存在 • 画面アプリケーション向けの機能・APIアプリケーショ ン向けの機能ともに豊富 Servlet Container Servlet API Spring MVC Servlet Stack
  9. 9. © 2020 NTT DATA Corporation 9 Spring WebFluxとは • ノンブロッキングI/Oに基づくWebアプリケーションフ レームワーク • Nettyなどの非サーブレットのアプリケーションサーバ やServlet 3.1以降に対応したサーブレットコンテナ 上で動作 • Spring Framework 5.0から登場 • Reactorによるリアクティブプログラミングを採用 • APIアプリケーション向けの機能を中心に開発が進 められており画面アプリケーション向けの機能は未成 熟 Netty, Servlet 3.1+ Container Reactive Streams Adapters Spring WebFlux Reactive Stack
  10. 10. © 2020 NTT DATA Corporation 10 Spring MVCとSpring WebFluxの特徴(1)アーキテクチャ Spring MVCのアーキテクチャ Spring WebFluxのアーキテクチャ
  11. 11. © 2020 NTT DATA Corporation 11 Spring MVCとSpring WebFluxの特徴(2)リクエスト処理方式 スレッド1 スレッド2 スレッド3 スレッドN イベントループ スレッド Spring MVC Spring WebFlux ・・・ 1リクエストを1スレッドで処理 複数リクエストを1スレッドで処理
  12. 12. © 2020 NTT DATA Corporation 12 Spring MVCとSpring WebFluxの特徴(2)リクエスト処理方式 Spring MVC Spring WebFlux 実装し やすさ 処理を同期的に実装できる ノンブロッキングI/O、リアクティブプログラミング の理解が必要になる 機能性 スレッドローカルを前提とする機能が利用でき る(セッション、ロギングのMDCなど) スレッドローカルを前提とする機能が利用でき ない(ただしセッションは同等機能が用意さ れている) メモリ 使用量 多くのスレッドが必要になり、スレッドごとにメモ リの確保が必要になる スレッドが少なくてすむ CPU 利用 効率 ブロッキングI/Oのため、I/Oの待ち時間が発 生する ノンブロッキングI/Oのため、I/Oの待ち時間に 別の処理を実行できる スルー プット 高スループットの実現には多くのスレッドが必 要になる 遅いクライアントからの接続があるとその分ス レッドが解放されない 少ないスレッドで多くのリクエストを処理できる 遅いクライアントからの接続があっても影響が 小さい
  13. 13. © 2020 NTT DATA Corporation 13 Spring MVCとSpring WebFluxのユースケース例 Spring MVC Spring WebFlux 画面アプリケーション • 画面アプリケーション向けの機能が豊富 ブロッキング処理への依存があるアプリケーション • ブロッキング処理を前提とするSpring MVCと組み合わせたほうがよい 既存のSpring MVCアプリケーション • 現状に課題がなければSpring WebFluxに積極的に置き換える必要性は低い 高スループットが要求されるアプリケーション • Spring WebFluxの特性を生かしやすい 新規のAPIアプリケーション(マイクロサービスなど) • 省メモリでリソース効率の高いアプリケーションが実装できる • リアクティブプログラミングへの理解が必要となることには注意が必要
  14. 14. © 2020 NTT DATA Corporation 今こそ知りたいSpring MVC 14
  15. 15. © 2020 NTT DATA Corporation 15 Spring MVCとは • サーブレットAPIに基づくWebアプリケーションフレー ムワーク • Tomcatなどのサーブレットコンテナ上で動作 • Spring Frameworkの初期から存在 Servlet Container Servlet API Spring MVC Servlet Stack
  16. 16. © 2020 NTT DATA Corporation 16 Spring MVCのアーキテクチャ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦
  17. 17. © 2020 NTT DATA Corporation 17 Spring MVCの実装サンプル(画面アプリケーション) @Controller public class HelloMvcController { @GetMapping("/hello") public String handleHello(Model model) { String message = "Hello, Spring MVC!"; model.addAttribute("message", message); return "hello"; } } <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <p th:text="${message}"></p> </body> </html> Controller HelloMvcController Template hello.html 開発者が実装する部分 ControllerクラスとしてDIコンテナに登録するためのアノテーション Thymeleafのテンプレート
  18. 18. © 2020 NTT DATA Corporation 18 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ リクエストを受ける
  19. 19. © 2020 NTT DATA Corporation 19 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ URLやGET/POSTなど の条件からリクエストに マッチするメソッドを見つ ける
  20. 20. © 2020 NTT DATA Corporation 20 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ URLやGET/POSTなど の条件からリクエストに マッチするメソッドを見つ ける @Controller public class HelloMvcController { @GetMapping("/hello") public String handleHello(Model model) { String message = "Hello, Spring MVC!"; model.addAttribute("message", message); return "hello"; } } /hello というURLへのGETリクエストの場合、 handleHelloメソッドが選択される @PostMappingなどHTTPリクエストメソッドに対応 したアノテーションがある Controller
  21. 21. © 2020 NTT DATA Corporation 21 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ リクエストの内容をメソッ ドの引数に変換してメ ソッドに引き渡す
  22. 22. © 2020 NTT DATA Corporation 22 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ @Controller public class HelloMvcController { @GetMapping("/hello") public String handleHello(Model model) { String message = "Hello, Spring MVC!"; model.addAttribute("message", message); return "hello"; } } Modelオブジェクトが準備される リクエストの内容をメソッ ドの引数に変換してメ ソッドに引き渡す Controller
  23. 23. © 2020 NTT DATA Corporation 23 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ リクエストを処理し、Viewに 渡す値をModelに格納し、 View名を返す
  24. 24. © 2020 NTT DATA Corporation 24 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ @Controller public class HelloMvcController { @GetMapping("/hello") public String handleHello(Model model) { String message = "Hello, Spring MVC!"; model.addAttribute("message", message); return "hello"; } } Modelに文字列を格納 リクエストを処理し、Viewに 渡す値をModelに格納し、 View名を返す View名としてhelloを返す Controller
  25. 25. © 2020 NTT DATA Corporation 25 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ View名からViewの実装と Templateのパスを特定する
  26. 26. © 2020 NTT DATA Corporation 26 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ View名からViewの実装と Templateのパスを特定する 「View名:hello」から 「template/hello.html」を 特定
  27. 27. © 2020 NTT DATA Corporation 27 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ TemplateとModelの値から レスポンスを生成
  28. 28. © 2020 NTT DATA Corporation 28 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ TemplateとModelの値から レスポンスを生成 <!DOCTYPE html> <html lang="ja" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Hello</title> </head> <body> <p th:text="${message}"></p> </body> </html> Modelから「message」というキーで格納された文字 列「Hello, Spring MVC!」をテンプレートに当てはめる Template
  29. 29. © 2020 NTT DATA Corporation 29 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ レスポンスを返す
  30. 30. © 2020 NTT DATA Corporation 30 Spring MVCのアーキテクチャ(APIアプリケーション) Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤
  31. 31. © 2020 NTT DATA Corporation 31 Spring MVCの実装サンプル(APIアプリケーション) @RestController public class HelloMvcRestController { @GetMapping("/hellorest") public String handleHelloRest() { String message = "Hello, Spring MVC!"; return message; } } Controller HelloMvcRestController 開発者が実装する部分
  32. 32. © 2020 NTT DATA Corporation 32 Spring MVCの実装サンプル(APIアプリケーション) @RestController public class HelloMvcRestController { @GetMapping("/hellorest") public String handleHelloRest() { String message = "Hello, Spring MVC!"; return message; } } Controller HelloMvcRestController 開発者が実装する部分 @Controllerではなく@RestControllerを指定することで、View名を返すのではな く、レスポンスデータを返すことを指定する @RestController = @Controller + @ResponseBody View名ではなくレスポンスデータとして文字列を返す 文字列以外にも任意のクラスやResponseEntityクラスを返す ことできる 返り値は適切なHttpMessageConverterによってレスポンス データに変換される
  33. 33. © 2020 NTT DATA Corporation 33 Spring MVCのまとめ 画面アプリケーションの処理の流れ APIアプリケーションの処理の流れ @RestController public class HelloMvcRestController { @GetMapping("/hellorest") public String handleHelloRest() { String message = "Hello, Spring MVC!"; return message; } } @Controller public class HelloMvcController { @GetMapping("/hello") public String handleHello(Model model) { String message = "Hello, Spring MVC!"; model.addAttribute("message", message); return "hello"; } }
  34. 34. © 2020 NTT DATA Corporation 今こそ知りたいSpring WebFlux 34
  35. 35. © 2020 NTT DATA Corporation 35 Spring WebFluxとは • ノンブロッキングI/Oに基づくWebアプリケーションフ レームワーク • Nettyなどの非サーブレットのアプリケーションサーバ やServlet 3.1以降に対応したサーブレットコンテナ 上で動作 • Spring Framework 5.0から登場 • Reactorによるリアクティブプログラミングを採用 Netty, Servlet 3.1+ Container Reactive Streams Adapters Spring WebFlux Reactive Stack
  36. 36. © 2020 NTT DATA Corporation 36 Spring WebFluxのアーキテクチャ Dispatcher Handler Handler Mapping Handler Adapter HandlerResult Handler View Model Template Controller Spring WebFluxによって提供される部分 開発者が実装する部分 View Resolver ① ② ③ ④ ⑤ ⑥ ⑦
  37. 37. © 2020 NTT DATA Corporation 37 Spring WebFluxの処理の流れ Dispatcher Handler Handler Mapping Handler Adapter HandlerResult Handler View Model Template Controller Spring WebFluxによって提供される部分 開発者が実装する部分 View Resolver ① ② ③ ④ ⑤ ⑥ ⑦ リクエストを 受ける リクエストの内容を メソッドの引数に変 換してメソッドに引 き渡す リクエストにマッチする メソッドを見つける リクエストを処理し、 Viewに渡す値を Modelに格納し、 View名を返す View名からViewの 実装とTemplateの パスを特定する Templateと Modelの値から レスポンスを生成 レスポンスを 返す
  38. 38. © 2020 NTT DATA Corporation 38 Spring WebFluxのアーキテクチャ(APIアプリケーション) Dispatcher Handler Handler Mapping Handler Adapter HandlerResult Handler View Model Template Controller Spring WebFluxによって提供される部分 開発者が実装する部分 View Resolver ① ② ③ ④ ⑤ ⑥
  39. 39. © 2020 NTT DATA Corporation 39 Spring WebFluxの実装サンプル(APIアプリケーション) @RestController public class HelloWebFluxRestController { @GetMapping("/hellorest") public Mono<String> handleHelloRest() { String message = "Hello, Spring WebFlux!"; return Mono.just(message); } } Controller HelloWebFluxRestController 開発者が実装する部分
  40. 40. © 2020 NTT DATA Corporation 40 Spring WebFluxの実装サンプル(APIアプリケーション) @RestController public class HelloWebFluxRestController { @GetMapping("/hellorest") public Mono<String> handleHelloRest() { String message = "Hello, Spring WebFlux!"; return Mono.just(message); } } Controller HelloWebFluxRestController 開発者が実装する部分 @RestController、@GetMappingはSpring MVCと同様に 使える
  41. 41. © 2020 NTT DATA Corporation 41 Spring WebFluxの実装サンプル(APIアプリケーション) @RestController public class HelloWebFluxRestController { @GetMapping("/hellorest") public Mono<String> handleHelloRest() { String message = "Hello, Spring WebFlux!"; return Mono.just(message); } } Controller HelloWebFluxRestController 開発者が実装する部分 メソッドの返り値の型がMono<String> 文字列からMonoを生成して返す
  42. 42. © 2020 NTT DATA Corporation 42 Reactorとは • ノンブロッキング・非同期・イベントドリブンのプログラミングモデルであるリアクティブプログラミングの仕組みを提 供するライブラリ • リアクティブプログラミングの標準であるReactive Streamsに準拠 • Stream APIのような形で実装 Flux<T> 0個以上(無限も可)のデータを持つList/Streamのようなもの Mono<T> 0 or 1個のデータを持つObject/Optionalのようなもの
  43. 43. © 2020 NTT DATA Corporation 43 Reactorとは Stream APIとFluxの比較 List<Integer> input = Arrays.asList(1, 2, 3, 4, 5); List<Integer> output = input.stream() .filter(i -> i % 2 == 0) .map(i -> i * 2) .collect(Collectors.toList()); System.out.println(output); Flux<Integer> input = Flux.just(1, 2, 3, 4, 5); Flux<Integer> output = input .filter(i -> i % 2 == 0) .map(i -> i * 2); output.subscribe(i -> System.out.println(i)); Stream APIの例 Fluxの例 Stream APIと同様filter・mapなどの演算子がある subscribeされるまで何も実行されない =subscribeのイベントを契機に処理が実行される 整数のデータ列のうち、偶数のデータだけを抜き出して2倍する処理
  44. 44. © 2020 NTT DATA Corporation 44 Reactorとは もう少し複雑な例 Mono.just("Reactor Mono") // 文字列1個を発生させる .map(str -> String.format("Hello, %s!", str)) // 文字列を変換する .subscribe(System.out::println); // 標準出力に出力する => Hello, Reactor Mono! Flux.interval(Duration.ofSeconds(1)) // 1秒ごとにデータを発生させる .take(5) // 先頭の5個分のみを取得する .map(l -> LocalDateTime.now()) // 現在時刻を返す .subscribe(d -> Sytem.out.println(d)); // 現在時刻を標準出力に出力する => 2020-12-17T13:50:35.058993 2020-12-17T13:50:36.033929 2020-12-17T13:50:37.034292 2020-12-17T13:50:38.033898 2020-12-17T13:50:39.033848
  45. 45. © 2020 NTT DATA Corporation 45 Spring WebFluxの実装サンプル(APIアプリケーション) @RestController public class HelloWebFluxRestController { @GetMapping("/hellorest") public Mono<String> handleHelloRest() { String message = "Hello, Spring WebFlux!"; return Mono.just(message); } } Controller HelloWebFluxRestController 開発者が実装する部分 メソッドの返り値の型がMono<String> 文字列からMonoを生成して返す Monoはフレームワーク内部で subscribeされる
  46. 46. © 2020 NTT DATA Corporation 46 Spring WebFluxによるServer-Sent Eventsの実装例 @GetMapping("/interval") public Flux<Message> handleInterval() { return Flux.interval(Duration.ofSeconds(1)) .take(5) .map(l -> new Message(LocalDateTime.now().toString())); }
  47. 47. © 2020 NTT DATA Corporation 47 Spring WebFluxによるServer-Sent Eventsの実装例 @GetMapping("/interval") public Flux<Message> handleInterval() { return Flux.interval(Duration.ofSeconds(1)) .take(5) .map(l -> new Message(LocalDateTime.now().toString())); } メソッドの返り値の型にFluxを指定
  48. 48. © 2020 NTT DATA Corporation 48 Spring WebFluxによるServer-Sent Eventsの実装例 @GetMapping("/interval") public Flux<Message> handleInterval() { return Flux.interval(Duration.ofSeconds(1)) .take(5) .map(l -> new Message(LocalDateTime.now().toString())); } curl -H 'Accept: text/event-stream;' http://localhost:8080/interval => data:{"message": "2020-12-17T16:35:48.413935"} data:{"message": "2020-12-17T16:35:49.405907"} data:{"message": "2020-12-17T16:35:50.405909"} data:{"message": "2020-12-17T16:35:51.405992"} data:{"message": "2020-12-17T16:35:52.405936"} curl -H 'Accept: application/x-ndjson;' http://localhost:8080/interval => {"message": "2020-12-17T16:35:48.413935"} {"message": "2020-12-17T16:35:49.405907"} {"message": "2020-12-17T16:35:50.405909"} {"message": "2020-12-17T16:35:51.405992"} {"message": "2020-12-17T16:35:52.405936"} メソッドの返り値の型にFluxを指定 リクエスト時のAcceptヘッダでServer-Sent EventsのMIMEタイプを指定 1秒ごとにレスポンスデータが送信される
  49. 49. © 2020 NTT DATA Corporation 49 Spring WebFlux まとめ 画面アプリケーションの処理の流れ APIアプリケーションの処理の流れ Flux<T> 0個以上(無限も可)のデータ を持つList/Streamのようなもの Mono<T> 0 or 1個のデータを持つ Object/Optionalのようなもの
  50. 50. © 2020 NTT DATA Corporation まとめ 50
  51. 51. © 2020 NTT DATA Corporation 51 SpringのWebアプリケーションフレームワーク Servlet Container Netty, Servlet 3.1+ Containers Servlet API Spring MVC Reactive Streams Adapters Spring WebFlux Servlet Stack Reactive Stack Servletベース ノウハウが多く開発しやすい ノンブロッキングベース リソース効率が良い リアクティブプログラミングの理解が必要
  52. 52. © 2020 NTT DATA Corporation 52 Spring MVCをもっと詳しく知りたい • TERASOLUNA Server Framework for Java (5.x) Development Guideline • https://terasolunaorg.github.io/guideline/ • Spring徹底入門 • https://www.shoeisha.co.jp/book/detail/9784798142470 • 改訂新版 Spring入門 • https://gihyo.jp/book/2016/978-4-7741-8217-9 • 令和時代に「Spring入門」「Spring徹底入門」を読むとき気をつけるべきN個のこと • https://qiita.com/suke_masa/items/392976749fce94a8ef1f • 徹底解剖Spring MVCアーキテクチャー –DispacherServletの中身覗いてきました– • https://www.slideshare.net/ssuser070fa9/spring-fest-2019spring-mvc • Web on Servlet Stack(Spring MVC公式ドキュメント) • https://docs.spring.io/spring-framework/docs/current/reference/html/web.html
  53. 53. © 2020 NTT DATA Corporation 53 Spring WebFluxをもっと詳しく知りたい • Introdction to Spring WebFlux • https://www.slideshare.net/makingx/introduction-to-spring-webflux-jsug-sfa1 • Reactive Webアプリケーション – そしてSpring 5へ • https://www.slideshare.net/makingx/reactive-web-spring-5-jjugccc-cccef3 • Spring 5に備えるリアクティブプログラミング入門 • https://www.slideshare.net/TakuyaIwatsuka/spring-5 • 業務で使いたいSpring WebFluxによるReactiveプログラミング • https://speakerdeck.com/shintanimoto/introduction-to-reactive-programming-using-spring- webflux • Functional Spring Cookbook • https://docs.google.com/presentation/d/1-0NopTfA-CGiCNvKPDOH9ZDMHhazKuoT-_1R69Wp8qs • Web on Reactive Stack(Spring WebFlux公式ドキュメント) • https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html
  54. 54. © 2020 NTT DATA Corporation 54 宣伝 • IT Search+にてSpring WebFlux入門の連載始めました • Spring WebFlux・リアクティブプログラミングの入門記事のほか、HTTPクライアントのWebClientやDBアク セスのR2DBCの入門記事を掲載予定です • https://news.mynavi.jp/itsearch/article/devsoft/5260
  55. 55. © 2020 NTT DATA Corporation その他、記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

×