Spring Webflux란?

YoungWhan Kim·2023년 3월 28일
0

Spring

목록 보기
3/5
post-thumbnail

Spring Webflux는 Reactive Programming을 지원하는 Spring Framework의 모듈 중 하나다. Reactive Programming은 비동기적인 데이터 처리를 통해 더 높은 성능과 효율성을 제공하는 프로그래밍 패러다임이다.

Spring Webflux는 이러한 Reactive Programming 패러다임을 기반으로 하며, Non-Blocking I/O 작업을 수행하는데 적합한 Web Application을 개발할 수 있게 도와준다.

Spring Webflux의 특징

  • Spring Webflux는 Netty, Undertow와 같은 Non-Blocking I/O 서버를 기반으로 동작한다.
  • Reactive Stream을 사용하여 비동기적인 데이터 흐름을 처리한다.
  • 함수형 프로그래밍 패러다임을 지원한다.
  • 반응형 프로그래밍을 위한 Flux와 Mono라는 두 가지 유형의 데이터 스트림을 제공한다.

Spring Webflux 예제

1. 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2. Handler 구현

@Component
public class SampleHandler {
    public Mono<ServerResponse> hello(ServerRequest request) {
        return ServerResponse.ok().body(BodyInserters.fromObject("Hello, World!"));
    }
}

3. Router 구현

@Configuration
public class SampleRouter {
    @Autowired
    private SampleHandler handler;

    @Bean
    public RouterFunction<ServerResponse> route() {
        return RouterFunctions.route(RequestPredicates.GET("/hello"), handler::hello);
    }
}

4. 실행

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

위 예제에서는 Spring Webflux를 사용하여 간단한 "Hello, World!" 메시지를 반환하는 RESTful API를 구현하였다.

5. 테스트

curl <http://localhost:8080/hello>

위의 명령어를 실행하면 "Hello, World!" 메시지가 반환된다.

Spring Webflux의 장단점

장점

  • Reactive Programming 패러다임을 따르기 때문에, Non-Blocking I/O 작업을 수행할 때 높은 성능과 효율성을 제공한다.
  • Spring Webflux는 비동기 작업을 수행하는데 적합한 Web Application을 개발할 수 있게 도와준다.
  • Reactive Stream을 사용하기 때문에 Backpressure 문제를 해결할 수 있다.

단점

  • 기존의 Spring MVC와는 다른 패러다임을 따르기 때문에, 학습 곡선이 높을 수 있다.
  • 기존의 Spring MVC와는 다른 패러다임을 따르기 때문에, 코드의 가독성이 떨어질 수 있다.

Websocket with Webflux

Spring Webflux와 WebSockets를 사용하여 채팅 서버를 구현하는 방법을 설명하겠다.

1. 의존성 추가

먼저, pom.xml 파일에 다음과 같은 의존성을 추가:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2. WebSocketHandler 구현

WebSocketHandler를 구현하여 들어오는 WebSocket 메시지를 처리한다:

@Component
public class ChatHandler implements WebSocketHandler {

    private final FluxProcessor<String, String> processor;
    private final FluxSink<String> sink;

    public ChatHandler() {
        this.processor = DirectProcessor.<String>create().serialize();
        this.sink = processor.sink();
    }

    @Override
    public Mono<Void> handle(WebSocketSession session) {
        Flux<String> output = processor.map(msg -> session.getId() + ": " + msg);
        session.send(output.map(session::textMessage))
               .and(session.receive()
                            .map(WebSocketMessage::getPayloadAsText)
                            .doOnNext(sink::next)
                            .then())
               .subscribe();
        return Mono.never();
    }
}

3. WebSocketConfigurer 구현

WebSocketConfigurer를 구현하여 WebSocketHandler를 등록합한다:

@Configuration
public class ChatConfiguration implements WebSocketConfigurer {

    @Autowired
    private ChatHandler chatHandler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(chatHandler, "/chat");
    }
}

4. 프론트엔드 생성

채팅 서버에 연결할 수 있는 간단한 HTML 페이지를 만든다:

<!DOCTYPE html>
<html>
<head>
    <title>Chat</title>
</head>
<body>
    <input type="text" id="messageInput" placeholder="Type a message...">
    <button id="sendButton">Send</button>
    <ul id="messages"></ul>
    <script>
        const socket = new WebSocket("ws://" + window.location.host + "/chat");
        const messageInput = document.getElementById("messageInput");
        const sendButton = document.getElementById("sendButton");
        const messages = document.getElementById("messages");
        socket.onmessage = event => {
            const message = document.createElement("li");
            message.textContent = event.data;
            messages.appendChild(message);
        };
        sendButton.addEventListener("click", () => {
            socket.send(messageInput.value);
            messageInput.value = "";
        });
    </script>
</body>
</html>

5. 어플리케이션 실행

어플리케이션을 실행하고 웹 브라우저에서 http://localhost:8080으로 이동. 이제 채팅 메시지를 보내고 받을 수 있다.

이것은 Spring Webflux와 WebSockets를 사용하여 채팅 서버를 구현하는 기본적인 원리를 보여주는 매우 간단한 예제다.

profile
개발자입니다.

0개의 댓글