강좌/Spring WebFlux

WebFlux 첫 만남

여름나라겨울이야기 2018. 10. 24. 01:45
728x90

WebFlux 첫 만남

1. Spring WebFlux 프로젝트 만들기

  • https://start.spring.io/ 에 접속한다.

  • Dependencies 에서 Reactive Web 을 선택한다.

  • 나머지는 취향의 문제…​

    • start.spring.io

  • [Generate Project] 버튼을 클릭해서 zip 로 다운로드 받는다.

  • 다운로드 반은 zip 파일을 적당한 위치에서 압축 해제한다.

  • 본인이 선호하는 IDE 로 프로젝트를 오픈한다.

    • build.gradle 를 Open 해 주자

    • Open as Project 를 선택해 주자

    • 몇 가지 설정을 조정해 주자

    • Open 완료

2. Rest API 로 Hello WebFlux 찍어 보기

src\main\java\com\heaven\webflux01 폴더 밑 Webflux01Application.java 파일을 열도록 하자.

package com.heaven.webflux01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Webflux01Application {

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

웹 브라우저에서 "Hello WebFlux!!!" 라는 문자열을 찍어 보자.

package com.heaven.webflux01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Webflux01Application {
    @GetMapping("/hello")
    public String hello() {
        return "Hello WebFlux!!!";
    }

	public static void main(String[] args) {
		SpringApplication.run(Webflux01Application.class, args);
	}
}
  • @RestController 를 클래스 위에 선언해 주었다.

    • org.springframework.web.bind.annotation.RestController 를 import 해 주었다.

  • hello() 메소드를 추가해 주었다.

    • GetMapping 으로 Rest 요청을 처리할 수 있도록 했다.

    • org.springframework.web.bind.annotation.GetMapping 을 import 해 주었다.

Webflux01Application 을 실행하자.

Console 에 표시된 로그 중에 중요하게 기억해야 할 것들이 몇가지 살펴보자.

... : Mapped "{[/hello],methods=[GET]}" ...
... : Started HttpServer on /0:0:0:0:0:0:0:0:8080
... : Netty started on port(s): 8080
... : Started Webflux01Application in 11.763 seconds (JVM running for 23.812)
  • Mapped "{[/hello],methods=[GET]}"

    • /hello 웹 경로를 GET 방식으로 접근할 수 있다.

  • Netty started on port(s): 8080

    • Web Server 인 Nettoy 가 8080 포트로 구동되었다.

    • Tomcat 이 아니다. Netty 다 그럼 "Servlet 이여. 안녕!!!" 이다.

브라우저에서 http://localhost:8080/hello 로 접속해 보자.

  • IE 라니…​ 나의 Chrome 는 소중하니까!

여기까지 봤을 때 기존 WebMVC 와의 차이는 Tomcat 대신 Netty 를 쓴다는 것 외에는 차이가 없어 보인다. 하지만 그 차이는 사실 매우 크다. 더 이상 Servlet 스펙을 고려하지 않아도 된다는 것이다. 여기에 더해서 내부적으로 많이 변화가 더해졌다.

3. Reactor 사용해 보기

WebFlux 는 Reactor 를 사용한다. Reactor 는 Reactive Streams 의 구현체다.
Reactive Streams 는 http://www.reactive-streams.org 를 보면 알 수 있다고 한다.
Reactor 는 http://projectreactor.io/docs/core/release/reference/ 를 보면 알 수 있다고 한다.
웹문서를 차근 차근 읽어보는 것도 좋은 방법이겠으나 이미 많은 분들이 읽고 정리해 주신 내용으로 핵심만 골라 프로젝트에서 예제를 만들어 가며 이해해 보자.

Reactor 의 핵심은 Mono 와 Flux 이다.
Mono 는 값을 0 또는 1 개를 갖고 있는 컬렉션이다.
Flux 는 값을 0 개 이상 갖고 있는 컬렉션이다.
Mono 와 Flux 를 만드는 가장 쉬운 방법은 just 메소드에 값(들)을 나열하는 것이다.

예제를 만들어 보자.

package com.heaven.webflux01;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@SpringBootApplication
@RestController
public class Webflux01Application {
	@GetMapping("/hello")
	public String hello() {
		return "Hello WebFlux!!!";
	}

	@GetMapping("/hello/mono")
	public Mono helloMono() {
		return Mono.just("Hello Mono!!!");
	}

    @GetMapping("/hello/flux")
    public Flux helloFlux() {
        return Flux.just(
            "Hello Flux!!!",
            "Hello Reactor 3!!!",
            "Hello Reactive Streams!!!");
    }

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

프로젝트를 재실행 후에 각각 브라우저 접근해 보자.

  • Hello Mono!!!

  • Hello Flux!!!

웹 브라우저 사용자 입장에서는 차이가 없다는 것을 알 수 있다.
개발 입장에서도 차이가 없는 것 같지만…​ 위에 작성한 코드는 WebMVC 방식을 짬봉해서 만들어진 것이다.
향후 WebFlux 방식의 코딩으로 순수 함수형 스타일의 코드에 도전을…​
그런데 Reactor 부터 다시 말해, Mono 와 Flux 부터 학습을 좀 해야할 것 같다는…​

반응형

'강좌 > Spring WebFlux' 카테고리의 다른 글

WebClient & WebTestClient  (0) 2018.11.20
WebFlux HandlerFunction  (0) 2018.11.20
WebFlux RouteFunction  (0) 2018.11.05
Spring WebFlux 동영상 강좌 대방출  (0) 2018.10.18