최근 MSA 프로젝트를 진행하면서 관련 학습 중 GateWay에 Spring Cloud Gateway와 Zuul가 있다는 것을 알게 되었다. 이에 두 옵션 중 어떤 것을 선택할지 고민하게 되었고, 이를 정리해보려 한다.
GateWay란?
Gateway는 MSA 아키텍처에서 중요한 구성 요소이다. 클라이언트와 백엔드 서버 사이에서 중앙 진입점 역할을 한다.
Gateway의 역할
게이트웨이의 역할은 크게 아래와 같다.
- 요청 라우팅
- 클라이언트의 요청을 적절한 마이크로서비스로 전달한다.
- URL 패턴이나 요청 헤더를 기반으로 요청을 분석하고, 해당하는 서비스로 매핑한다.
- 인증 및 인가 처리
- 클라이언트 요청에 포함된 인증 정보를 확인하여 유효성을 검증한다.
- JWT 토큰 또는 OAuth2와 같은 인증 방식을 통해 권한을 확인하고, 요청을 필터링한다.
- 로드밸런싱
- 요청을 여러 서비스 인스턴스에 분산 처리하여 서버 부하를 줄이고, 시스템의 가용성을 높인다.
- Spring Cloud Gateway는 Spring Cloud LoadBalancer를 활용해 서비스 인스턴스 간 트래픽을 균등하게 분배한다.
- API 필터링 및 변환
- 요청 및 응답 데이터를 변환하거나 필터링하여 클라이언트와 서비스 간의 데이터 처리를 최적화한다.
- 필요에 따라 요청 헤더 추가, 데이터 변환, 로깅 등을 수행한다.
Zuul
Zuul는 Netflix에서 개발한 API Gateway이다.
Netflix는 API 트래픽의 양과 다양성으로 인해 예기치 않은 문제가 발생하는 경우가 많았고, 이를 해결하기 위해 Zuul을 개발했다고 한다.
Zuul 1.x의 서버 구성
Zuul 1.x는 서블릿 기반(Tomcat)으로 동작하며, Java 서블릿 컨테이너 위에서 실행된다
요청은 동기적 처리 방식으로 작동하며, 각 요청마다 별도의 스레드가 할당됩니다.
- 요청이 처리되는 동안 해당 스레드는 대기 상태에 있게 되며, 대규모 트래픽 환경에서는 스레드 고갈 문제가 발생할 수 있습니다.
- 이러한 구조적 한계로 인해 고성능 트래픽 처리에는 적합하지 않을 수 있다.
Zuul 1.x의 Filter
- Pre Filter – 라우팅전에 실행되는 필터이다. 인증/권한 검사, 요청 데이터 검증, 로깅 등의 역할을 수행한다.
- Route Filter – 요청에 대한 라우팅을 다루는 필터이다. Apache httpclient를 사용하여 정해진 Url로 보낼수 있고, Neflix Ribbon을 사용하여 동적으로 라우팅 할 수도 있다.
- Post Filter – 라우팅 후에 실행되는 필터이다. 백엔드 서비스에서 반환된 응답을 처리한다. (response에 HTTP header를 추가하거나, response에 대한 응답속도, Status Code 등)
- Error Filter – 요청 처리 중 오류가 발생하면 실행된다.
- 클라이언트 → Zuul Gateway → Pre 필터 → Route 필터 → 백엔드 서비스.
- 백엔드 서비스 → Zuul Gateway → Post 필터 → 클라이언트.
- 요청 처리 중 에러 발생 시 → Error 필터 실행.
하지만 2018년 이후로 Zuul의 개발이 중단되고 Maintenance Mode가 되었으며 Zuul 대신 Spring Cloud Gateway 사용을 권장한다고 한다.
Zuul 2.x의 서버 구성
Zuul 2.x는 Zuul 1.x의 동기 처리 한계를 해결하기 위해 설계되었다.
Tomcat 기반이 아닌 Netty 기반으로 동작하며, 비동기 및 논블로킹 방식을 채택하여 대규모 트래픽을 효율적으로 처리할 수 있다.
- 요청-응답 처리가 이벤트 기반으로 동작하여 CPU와 메모리 사용량이 더욱 효율적이다.
- 비동기 방식 덕분에 동시에 많은 요청을 처리할 수 있어, 고성능 분산 시스템에 적합하다.
하지만, Zuul 2.x는 Spring Cloud에서 채택되지 않았으며, Spring과의 통합성이 부족하다.
Zuul 2는 Netflix 내부에서 주로 사용되며, 외부 커뮤니티와의 연계 및 지원은 제한적이다.
Zuul에 대한 더 자세한 정보는 아래 문서에서 확인하자
https://github.com/Netflix/zuul/wiki
Home
Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more. - Netflix/zuul
github.com
Spring Cloud Gateway
Spring Cloud Gateway는 Spring Cloud 팀에서 개발한 API Gateway로, Spring Boot와 Spring WebFlux(Netty)를 기반으로 설계되었다.
주요 특징은 비동기 처리를 지원하고, Spring 생태계와의 통합에 유리하다
Spring Cloud Gateway는 Netty 기반으로 동작하며, 논블로킹 방식을 채택하여 고성능 환경에서도 안정적으로 작동한다.
- Spring WebFlux의 Reactor를 활용하여 요청-응답 처리가 비동기 및 논블로킹 방식으로 이루어진다.
- Netty 기반의 처리 덕분에 대규모 트래픽 처리와 효율적인 리소스 사용이 가능하다.
Spring Cloud Gateway는 비동기 처리, Spring과의 높은 통합성 등의 장점이 있다.
Spring Cloud Gateway의 Filter

Spring Cloud Gateway에는 수십 개의 필터가 존재하며, 크게 모든 라우트에 적용되는 Global Filters와 특정 라우트에만 적용되는 Route-Specific Filters로 나눌 수 있다.
Route-Specific Filters 에는 SCG에서 기본 제공하는 빌트인 필터가 포함되어 있으며, YAML 설정만으로 간편하게 사용할 수 있다.
또는 직접 요구사항에 맞는 Custom Filter를 구현할 수도 있다. Custom Filter는 주로 Global Filter 또는 Gateway Filter Factory를 사용해 작성한다.
Spring Cloud Gateway 와 Zuul 중 무엇을 사용할까?
Zuul 1은 개발이 중단되어 현재 Maintenance Mode 상태이며, Blocking I/O 기반이라는 단점이 있다.
Zuul 2는 비동기 처리를 지원하지만, Spring 공식 프로젝트가 아니기 때문에 비동기와 Non-Blocking 기능을 지원하면서도 Spring의 공식 프로젝트인 Spring Cloud Gateway를 사용하는 것이 더 합리적이라고 생각한다.
Netty란?
Netty는 이벤트 기반 네트워크 애플리케이션 프레임워크로, 고성능 비동기 네트워크 애플리케이션을 구축하기 위한 도구이다.
Netty와 SCG/Zuul2의 비동기/Non-blocking 관계
Spring Cloud Gateway와 Zuul2가 비동기/Non-blocking 특성을 갖는 이유는 Zuul1과 다르게 Netty 기반으로 동작하기 때문이다.
Netty와 Tomcat의 차이
- Tomcat: WAS(Web Application Server)로, HTTP 요청/응답, 세션 관리, 보안 인증, Servlet 컨테이너 등의 기능을 제공한다.
- Netty: WAS가 아니며, 위와 같은 기능을 제공하지 않는다. 필요하면 직접 구현해야 한다.
Netty의 특징
- 다양한 네트워크 프로토콜(TCP, UDP, WebSocket 등)을 다룰 수 있다.
- HTTP/HTTPS 같은 웹 프로토콜에만 한정되지 않는다. (WAS와 달리)
'Java , Spring > Spring' 카테고리의 다른 글
[MSA] MSA 환경에서의 분산 트랜잭션 처리(2PC, SAGA) (3) | 2025.02.23 |
---|---|
[Spring Cloud] MSA 서버 간 호출방식 비교 (RestTemplate, FeignClient, WebClient, RestClient) (1) | 2025.02.08 |
[Spring] JWT 검증 방법 (대칭키, 비대칭키) (0) | 2025.01.16 |
[Spring] Spring Security 예외를 @ControllerAdvice에서 처리하기 (0) | 2024.12.13 |
[Spring] CS 스터디 - 3주차 Spring & Network (0) | 2024.08.11 |
댓글