웹플럭스 데모 with Intellij

요즘 리액티브라는 말을 많이 듣는다. 주변에 온통 개발자들 뿐이니 이야기 주제들도 모두 그렇기 떄문일거다. 그래서 인터넷에 검색해보면 머리가 나빠서 이해가 힘들다. 그래서 왜 쓰는건지, 어디에 적용할 수 있는건지 도통 알 수가 없다. 리액티브랑 웹플럭스는 또 무슨관계인지..

그냥 따라 해 보자.

설정

먼저 인텔리제이를 실행한다.

New Project를 선택한다.

Spring Initializer 를 선택하고 진행을 한다. JDK는 1.8로 진행하겠다.

흔히 설정하는 데로 알아서 넣는다.

Reactive Web 을 선택하면 스프링 웹플럭스가 자동으로 설정이 된다.

프로젝트 이름을 대충정한다. webFluxDemo 라고 지었다.

위 이미지와 같은 모양으로 되면 일단 설정이 된것 같은데?

샘플구현

이제는 이 웹플럭스 환경 위에서 코딩을 할 차례다.

먼저 주기적으로 데이터를 변경할수 있는 데모 쓰래드를 만든다.

import java.util.concurrent.TimeUnit;

public class DemoThread extends Thread{

    public void run() {
        loop(0);
    }

    private void loop(int i) {
        try {
            System.out.println(i);

            TimeUnit.SECONDS.sleep(5);
            DemoHandler.stream.put("count", i);

            loop(i+1);
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

데모 핸들러를 만든다. 생성자에서 데모 쓰래드를 호출한다.

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Component
public class DemoHandler {

    public final static Map<String, Object> stream = new HashMap<>();

    private Mono<Map<String, Object>> mono = Mono.just(stream);

    public Mono<ServerResponse> demo(ServerRequest request) {

        String query = request.queryParam("query").orElse("empty");

        mono.subscribe(x -> {
            System.out.println("query -> " + query + ", " + x);
        });

        return ServerResponse.ok()
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromProducer(mono, Map.class));
    }

    public DemoHandler() {
        DemoThread dt = new DemoThread();
        dt.start();
    }
}

URL맵핑을 위한 데모 라우터를 만든다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

@Configuration
public class DemoRouter {

    @Bean
    public RouterFunction<ServerResponse> route(DemoHandler handler) {
        return RouterFunctions.route(
                RequestPredicates.GET("/demo")
                        .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)), handler::demo);
    }
}

http://localhost:8080/demo 를 호출하면 JSON으로 {“count”, 0} 이라고 출력된다.

새로고침하면 카운트 숫자가 계속 증가된다.

샘플을 잘 만든건지 모르겠다.

그냥 단순히 스프링 MVC 와 다르게 개발을 하는 것 뿐인건가?

자료를 좀 더 찾아보자

웹플럭스는 비동기 프로그램을 좀더 잘하기 위한 방법인 것 같다. 내가 생각한 것과는 다른 내용인 것 같다. 그러면 뭔가 병렬로 처리되어야 하는 것들을 잘 처리하기 위해 나온 것이라고 보면될까? 그러면 병렬처리로 성능항상이 크게 있을 만한 곳에 사용하면 되는 거겠지?

회사가서 똑똑한 개발자들에게 물어보고 포스팅에 틀린 내용이 있다면 추후 수정하도록 하자.