[Spring] Gateway VS Reactive Gateway

chrkb1569·2025년 3월 2일
0

오류 해결 일지

목록 보기
12/12

Spring Cloud 관련 공부를 하던 도중, 다음과 같은 오류가 발생하였습니다.

일단 단순하게 오류 메시지만 가지고 분석해보니, 어노테이션이 누락되었거나 application.yml 파일에서 필요한 설정이 누락되었을 경우, 발생하는 문제라고 합니다.

그런데 관련 케이스를 계속 찾아보면서 수정했음에도 불구하고 동일한 오류가 발생하더라구요..ㅠ

그렇게 며칠 동안 삽질한 결과, dependency 오류라는 것을 알아내었습니다.

오류 발생 원인

Gateway 프로젝트를 생성할 때, IntelliJ를 통하여 프로젝트를 생성하였는데, 다음처럼 Gateway 관련 Dependency를 설정해주었습니다.

그렇게 생성된 프로젝트의 build.gradle 파일을 살펴보면,

다음처럼 "spring-cloud-starter-gateway-mvc" 라는 dependency가 추가된 것을 확인할 수 있습니다.

바로 이 부분이 문제인데, 해당 dependency 대신 다음처럼 dependency를 수정해해주거나,

프로젝트 생성 시, 다음처럼 Reactive Gateway를 선택하여 프로젝트를 생성하시면 됩니다.

Gateway VS Reactive-Gateway?

뭐 일단 문제를 해결하긴 했는데, 두 의존성이 어떠한 차이점이 존재하길래 프로젝트 빌드에서부터 막히는 문제가 발생하는건지 궁금하더라구요.

그래서 오늘은 해당 내용들을 정리하면서 어떠한 차이점이 존재하는지에 대해서 알아보겠습니다.

API Gateway 구현 방식

[Reference : https://speakerdeck.com/thomasvitale/spring-cloud-gateway-resilience-and-security-b152147f-7594-413a-8ac3-07ece0afd32a?slide=10]

일단 Spring 환경에서 API Gateway를 구현하는 방식에는 크게 2가지가 존재한다고 합니다.

하나는 오래전부터 사용해오던 Servlet 기반의 구현 방식, 다른 하나는 최근 사용되고 있는 Reactive 기반의 구현 방식입니다.

상단에 이미지를 보시면 아시겠지만,

"spring-cloud-starter-gateway-mvc" 의존성을 추가할 경우, Servlet 방식으로 API Gateway를 구현하게되며,

"spring-cloud-starter-gateway" 의존성을 추가하는 경우, Reactive 방식으로 API Gateway를 구현하게됩니다.

두 방식의 가장 큰 차이점은 바로 요청 처리 방식에 있습니다.

[Reference : https://blog.devgenius.io/is-spring-webflux-a-myth-4526c2f92413]

Servlet 방식을 사용하는 경우, 다음처럼 사용자로부터 요청이 들어오는 경우, Thread Pool로부터 Thread를 할당 받고 이를 처리하는 방식으로 요청이 처리됩니다.

[Reference : https://medium.com/@diego.lucasilva/spring-webflux-under-the-hood-c6446c87ea84]

그러나 Reactive 방식은 다음처럼 사용자로부터 요청이 들어오는 경우, 이를 Queue에 보관한 뒤, 일정 주기마다 정해진 Thread가 이를 처리합니다.

사실 이 밖에도 방식마다 다양한 특징들을 가지고 있으나, 일단 오늘은 큰 차이점에 대해서만 정리하도록 하겠습니다.

지원여부

사실 가장 큰 이유죠

Servlet 방식을 통하여 API GateWay를 구현하는 경우, Spring Cloud Netflix 프로젝트의 Zuul을 통해서 구현하게 됩니다.

[Reference : https://cloud.spring.io/spring-cloud-netflix/reference/html/#spring-cloud-eureka-server]

그런데 이 Spring Cloud Netflix 프로젝트가 2018년부터 추가 기능 개발을 지원하지 않는다 선언되었습니다.

[Reference : https://spring.io/blog/2018/12/12/spring-cloud-greenwich-rc1-available-now#spring-cloud-netflix-projects-entering-maintenance-mode]

그런데 Spring에서는 2017년에 출시된 Spring 5버전에서부터 Reactive 환경을 도입하였으니, 호환에 문제가 발생하는 듯 합니다.

애초에 Spring Cloud Gateway 공식 문서를 살펴보면, 다음처럼 명시된 것을 확인할 수 있습니다.

[Reference : https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/starter.html]

...

Spring Cloud Gateway는 Spring Boot,
Spring Webflux 환경에서 제공되는 Netty를 필요로합니다.

구 Servlet 환경에서 동작하는 경우, Spring Cloud Gateway는 
동작하지 않습니다.

...

사실 이 부분이 가장 중요했는데, 못보고 삽질만 했네요..ㅠ
그래도 이제 알아챈게 어딥니까

오늘은 일단 간단하게 두 의존성 간의 차이점에 대해서 알아보았는데, Servlet 환경이랑 Reactive 환경에 대해서는 좀 더 공부가 필요할 것 같습니다.

다음에는 해당 부분 정리하는 시간을 갖도록 하겠습니다.

0개의 댓글

관련 채용 정보