본문 바로가기
Language/Java

[Webflux](보류)Java기반 Spring webflux 시작하기 - Handler방식

by 카프리썬 2022. 2. 1.
728x90

사실 나의 목표는 Intellj에서 gradle로 Kotiln기반 Spring webflux 프로젝트를 시작하는 것이다.

그런데 일단 코틀린기반으로 Webflux프로젝트를 진행한 사례를 찾기 쉽지 않았다.

그래서 우선 java기반으로 hello world를 먼저 찍어보고, 이걸 먼저 이해한다음에 kotiln으로 도전해봐야겠다..

 

그런데, 그 전에 java기반 코드를 작성할 수 있는 방법은 3가지가 있는것 같다.. (각 차이점은 사실 잘 모르겠다)

  • Handler기반 방식 : 현재글
  • RestController 방식 
  • Reactor 방식

으허,,..너무 산넘어 산이다ㅠㅠㅠ

 

728x90

1. New Project 생성

Intellj > New > New Project > Spring Initializr로 프로젝트를 바로 생성할 수 있다.

  • 프로젝트 언어 : Java
  • 프로젝트 타입 : gradle
  • 프로젝트 메타데이터 - group : build.gradle 파일의 group 정보로 들어갈 내용으로 자바의 root 패키지명
  • 프로젝트 메타데이터 - artifact : 프로젝트명
  • SDK 버전 : 1.8
  • 자바 버전 : 8

 

2. Dependecies 선택

참고로 spring boot1에서는 reactive가 지원되지 않기 때문에 스프링 버전은 2.6.3 을 사용한다. 

  • 스프링 버전 : 2.6.3
  • Reactive web : embedded Netty + Spring WebFlux가 있는 dependency
  • Thymeleaf template engine
  • Lombok 
  • Spring Data Reactive Redis

 

심플하게 Webflux를 사용할 수 있는 dependency Reactive web 이다.

사실 여기까진 이전에 kotiln으로 프로젝트 생성하는 방식과 같다. 

 

3. Java코드 작성

대신 이제 java 폴더가 생겼고,여기에 Java기반으로 코드를 작성해야하는게 차이점이다.

그리고 java기반 코드를 작성할 수 있는 방법은 3가지가 있다. (각 차이점은 사실 잘 모르겠다)

  • Handler기반 방식
  • RestController 방식
  • Reactor 방식

우선 이번 글에선 Handler기반 방식으로 구현된 예제만 기록해보려고한다. 

사실 그냥 MVC방법과 가장 비슷한거 같다. 그래서 아래와 같이 3가지 구조대로 코드를 작성해야한다. 

  • Handler
  • Router
  • WebClient

Handler 작성

Handler는 reqeust를 처리하고, repsonse를 만드는 부분이다. 

일단 이 예제에서는 "hello spring!" 을 리턴하도록 구현하였다. 

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;

@Component
public class GreetingHandler {

    public Mono<ServerResponse> hello(ServerRequest serverRequest){
        return ServerResponse
                .ok()
                .contentType(MediaType.TEXT_PLAIN)
                .body(BodyInserters.fromObject("Hello, Spring!"));
    }
}

 

Router 작성

Router는 API가 어떤경로로 들어왔을때 어디로 보낼건지 처리해주는 부분이다. 

여기에서는 /hello경로로 들어오면 greetinghandler로 보내겠다고 구현하였다. 

import com.example.webflux_java.handler.GreetingHandler;
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 GreetingRouter {

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

 

WebClient 작성 

MVC와 다르게 spring webflux에서는 webclient클래스를 제공한다. 

webclient는 어떤 URI(경로)로 들어올지 명시한다. 그리고 Mono 또는 Flux타입으로 어떻게 응답할지 명시한다. 

import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;

public class GreetingWebClient {
   private WebClient client = WebClient.create("http://localhost:8080";);

   private Mono<ClientResponse> result = client.get()
      .uri("/hello")
      .accept(MediaType.TEXT_PLAIN)
      .exchange();

   public String getResult(){
      return ">> result = " + result.flatMap(res -> res.bodyToMono(String.class)).block();
   }
}

 

Java Main Application 작성

그리고 최종적으로 메인함수에서 webclient 객체를 생성해서 원하는 함수(getResult)를 호출해준다. 

import com.example.webflux_java.client.GreetingWebClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebfluxJavaApplication {

    public static void main(String[] args) {

        SpringApplication.run(WebfluxJavaApplication.class, args);

        GreetingWebClient gwc = new GreetingWebClient();
        System.out.println(gwc.getResult());
    }

}

 

API 테스트

그럼 이제 프로젝트를 Run해본다 (webfluxJavaApplicaton Run)

그러면 main함수에서 출력하고자 한 내용을 볼 수 있고, api서버도 실행이 되서 /hello로 Request를 보내면 response를 확인할 수 있다. 

그런데 지금까지 이렇게 해본걸로 아직까진 뭔가 webflux를 제대로 느껴지지가 않는다..흠

 

 

참고

https://kimseunghyun76.tistory.com/449

 

[Getting Started]Building a Reactive RESTful Web Service

우아... Spring Boot 2.0 GA 정식 버전  출시를 기념으로 , 아마도 Reactive 에 대한 이야기들이 엄청나게 쏟아져 나올것이라고 예상합니다. 트윗에서도 가이드들이 하나 둘씩 쏟아져 나오고 있어서, 읽

kimseunghyun76.tistory.com

 

 



반응형