---
title: Spring WebFlux.fnハンズオン - 1. はじめに
tags: ["Spring WebFlux.fn Handson", "Reactor", "Reactor Netty", "Netty", "Spring 5", "Spring WebFlux", "Java", "Cloud Foundry", "Pivotal Web Services", "Pivotal Cloud Foundry"]
categories: ["Programming", "Java", "org", "springframework", "web", "reactive"]
date: 2019-06-26T17:56:32Z
updated: 1970-01-01T00:00:00Z
---

本ハンズオンで、次の図のような簡易家計簿のAPIサーバーをSpring WebFlux.fnを使って実装します。
あえてSpring BootもDependency Injectionも使わないシンプルなWebアプリとして実装します。

![image](https://user-images.githubusercontent.com/106908/58406552-d2bb6880-80a4-11e9-8edf-e22d6015ebef.png)

またメモリ使用量を抑えることで、Cloud Foundry([Pivotal Web Services](https://run.pivotal.io))上で安く運用し続けられるようにします。

[完成例](https://moneyger.cfapps.io/)

本ハンズオンはReactorの知識が必要になります。以下のハンズオンを事前に実施しておくことを強くオススメします。

* https://github.com/reactor/lite-rx-api-hands-on
* https://docs.google.com/presentation/d/1-0NopTfA-CGiCNvKPDOH9ZDMHhazKuoT-_1R69Wp8qs

完成版のソースコードは
https://github.com/making/webfluxfn-handson
です。各章毎にbranchを作成しています。

**ハンズオンコンテンツ**

1. [はじめに](/entries/500) 👈
1. [簡易家計簿Moneygerプロジェクトの作成](/entries/501)
1. [YAVIによるValidationの実装](/entries/502)
1. [R2DBCによるデータベースアクセス](/entries/503)
1. [Web UIの追加](/entries/504)
1. [例外ハンドリングの改善](/entries/505)
1. [収入APIの実装](/entries/506)
1. [Spring Bootアプリに変換](/entries/507)
1. [GraalVMのSubstrateVMでNative Imageにコンパイル](/entries/510)

### ウォームアップ

まずはSpring Bootを使ったSpring WebFlux.fnのHello World!アプリケーションを作成します。


以下のコマンドを実行すると、hello-fnフォルダに雛形プロジェクトが生成されます。Windowsの場合はGit BashなどのBash実行環境を利用してください。

```sh
curl https://start.spring.io/starter.tgz \
       -d artifactId=hello-fn \
       -d baseDir=hello-fn \
       -d packageName=com.example \
       -d dependencies=webflux \
       -d applicationName=HelloFnApplication | tar -xzvf -
```

`hello-fn/src/main/java/com/example/HelloFnApplication.java`を次のように修正してください。

```java
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
// ↓ここから追加
import org.springframework.context.annotation.Bean;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
// ↑ここまで

@SpringBootApplication
public class HelloFnApplication {

    // ↓ここから追加
    @Bean
    public RouterFunction<ServerResponse> routes() {
        return RouterFunctions.route()
            .GET("/", req -> ServerResponse.ok().syncBody("Hello World!"))
            .build();
    }
    // ↑ここまで

    public static void main(String[] args) {
        SpringApplication.run(HelloFnApplication.class, args);
    }

}
```

ビルドして実行してください。

> `syncBody`メソッドはSpring 5.2(Spring Boot 2.2)では`bodyValue`にrenameされます。

```
cd hello-fn
./mvnw clean package -DskipTests=true -DskipTests=true
java -jar target/hello-fn-0.0.1-SNAPSHOT.jar
```


```sh
$ curl localhost:8080
Hello World!
```

このあとはSpring Bootを使わない方法でアプリケーションを構築します。
