본문 바로가기

spring

[WebFlux] Spring WebFlux 란 무엇인가?

자바스크립트에서 fetch API, Axios API 를 사용해서 서버에서 데이터를 요청하는 작업을 해본적이 있는가?

이것을 통해서 마치 앱과 같이 동작하는 웹사이트(SPA)를 만들 수 있다. 필요한 데이터를 알맞은 포맷을 형태로 전달 받아 네트워크의 비용을 줄이고 반응 속도를 향상시키는 형태로 서비스가 되는 여러 웹사이트들이 존재한다.

 

처음 이 방식을 알게 되었을 때는 당연하게 생각했다. 당연히 필요한 부분만 골라서 서버에 데이터를 요청하는 것이 효율적이지 않은가? 비동기로 작동한다는 말도 당연히 비동기로 처리되어야 하는 것이 아닌가? 하는 생각을 했다.

 

하지만 서버를 개발할 때 비동기 처리를 한다는 것을 들었을 때는 비동기로 어떻게 처리되어야하는 것인지 왜 그것이 좋은지에 대해서 명확한 개념이 생각나지 않았다.

 

왜냐하면 스트리밍 서버가 아닌 일반적인 웹서버는 사용자의 요구를 충족시킨 이후에 요청을 한번에 보내서 응답을 해야하는데 비동기로 처리하더라도 결국은 기다려야하는 것 아닌가? 라는 생각이 들었기 때문이다.

 

WebFlux가 성능이 좋은 이유?

1. 동시다발적인 외부시스템 호출가능

만약, A 서비스에 10개의 다른 마이크로 서비스에게 요청을 한다고 가정하자. 해당 시스템의 마이크로 서비스 평균 요청 처리 시간을 1ms라고 가정하자.

 

동기적인 방식을 이용한다면 하나의 서비스에 요청을 날리면 그 요청이 끝나고 나서 요청을 해야한다. 그래서 A 서비스가 하나의 고객의 요청을 처리하는데 걸리는 시간은 1ms * 11 = 11ms 일 것이다. (A 자신의 처리 시간을 포함)

 

비동기적으로 처리한다면 어떻게 될까? 비동기적으로 처리할 수 있다면 아마 가장 오래걸린 마이크로 서비스의 응답 지연 시간이 요청을 처리하는 시간일 것이다. 하지만 평균적으로 각 마이크로 서비스는 1ms 가 소요되기 때문에 평균적으로 2ms (A가 데이터를 처리하는데 1ms) 가 소요될 것이다.

 

동기적 방식과 비동기적 방식의 차이는 11ms vs 2ms 로 가정한 상황에서 차이가 발생하지만 이보다 중요한 것은 이러한 차이가 발생하는 원인이 외부 시스템의 개수라는 것이다. 동기적 방식은 필요한 외부시스템의 수에 따라 처리 지연 시간이 선형적으로 증가하는 구조적인 한계가 있지만 비동기적인 방식은 외부시스템의 수가 얼마나 많든지 상관없이 일정한 성능을 보여줄 수 있다는 것이 큰 차이다.

 

WebFlux가 성능이 좋은 이유 중 하나는 비동기적인 방식이 동시 다발적으로 요청을 할 수 있기 때문이다. 

 

2. 처리 성능 향상

WebFlux가 동시에 여러 시스템을 호출할 수 있지만 이것은 다른 시스템에 순간적인 부하를 더 가하는 방법이다. 결국 처리하는 일은 동일하기 때문에 자원을 효율적으로 쓰는 것에 대한 이유로는 애매하다.

 

동기적 방식이 network I/O 를 요청하면 해당 스레드는 무엇을 하고 있을까? 생각해보자. 다른 작업을 하는가? 아니면 요청이 올 때까지 쉬고 있는가? 해당 스레드는 요청이 도달할 때 까지 쉬고 있다. 그렇다면 10개의 외부시스템의 요청을 처리하는 시간 동안 대기하고 있는 것이다. cpu가 이런 스레드 때문에 놀고 있는 것이다. 

 

반면 WebFlux는 이런 시간을 아낄 수 있다. 대기 시간이 앞서 살펴본 것 처럼 적기도 하고 요청을 받는 스레드와 응답을 하는 스레드가 나뉘어서 각자의 일을 한다.