본문 바로가기
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 환경을 구축할 수 있음

'MSA' 카테고리의 다른 글

8 - Config  (0) 2026.02.23
7 - 보안 구성  (0) 2026.02.23
5 - 서킷브레이커  (0) 2026.02.23
4 - 로드밸런싱  (0) 2026.02.23
3 - 서비스 디스커버리 (Eureka)  (0) 2026.02.23