Express(Node.js) vs webflux(Spring): Hello world 성능 비교
내 인기 있는 기사 시리즈 중 하나는 Node.js와 Springboot 간의 성능 비교였습니다. Node의 기본 HTTP 서버를 Springboot와 비교하는 것으로 시리즈를 시작했습니다(기사는 여기 ). 기사가 기록적인 조회수를 기록하면서 다음과 같은 댓글을 받았습니다.
- 네이티브 서버는 Spring과 같은 프레임워크와 비교할 수 없습니다.
- 사과 대 사과 비교의 경우 Spring의 스레드풀 대신 Spring의 반응형 프레임워크 webflux를 사용해야 합니다.
Spring Webflux에 대한 참고 사항
리액티브 프로그래밍은 비동기 데이터 스트림을 다루는 프로그래밍 스타일 입니다 ! 데이터 스트림을 관찰하고 변경 사항에 대응하고 이를 전파하는 데 중점을 둔 개발 모델입니다. 탄력성이 뛰어난 분산 시스템 또는 마이크로 서비스인 반응형 시스템을 구축하기 위해 반응형 프로그래밍을 배웁니다! Spring Webflux는 반응형 프로그래밍의 한 예입니다.
테스트 설정은 동일합니다.
- 16G RAM이 탑재된 MacBook M1
- Node.js v19.8.1
- Java 17을 통한 Spring 3.0.4
Node.js
import express from "express";
const app = express();
const port = 3000;
app.get("/", (req, res) => {
res.send("Hello World!");
});
app.listen(port, () => console.log("Listening on", port));
Spring Webflux 'hello world' 코드는 공식 문서에서 가져왔습니다.
HelloWorldHandler.java
package hello;
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 HelloWorldHandler {
public Mono<ServerResponse> hello(ServerRequest request) {
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromValue("Hello World!"));
}
}
package hello;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RequestPredicates.accept;
@Configuration(proxyBeanMethods = false)
public class HelloWorldRouter {
@Bean
public RouterFunction<ServerResponse> route(HelloWorldHandler helloWorldHandler) {
return RouterFunctions
.route(GET("/"), helloWorldHandler::hello);
}
}
package hello;
import reactor.core.publisher.Mono;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.ClientResponse;
import org.springframework.web.reactive.function.client.WebClient;
@Component
public class HelloWorldClient {
private final WebClient client;
public HelloWorldClient(WebClient.Builder builder) {
this.client = builder.baseUrl("http://localhost:3000").build();
}
public Mono<ClientResponse> getMessage() {
return this.client.get()
.uri("/")
.exchange();
}
}
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
HelloWorldClient helloWorldClient = context.getBean(HelloWorldClient.class);
}
}
결과로 바로 이동하겠습니다.
Express는 Spring Webflux의 눈부신 성능에 의해 사라졌습니다. Spring의 70,000 RPS와 Express의 18,000 RPS 사이에는 비교가 되지 않습니다. CPU와 메모리 사용량이 적기 때문에 Express는 경쟁에서 어디에도 없습니다.
우승자 : Spring Webflux
Fastify와 Spring Webflux의 비교는 여기에서 확인할 수 있습니다 .
읽어 주셔서 감사합니다! 의견, 제안 등을 알려주세요.

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































