1. Netty? 누구세요
Spring Cloud 2020.0.x 이후부터는 Eureka 서버가 기본적으로 톰캣(Tomcat)이 아닌 네티(Netty) 기반으로 동작한다고 한다. Netty라는 이름은 몇 번 들어봤지만, 정확히 어떤 기술인지, 왜 Eureka에서 사용하게 되었는지 궁금해졌다. 이를 바탕으로 Netty에 대해 학습한 내용을 정리해 본다.
Netty란?
- Netty는 비동기 이벤트 기반 네트워크 애플리케이션 프레임워크이다.
- 주로 서버-클라이언트 통신에서 높은 성능을 제공하기 위해 사용된다.
Netty의 주요 특징
- 비동기 및 논블로킹 방식
- 요청마다 스레드를 생성하지 않고 이벤트 루프(Event Loop)를 사용해 효율적으로 처리한다.
- 대규모 요청을 동시에 처리하는 데 적합하다.
- 경량 서버
- 서블릿 컨테이너(Tomcat)보다 메모리와 CPU 사용량이 적다.
- Eureka와 같은 고성능 시스템에 적합하다.
- 높은 동시성
- 논블로킹 방식으로 동작하기 때문에 동시 처리 성능이 뛰어나다.
Eureka에서 Netty를 사용하는 이유
- 성능 극대화: Eureka는 서비스 등록 및 검색 요청이 많기 때문에, Netty의 비동기 방식이 더 효율적이다.
- 리소스 절약: Netty는 경량 서버로 메모리와 CPU 사용량을 절약할 수 있다.
- WebFlux와의 통합: Spring WebFlux를 기반으로 하는 최신 스택과의 호환성을 제공한다.
이렇게 Netty는 대규모 MSA 환경에서 높은 성능과 효율성을 제공하기 위한 선택으로 보인다. 하지만 기존 Tomcat에 익숙한 개발자들에게는 새로운 학습 곡선을 요구하기도 한다.
2. Netty 기반의 서비스에서 HttpServletRequest를 사용할 수 있는지?
Netty 기반 서비스에서 HttpServletRequest
를 사용할 수 있는지 의문이 생겼다. 이를 학습하면서 Netty와 Spring WebFlux의 차이점을 알게 되었다.
- Netty 기반(Spring WebFlux)
- 서블릿 컨테이너(Tomcat)를 사용하지 않기 때문에 **
HttpServletRequest
**와 같은 서블릿 API는 사용할 수 없다. - 대신 WebFlux는 **
ServerHttpRequest
*\와 \ServerHttpResponse
\*를 제공하여 요청과 응답을 처리.
- 서블릿 컨테이너(Tomcat)를 사용하지 않기 때문에 **
- Tomcat 기반(Spring MVC)
- 서블릿 컨테이너를 사용하기 때문에 서블릿 API와 호환.
HttpServletRequest
와HttpServletResponse
를 활용하여 동작.
결론적으로, \Netty 기반의 서비스(WebFlux)는 \\HttpServletRequest**를 사용할 수 없으며, WebFlux 전용 객체를 사용해야 한다.
3. Spring MVC와 WebFlux 기반 서비스의 차이
Spring Cloud 환경에서 각 마이크로서비스는 Spring MVC 기반(Tomcat) 또는 WebFlux 기반(Netty) 중 하나를 선택할 수 있다. 이 둘의 차이와 선택 기준이 궁금해졌다.
Spring MVC (Tomcat)
- 특징:
- 서블릿 API 기반
- 동기 방식으로 요청/응답 처리
- Spring Boot 2.x에서도 기본적으로 Tomcat을 사용
- 장점:
- 기존 서블릿 기반 애플리케이션과 호환성
- 학습 곡선이 낮고, 이미 많은 개발자들이 익숙
- 단점:
- 높은 동시성 요구 환경에서는 성능이 떨어질 수 있음
- 요청마다 스레드를 할당하여 스레드 자원이 고갈될 위험이 있음
Spring WebFlux (Netty)
- 특징:
- 비동기 및 논블로킹 방식으로 동작
- Netty를 기본 서버로 사용
- 장점:
- 높은 동시성 환경에서 효율적
- 메모리와 스레드 사용량이 적어 경량 애플리케이션에 적합
- 단점:
- 비동기 프로그래밍에 익숙하지 않으면 학습 곡선이 높음
- 디버깅이 비교적 어려울 수 있음
선택 기준
- 기존 애플리케이션 호환성
- 기존 서블릿 기반 애플리케이션을 확장하려면 Spring MVC
- 동시성 요구
- 높은 트래픽 및 동시 요청을 처리하려면 WebFlux
4. Spring Cloud를 사용할 때 Netty 서버의 기본 동작
Spring Cloud를 사용하면 Netty 서버가 기본으로 탑재된다는 이야기를 들었다. 그렇다면 모든 클라이언트 서비스도 Netty를 사용해야 하는지 궁금했다.
Spring Cloud의 Netty 기본 동작
- Eureka 서버: 기본적으로 Netty를 사용하여 동작
- 클라이언트 서비스:
- Spring Cloud Eureka 클라이언트는 Tomcat 기반(Spring MVC) 또는 Netty 기반(WebFlux) 중 선택 가능
클라이언트 선택의 자유
- Spring Cloud는 클라이언트 서비스의 기술 스택을 강제하지 않음
- Eureka 서버가 Netty를 사용하더라도, 클라이언트 서비스는 Tomcat(Spring MVC) 기반으로 구성할 수 있음
결론
Spring Cloud를 사용할 때, 서버와 클라이언트는 서로 다른 기술 스택을 사용할 수 있다. Netty 기반 서버와 Tomcat 기반 클라이언트 간에도 통신이 가능하므로 개발자는 요구 사항에 따라 자유롭게 선택할 수 있다.
'Spring > SpringCloud' 카테고리의 다른 글
Spring Cloud2. Spring Cloud Gateway Filter 정리 (0) | 2024.12.11 |
---|