SlideShare una empresa de Scribd logo
1 de 55
© 2020 NTT DATA Corporation
今こそ知りたいSpring Web
Spring Fest 2020 2020/12/17
株式会社NTTデータ 伊藤司
© 2020 NTT DATA Corporation 2
自己紹介
@Bean
SelfIntroduction selfIntroduction() {
return SelfIntroduction.builder()
.name("伊藤", "司")
.company("株式会社NTTデータ")
.role("アーキテクト")
.work("一般企業向けのシステム開発")
.work("フレームワークの技術検証")
.work("コンテナ・k8sの技術検証")
.hobby("ガンプラ")
.build();
}
© 2020 NTT DATA Corporation 3
はじめに
• 本セッションで話すこと
• Springの2つのWebアプリケーションフレームワークの特徴・違い
• Spring MVCの基本的な処理の流れ
• Spring WebFluxの基本的な処理の流れ
• 本セッションで出てくるサンプルコードはGitHubで公開しています
• https://github.com/itoutki/introduction-to-spring-web
© 2020 NTT DATA Corporation 4
目次
1. 今こそ知りたいSpringのWebアプリケーションフレームワーク
2. 今こそ知りたいSpring MVC
3. 今こそ知りたいSpring WebFlux
4. まとめ
© 2020 NTT DATA Corporation
今こそ知りたいSpringの
Webアプリケーションフレームワーク
5
© 2020 NTT DATA Corporation 6
Webアプリケーションとフレームワーク
アプリケーションサーバ
Webアプリケーション
HTTP
リクエスト
Webアプリケーション
フレームワーク
HTML
アプリケーションサーバ
Webアプリケーション
HTTP
リクエスト
Webアプリケーション
フレームワーク
JSON
など
画面アプリケーション APIアプリケーション
© 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
フレームワーク
抽象レイヤ
アプリケーションサーバ
© 2020 NTT DATA Corporation 8
Spring MVCとは
• サーブレットAPIに基づくWebアプリケーションフレー
ムワーク
• Tomcatなどのサーブレットコンテナ上で動作
• Spring Frameworkの初期から存在
• 画面アプリケーション向けの機能・APIアプリケーショ
ン向けの機能ともに豊富
Servlet Container
Servlet API
Spring MVC
Servlet Stack
© 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
© 2020 NTT DATA Corporation 10
Spring MVCとSpring WebFluxの特徴(1)アーキテクチャ
Spring MVCのアーキテクチャ Spring WebFluxのアーキテクチャ
© 2020 NTT DATA Corporation 11
Spring MVCとSpring WebFluxの特徴(2)リクエスト処理方式
スレッド1
スレッド2
スレッド3
スレッドN
イベントループ
スレッド
Spring MVC Spring WebFlux
・・・
1リクエストを1スレッドで処理 複数リクエストを1スレッドで処理
© 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の待ち時間に
別の処理を実行できる
スルー
プット
高スループットの実現には多くのスレッドが必
要になる
遅いクライアントからの接続があるとその分ス
レッドが解放されない
少ないスレッドで多くのリクエストを処理できる
遅いクライアントからの接続があっても影響が
小さい
© 2020 NTT DATA Corporation 13
Spring MVCとSpring WebFluxのユースケース例
Spring MVC
Spring WebFlux
画面アプリケーション
• 画面アプリケーション向けの機能が豊富
ブロッキング処理への依存があるアプリケーション
• ブロッキング処理を前提とするSpring MVCと組み合わせたほうがよい
既存のSpring MVCアプリケーション
• 現状に課題がなければSpring WebFluxに積極的に置き換える必要性は低い
高スループットが要求されるアプリケーション
• Spring WebFluxの特性を生かしやすい
新規のAPIアプリケーション(マイクロサービスなど)
• 省メモリでリソース効率の高いアプリケーションが実装できる
• リアクティブプログラミングへの理解が必要となることには注意が必要
© 2020 NTT DATA Corporation
今こそ知りたいSpring MVC
14
© 2020 NTT DATA Corporation 15
Spring MVCとは
• サーブレットAPIに基づくWebアプリケーションフレー
ムワーク
• Tomcatなどのサーブレットコンテナ上で動作
• Spring Frameworkの初期から存在
Servlet Container
Servlet API
Spring MVC
Servlet Stack
© 2020 NTT DATA Corporation 16
Spring MVCのアーキテクチャ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
© 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のテンプレート
© 2020 NTT DATA Corporation 18
Spring MVCの処理の流れ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
リクエストを受ける
© 2020 NTT DATA Corporation 19
Spring MVCの処理の流れ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
URLやGET/POSTなど
の条件からリクエストに
マッチするメソッドを見つ
ける
© 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
© 2020 NTT DATA Corporation 21
Spring MVCの処理の流れ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
リクエストの内容をメソッ
ドの引数に変換してメ
ソッドに引き渡す
© 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
© 2020 NTT DATA Corporation 23
Spring MVCの処理の流れ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
リクエストを処理し、Viewに
渡す値をModelに格納し、
View名を返す
© 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
© 2020 NTT DATA Corporation 25
Spring MVCの処理の流れ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
View名からViewの実装と
Templateのパスを特定する
© 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」を
特定
© 2020 NTT DATA Corporation 27
Spring MVCの処理の流れ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
TemplateとModelの値から
レスポンスを生成
© 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
© 2020 NTT DATA Corporation 29
Spring MVCの処理の流れ
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
⑥
⑦
レスポンスを返す
© 2020 NTT DATA Corporation 30
Spring MVCのアーキテクチャ(APIアプリケーション)
Dispatcher
Servlet
Handler
Mapping
Handler
Adapter
View
Resolver
View
Model
Template
Controller
Spring MVCによって提供される部分 開発者が実装する部分
①
②
③ ④
⑤
© 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
開発者が実装する部分
© 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によってレスポンス
データに変換される
© 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";
}
}
© 2020 NTT DATA Corporation
今こそ知りたいSpring WebFlux
34
© 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
© 2020 NTT DATA Corporation 36
Spring WebFluxのアーキテクチャ
Dispatcher
Handler
Handler
Mapping
Handler
Adapter
HandlerResult
Handler
View
Model
Template
Controller
Spring WebFluxによって提供される部分 開発者が実装する部分
View
Resolver
①
②
③ ④
⑤
⑥
⑦
© 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の値から
レスポンスを生成
レスポンスを
返す
© 2020 NTT DATA Corporation 38
Spring WebFluxのアーキテクチャ(APIアプリケーション)
Dispatcher
Handler
Handler
Mapping
Handler
Adapter
HandlerResult
Handler
View
Model
Template
Controller
Spring WebFluxによって提供される部分 開発者が実装する部分
View
Resolver
①
②
③ ④
⑤
⑥
© 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
開発者が実装する部分
© 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と同様に
使える
© 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を生成して返す
© 2020 NTT DATA Corporation 42
Reactorとは
• ノンブロッキング・非同期・イベントドリブンのプログラミングモデルであるリアクティブプログラミングの仕組みを提
供するライブラリ
• リアクティブプログラミングの標準であるReactive Streamsに準拠
• Stream APIのような形で実装
Flux<T> 0個以上(無限も可)のデータを持つList/Streamのようなもの
Mono<T> 0 or 1個のデータを持つObject/Optionalのようなもの
© 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倍する処理
© 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
© 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される
© 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()));
}
© 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を指定
© 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秒ごとにレスポンスデータが送信される
© 2020 NTT DATA Corporation 49
Spring WebFlux まとめ
画面アプリケーションの処理の流れ
APIアプリケーションの処理の流れ
Flux<T>
0個以上(無限も可)のデータ
を持つList/Streamのようなもの
Mono<T>
0 or 1個のデータを持つ
Object/Optionalのようなもの
© 2020 NTT DATA Corporation
まとめ
50
© 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ベース
ノウハウが多く開発しやすい
ノンブロッキングベース
リソース効率が良い
リアクティブプログラミングの理解が必要
© 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
© 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
© 2020 NTT DATA Corporation 54
宣伝
• IT Search+にてSpring WebFlux入門の連載始めました
• Spring WebFlux・リアクティブプログラミングの入門記事のほか、HTTPクライアントのWebClientやDBアク
セスのR2DBCの入門記事を掲載予定です
• https://news.mynavi.jp/itsearch/article/devsoft/5260
© 2020 NTT DATA Corporation
その他、記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
フロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkanフロー効率性とリソース効率性、再入門 #devlove #devkan
フロー効率性とリソース効率性、再入門 #devlove #devkan
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
Apache Kafkaって本当に大丈夫?~故障検証のオーバービューと興味深い挙動の紹介~
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
 
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
 
Keycloakの最近のトピック
Keycloakの最近のトピックKeycloakの最近のトピック
Keycloakの最近のトピック
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
 
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
実践!OpenTelemetry と OSS を使った Observability 基盤の構築(CloudNative Days Tokyo 2022 発...
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 

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

[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
david9142
 
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組みモバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
MorioImai
 
One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~
One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~
One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~
Akira Inoue
 

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

ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発ASP.NET MVC と jQuery で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 
システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方システムのモダナイズ 落ちても良いアプリの作り方
システムのモダナイズ 落ちても良いアプリの作り方
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発
 
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
 
Vue入門
Vue入門Vue入門
Vue入門
 
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組みモバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
 
App Modernization for .NET
App Modernization for .NETApp Modernization for .NET
App Modernization for .NET
 
ASP.NET Core WebAPIでODataを使おう
ASP.NET Core WebAPIでODataを使おうASP.NET Core WebAPIでODataを使おう
ASP.NET Core WebAPIでODataを使おう
 
話題のNode-REDでIoTアプリを作ってみよう
話題のNode-REDでIoTアプリを作ってみよう話題のNode-REDでIoTアプリを作ってみよう
話題のNode-REDでIoTアプリを作ってみよう
 
patterns & practices "Project Silk" に見る HTML5 とモダンブラウザのための Web 開発の今後
patterns & practices "Project Silk" に見る HTML5 とモダンブラウザのための Web 開発の今後patterns & practices "Project Silk" に見る HTML5 とモダンブラウザのための Web 開発の今後
patterns & practices "Project Silk" に見る HTML5 とモダンブラウザのための Web 開発の今後
 
Angularreflex20141210
Angularreflex20141210Angularreflex20141210
Angularreflex20141210
 
One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~
One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~
One ASP.NET ~ 今、ASP.NET に何が起こっているのか? ~
 
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
どうやって決める?kubernetesでのシークレット管理方法(Cloud Native Days 2020 発表資料)
 
Clrh 110716 wcfwf
Clrh 110716 wcfwfClrh 110716 wcfwf
Clrh 110716 wcfwf
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
 
TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介TypeScript製フレームワーク「Nest」のご紹介
TypeScript製フレームワーク「Nest」のご紹介
 
ASP.NET MVC 1.0
ASP.NET MVC 1.0ASP.NET MVC 1.0
ASP.NET MVC 1.0
 
2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF2015 0227 OSC-Spring Tokyo NETMF
2015 0227 OSC-Spring Tokyo NETMF
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソ
 

Más de NTT DATA Technology & Innovation

Más de NTT DATA Technology & Innovation (20)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
OSSデータベースの開発コミュニティに参加しよう! (DEIM2024 発表資料)
 
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
COPY FROMで異常データをスキップできるようになった話(第45回 PostgreSQLアンカンファレンス@オンライン 発表資料)
 
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
Cloud Skills Challenge 2023 winter 〜Azureを頑張る理由と頑張り方
 
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
Unlocking Transformation: Implementing GitOps Practices in Conservative Organ...
 
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
Databricksチューニングあれこれ(JEDAI 2023 X‘mas/忘年会 Meetup! LT登壇資料)
 
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
詳説探究!Cloud Native Databaseの現在地点(CloudNative Days Tokyo 2023 発表資料)
 
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
 
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
 
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
pgvectorを使ってChatGPTとPostgreSQLを連携してみよう!(PostgreSQL Conference Japan 2023 発表資料)
 
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
マネージドPostgreSQLの実現に向けたPostgreSQL機能向上(PostgreSQL Conference Japan 2023 発表資料)
 
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
最新機能までを総ざらい!PostgreSQLの注目機能を振り返る(第32回 中国地方DB勉強会 in 岡山 発表資料)
 
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
PostgreSQLのバグとの付き合い方 ~バグの調査からコミュニティへの報告、修正パッチ投稿まで~(Open Source Conference 202...
 
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
骨抜きアジャイルの骨を生み出す 〜私(スクラムマスター)のXP学習記録〜(XP祭り2023 発表資料)
 
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
機械学習モデルを REST API としてサービングするシステム開発における上流プロセスの絞り込みと効果検証(PM学会2023年度秋季研究発表大会 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
ChatGPTのデータソースにPostgreSQLを使う[詳細版](オープンデベロッパーズカンファレンス2023 発表資料)
 
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
PostgreSQL on Kubernetes: Realizing High Availability with PGO (Postgres Ibiz...
 
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
オンプレミス回帰の動きに備えよ ~クラウドの手法をオンプレミスでも実現するには~(CloudNative Days Fukuoka 2023 発表資料)
 
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
Prometheus Operator 入門(Kubernetes Novice Tokyo #26 発表資料)
 
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
ChatGPTのデータソースにPostgreSQLを使う(第42回PostgreSQLアンカンファレンス@オンライン 発表資料)
 

Último

Último (11)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 

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

  • 1. © 2020 NTT DATA Corporation 今こそ知りたいSpring Web Spring Fest 2020 2020/12/17 株式会社NTTデータ 伊藤司
  • 2. © 2020 NTT DATA Corporation 2 自己紹介 @Bean SelfIntroduction selfIntroduction() { return SelfIntroduction.builder() .name("伊藤", "司") .company("株式会社NTTデータ") .role("アーキテクト") .work("一般企業向けのシステム開発") .work("フレームワークの技術検証") .work("コンテナ・k8sの技術検証") .hobby("ガンプラ") .build(); }
  • 3. © 2020 NTT DATA Corporation 3 はじめに • 本セッションで話すこと • Springの2つのWebアプリケーションフレームワークの特徴・違い • Spring MVCの基本的な処理の流れ • Spring WebFluxの基本的な処理の流れ • 本セッションで出てくるサンプルコードはGitHubで公開しています • https://github.com/itoutki/introduction-to-spring-web
  • 4. © 2020 NTT DATA Corporation 4 目次 1. 今こそ知りたいSpringのWebアプリケーションフレームワーク 2. 今こそ知りたいSpring MVC 3. 今こそ知りたいSpring WebFlux 4. まとめ
  • 5. © 2020 NTT DATA Corporation 今こそ知りたいSpringの Webアプリケーションフレームワーク 5
  • 6. © 2020 NTT DATA Corporation 6 Webアプリケーションとフレームワーク アプリケーションサーバ Webアプリケーション HTTP リクエスト Webアプリケーション フレームワーク HTML アプリケーションサーバ Webアプリケーション HTTP リクエスト Webアプリケーション フレームワーク JSON など 画面アプリケーション APIアプリケーション
  • 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. © 2020 NTT DATA Corporation 8 Spring MVCとは • サーブレットAPIに基づくWebアプリケーションフレー ムワーク • Tomcatなどのサーブレットコンテナ上で動作 • Spring Frameworkの初期から存在 • 画面アプリケーション向けの機能・APIアプリケーショ ン向けの機能ともに豊富 Servlet Container Servlet API Spring MVC Servlet Stack
  • 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. © 2020 NTT DATA Corporation 10 Spring MVCとSpring WebFluxの特徴(1)アーキテクチャ Spring MVCのアーキテクチャ Spring WebFluxのアーキテクチャ
  • 11. © 2020 NTT DATA Corporation 11 Spring MVCとSpring WebFluxの特徴(2)リクエスト処理方式 スレッド1 スレッド2 スレッド3 スレッドN イベントループ スレッド Spring MVC Spring WebFlux ・・・ 1リクエストを1スレッドで処理 複数リクエストを1スレッドで処理
  • 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. © 2020 NTT DATA Corporation 13 Spring MVCとSpring WebFluxのユースケース例 Spring MVC Spring WebFlux 画面アプリケーション • 画面アプリケーション向けの機能が豊富 ブロッキング処理への依存があるアプリケーション • ブロッキング処理を前提とするSpring MVCと組み合わせたほうがよい 既存のSpring MVCアプリケーション • 現状に課題がなければSpring WebFluxに積極的に置き換える必要性は低い 高スループットが要求されるアプリケーション • Spring WebFluxの特性を生かしやすい 新規のAPIアプリケーション(マイクロサービスなど) • 省メモリでリソース効率の高いアプリケーションが実装できる • リアクティブプログラミングへの理解が必要となることには注意が必要
  • 14. © 2020 NTT DATA Corporation 今こそ知りたいSpring MVC 14
  • 15. © 2020 NTT DATA Corporation 15 Spring MVCとは • サーブレットAPIに基づくWebアプリケーションフレー ムワーク • Tomcatなどのサーブレットコンテナ上で動作 • Spring Frameworkの初期から存在 Servlet Container Servlet API Spring MVC Servlet Stack
  • 16. © 2020 NTT DATA Corporation 16 Spring MVCのアーキテクチャ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦
  • 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. © 2020 NTT DATA Corporation 18 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ リクエストを受ける
  • 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. © 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. © 2020 NTT DATA Corporation 21 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ リクエストの内容をメソッ ドの引数に変換してメ ソッドに引き渡す
  • 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. © 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. © 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. © 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. © 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. © 2020 NTT DATA Corporation 27 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ TemplateとModelの値から レスポンスを生成
  • 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. © 2020 NTT DATA Corporation 29 Spring MVCの処理の流れ Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤ ⑥ ⑦ レスポンスを返す
  • 30. © 2020 NTT DATA Corporation 30 Spring MVCのアーキテクチャ(APIアプリケーション) Dispatcher Servlet Handler Mapping Handler Adapter View Resolver View Model Template Controller Spring MVCによって提供される部分 開発者が実装する部分 ① ② ③ ④ ⑤
  • 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. © 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. © 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. © 2020 NTT DATA Corporation 今こそ知りたいSpring WebFlux 34
  • 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. © 2020 NTT DATA Corporation 36 Spring WebFluxのアーキテクチャ Dispatcher Handler Handler Mapping Handler Adapter HandlerResult Handler View Model Template Controller Spring WebFluxによって提供される部分 開発者が実装する部分 View Resolver ① ② ③ ④ ⑤ ⑥ ⑦
  • 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. © 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. © 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. © 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. © 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. © 2020 NTT DATA Corporation 42 Reactorとは • ノンブロッキング・非同期・イベントドリブンのプログラミングモデルであるリアクティブプログラミングの仕組みを提 供するライブラリ • リアクティブプログラミングの標準であるReactive Streamsに準拠 • Stream APIのような形で実装 Flux<T> 0個以上(無限も可)のデータを持つList/Streamのようなもの Mono<T> 0 or 1個のデータを持つObject/Optionalのようなもの
  • 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. © 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. © 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. © 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. © 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. © 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. © 2020 NTT DATA Corporation 49 Spring WebFlux まとめ 画面アプリケーションの処理の流れ APIアプリケーションの処理の流れ Flux<T> 0個以上(無限も可)のデータ を持つList/Streamのようなもの Mono<T> 0 or 1個のデータを持つ Object/Optionalのようなもの
  • 50. © 2020 NTT DATA Corporation まとめ 50
  • 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. © 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. © 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. © 2020 NTT DATA Corporation 54 宣伝 • IT Search+にてSpring WebFlux入門の連載始めました • Spring WebFlux・リアクティブプログラミングの入門記事のほか、HTTPクライアントのWebClientやDBアク セスのR2DBCの入門記事を掲載予定です • https://news.mynavi.jp/itsearch/article/devsoft/5260
  • 55. © 2020 NTT DATA Corporation その他、記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。