미니 프로젝트 때문에 카카오 소셜 로그인을 구현하는데 WebFlux를 사용한다는 분들이 계셔서 차이점을 알아보기 위해 이 글을 작성한다.
Rest Template
스프링은 오랫동안 Rest Template 을 웹 클라이언트 추상화로 제공해 왔다. 나 역시도 Rest Template을 주로 써서 익숙했다.
RestTemplate은 내부적으로 요청당 하나의 쓰레드 모델을 기본으로 하는 자바 서블릿 API를 사용한다.
이 말의 의미는? 자바 서블릿 API는 웹 클라이언트가 응답을 받을 때까지 해당 쓰레드가 차단된다. Rest Template 으로 요청한 한 응답이 끝나기 전까지 쓰레드가 차단된다는 뜻이다.
이 방식의 문제점은, 이렇게 차단된 코드로 인해 각 스레드가 어느정도의 메모리와 CPU 싸이클을 소비하기 때문이다.
예시를 들어보자.
결과를 생성하는데 필요한 서비스를 기다리고 있는 많은 수신 요청이 있는 경우를 생각해보면, RestTemplate을 이용한 결과를 기다리는 요청이 대기 큐에 쌓일 것이다.
결과적으로 애플리케이션은 많은 쓰레드를 생성해 쓰레드 풀을 고갈시키거나 사용 가능한 모든 메모리를 차지하게 된다. 이렇게 되면 CPU Context Switcing이 빈번해져 CPU 성능 저하가 발생하게 되는 것이다.
WebFlux
그렇다면 webFlux는 어떨까? Spring Reactive 프레임워크가 제공하는 비동기, 논블로킹 솔루션을 사용한다.
이는 RestTemplate이 매 HTTP 호출마다 호출 쓰레드를 사용하는 반면, Web Client는 각 이벤트에 대해 작업을 생성한다.
백그라운드에서 Reactive 프레임워크는 이러한 작업을 큐에 넣고, 적절한 응답이 가능할때만 실행한다.
Reactive 프레임워크는 이벤트 기반 아키텍쳐를 사용한다. Reactive Streams API를 통해 비동기 로직을 구성할 수 있다.
그 결과, Reactive 접근법은 동기/블로킹 방법에 비해 적은 스레드와 시스템 자원으로 더 많은 로직을 처리할 수 있다.
WebClient는 Spring WebFlux 라이브러리의 일부이다. 따라서 Mono와 Flux 같은 리액티브 타입을 사용하여 함수형, 유창한 API로 클라이언트 코드를 작성할 수 있다.
종류 | RestTemplate | WebFlux |
요청 처리 방식 | 매 요청마다 블로킹 되어 쓰레드가 응답을 받을 때까지 기다린다(동기) | 요청이 비동기로 실행되어서 응답이 준비될 때만 작업이 실행된다. |
쓰레드 사용 | 쓰레드 당 하나의 요청을 처리하므로 많은 쓰레드가 필요하고, 쓰레드 풀 소진 위험이 있다. | 적은 쓰레드로 많은 요청을 처리할 수 있다. Reactive Streams를 사용해 스레드 효율성이 높다. |
자원 효율성 | 쓰레드가 메모리와 CPU를 많이 소모하고, 컨텍스트 스위칭이 많아지면 성능이 저하된다. | 모리와 CPU 자원을 효율적으로 사용하며, 성능이 더 우수하다. |
코딩 스타일 | 전통적인 동기식 코딩 스타일이다. | 리액티브 프로그래밍을 지원하고, 비동기식 코딩을 지원한다. |
이렇게 알아보고 나니까 졸프가 좀 아쉽다. WebFlux를 사용했으면 자원도 아끼고 비동기적으로 많은 요청을 수행할 수 있지 않았을까. Async 사용해서 비동기를 달았던 것은 좋지만 애초부터 WebFlux를 사용했으면 많은 요청을 허용할 수 있었을 것이다.
처음에는 구현하는데 급급했지만, 이제는 자원 효율성도 생각하는 서버 개발자가 되어야겠다.
참고
'BACKEND > Spring Boot' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 영속성 컨텍스트 (0) | 2024.10.30 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 1일 차 JPA에 대해서 (4) | 2024.10.21 |
Spring Container는 어떻게 생성될까 (0) | 2024.09.22 |
Tomcat은 어떻게 동작하는가 (0) | 2024.09.22 |
테스트 스텁과 목 오브젝트의 차이점 (1) | 2024.09.19 |
안녕하세오 저는 똑똑해지고 싶은 버그 수집가에오
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!