MSA
6 - API 게이트웨이
by 젼젼39
2026. 2. 23.
1. API 게이트웨이 개요
- 1-1) API 게이트웨이의 정의
- 마이크로서비스 아키텍처(MSA)에서 클라이언트와 백엔드 서비스 사이의 단일 진입점(Single Entry Point) 역할을 하는 중간 서버
- 클라이언트의 직접적인 서비스 호출을 막고 게이트웨이를 통해 모든 요청을 통합 관리함으로써 보안과 편의성을 동시에 확보함
- 1-2) 주요 기능 레이어
- 라우팅(Routing): 요청 URL을 분석하여 적절한 마이크로서비스 엔드포인트로 연결함
- 공통 관심사 처리: 인증(Auth), 인가, 로깅, 모니터링, 로드 밸런싱 등을 통합 수행함
- 메시지 변환: 클라이언트와 서버 사이에서 헤더 정보를 변경하거나 요청/응답 형식을 변환함
2. Spring Cloud Gateway (SCG) 상세
- 2-1) SCG란?
- Spring 프로젝트에서 공식적으로 개발한 API 게이트웨이 솔루션
- 비동기 논블로킹(Non-blocking) 방식의 Spring WebFlux 모델을 기반으로 설계되어 대규모 트래픽 처리에 최적화됨
- 2-2) 핵심 특징
- 동적 라우팅: 유레카와 연동하여 실시간으로 변하는 인스턴스 정보에 따라 경로를 자동 생성함
- 필터 체인: 요청의 전(Pre) 처리와 후(Post) 처리를 담당하는 다양한 필터를 유연하게 연결함
- 보안 및 탄력성: 서킷 브레이커(Resilience4j)와 쉽게 연동되어 시스템 안정성을 높임
3. Spring Cloud Gateway 설정 및 라우팅
- 3-1) 프로젝트 구성 (build.gradle)
- 게이트웨이는 전용 프로젝트로 생성하며, 웹 환경 구성을 위해 관련 스타터를 추가함
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
- 3-2) 라우팅 설정 예시 (application.yml)
- 조건(Predicates)에 맞는 요청을 특정 서비스(uri)로 배달하도록 설정
spring:
application:
name: sample
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 서비스 디스커버리를 통해 동적으로 라우트를 생성하도록 설정
routes:
- id: users-service # 라우트 식별자
uri: lb://users-service # 'users-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
predicates:
- Path=/users/** # /users/** 경로로 들어오는 요청을 이 라우트로 처리
- id: orders-service # 라우트 식별자
uri: lb://orders-service # 'orders-service'라는 이름으로 로드 밸런싱된 서비스로 라우팅
predicates:
- Path=/orders/** #/orders/** 경로로 들어오는 요청을 이 라우트로 처리
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
4. Gateway 필터링(Filtering) 메커니즘
- 4-1) 필터 구분
- Global Filter: 모든 라우팅 경로에 공통 적용되는 필터
- Gateway Filter: 특정 라우트에만 개별적으로 적용되는 필터
- 필터를 구현하려면
GlobalFilter 또는 GatewayFilter 인터페이스를 구현하고, filter 메서드를 오버라이드해야 함
- 4-2) 핵심 리액티브 객체
- Mono: 비동기(동시) 프로그래밍에서 0 또는 1개의 데이터를 처리하는 객체
- ServerWebExchange: HTTP 요청과 응답을 포함하는 리액티브 환경의 캡슐화 객체
- GatewayFilterChain: 필터들을 순차적으로 연결해 주는 흐름 제어 도구
- 4-3) 필터 구현 시점
- Pre 필터: 서비스로 요청이 전달되기 전에 실행됨 (예: 로깅, 인증)
@Component
public class PreFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 요청 로깅
System.out.println("Request: " + exchange.getRequest().getPath());
return chain.filter(exchange); //다음 단계로 전달
}
@Override
public int getOrder() { // 필터의 순서를 지정
return -1; // 필터 순서를 가장 높은 우선 순위로 설정
}
}
- Post 필터: 서비스 응답이 돌아온 후 클라이언트에게 전달되기 전에 실행됨 (예: 결과 가공)
@Component
public class PostFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 응답 로깅
System.out.println("Response Status: " + exchange.getResponse().getStatusCode());
}));
}
@Override
public int getOrder() {
return -1;
}
}
5. 레거시 기술: Netflix Zuul (Spring Boot 2.x)
- 참고 사항: 이전 세대에서 널리 쓰였던 게이트웨이임. 현재 개발 시에는 SCG가 권장되지만 유지보수를 위해 개념을 알아둘 필요가 있음
- 설정 방식:
@EnableZuulProxy를 사용하여 기능을 활성화함
- 특징: 서블릿(Servlet) 기반의 동기 방식으로 동작하며,
ZuulFilter 상속을 통해 비즈니스 로직을 구현함
# Zuul 라우팅 설정 예시
zuul:
routes:
users-service:
path: /users/**
serviceId: users-service
6. 요약 및 통합 전략
- Spring Cloud Gateway는 유레카와 연동하여 로드 밸런싱 + 동적 라우팅 + 인증/필터링을 한곳에서 처리함
- 이를 통해 백엔드 서비스들은 비즈니스 로직에만 집중할 수 있는 진정한 의미의 MSA 환경을 구축할 수 있음