Spring Webflux는 Reactive Programming을 지원하는 Spring Framework의 모듈 중 하나다. Reactive Programming은 비동기적인 데이터 처리를 통해 더 높은 성능과 효율성을 제공하는 프로그래밍 패러다임이다.
Spring Webflux는 이러한 Reactive Programming 패러다임을 기반으로 하며, Non-Blocking I/O 작업을 수행하는데 적합한 Web Application을 개발할 수 있게 도와준다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
@Component
public class SampleHandler {
public Mono<ServerResponse> hello(ServerRequest request) {
return ServerResponse.ok().body(BodyInserters.fromObject("Hello, World!"));
}
}
@Configuration
public class SampleRouter {
@Autowired
private SampleHandler handler;
@Bean
public RouterFunction<ServerResponse> route() {
return RouterFunctions.route(RequestPredicates.GET("/hello"), handler::hello);
}
}
@SpringBootApplication
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
위 예제에서는 Spring Webflux를 사용하여 간단한 "Hello, World!" 메시지를 반환하는 RESTful API를 구현하였다.
curl <http://localhost:8080/hello>
위의 명령어를 실행하면 "Hello, World!" 메시지가 반환된다.
Spring Webflux와 WebSockets를 사용하여 채팅 서버를 구현하는 방법을 설명하겠다.
먼저, pom.xml
파일에 다음과 같은 의존성을 추가:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
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();
}
}
WebSocketConfigurer를 구현하여 WebSocketHandler를 등록합한다:
@Configuration
public class ChatConfiguration implements WebSocketConfigurer {
@Autowired
private ChatHandler chatHandler;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatHandler, "/chat");
}
}
채팅 서버에 연결할 수 있는 간단한 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>
어플리케이션을 실행하고 웹 브라우저에서 http://localhost:8080
으로 이동. 이제 채팅 메시지를 보내고 받을 수 있다.
이것은 Spring Webflux와 WebSockets를 사용하여 채팅 서버를 구현하는 기본적인 원리를 보여주는 매우 간단한 예제다.