OPEN HYPER STEP
← 목록으로 (Java+Spring)
JAVA · 91 / 99
java
CHAPTER 91 / 99
읽기 약 2
FUNCTION

Spring Cloud Gateway: API 게이트웨이


핵심 개념

라우팅·필터·로드 밸런싱·Rate Limiting — MSA 앞단 게이트웨이.

본문

Gateway 역할

📋 코드 (11줄)
[Client] → [Gateway] → [User Service]
                    → [Product Service]
                    → [Order Service]

기능:
- 라우팅 (path 기반 → 서비스)
- 인증 (JWT 검증)
- 로드 밸런싱
- Rate Limiting
- 요청/응답 변환
- 로깅·모니터링

Gateway 설정

GRADLE📋 코드 (3줄)
// build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
YAML📋 코드 (32줄)
# application.yml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE
          predicates:
            - Path=/api/users/**
          filters:
            - StripPrefix=1
            - AddRequestHeader=X-Gateway, ohs

        - id: product-service
          uri: lb://PRODUCT-SERVICE
          predicates:
            - Path=/api/products/**
          filters:
            - StripPrefix=1

        - id: order-service
          uri: lb://ORDER-SERVICE
          predicates:
            - Path=/api/orders/**
            - Method=GET,POST
          filters:
            - StripPrefix=1
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                key-resolver: "#{@userKeyResolver}"

글로벌 필터 — JWT 인증

JAVA📋 코드 (39줄)
@Component
@RequiredArgsConstructor
public class JwtAuthGatewayFilter implements GlobalFilter, Ordered {
    private final JwtUtil jwtUtil;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest req = exchange.getRequest();
        String path = req.getURI().getPath();

        // 인증 불필요 경로
        if (path.startsWith("/api/auth/") || path.startsWith("/api/public/")) {
            return chain.filter(exchange);
        }

        String header = req.getHeaders().getFirst("Authorization");
        if (header == null || !header.startsWith("Bearer ")) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }

        String token = header.substring(7);
        try {
            Claims claims = jwtUtil.parse(token);
            // 사용자 정보를 헤더로 추가 — 서비스에 전달
            ServerHttpRequest mutated = req.mutate()
                .header("X-User-Id", claims.getSubject())
                .header("X-User-Role", claims.get("role", String.class))
                .build();
            return chain.filter(exchange.mutate().request(mutated).build());
        } catch (JwtException e) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }

    @Override
    public int getOrder() { return -100; }
}

Rate Limiting — Key Resolver

JAVA📋 코드 (20줄)
@Configuration
public class RateLimitConfig {

    // IP 기반
    @Bean
    KeyResolver ipKeyResolver() {
        return exchange -> Mono.just(
            exchange.getRequest().getRemoteAddress().getHostString()
        );
    }

    // 사용자 기반
    @Bean
    KeyResolver userKeyResolver() {
        return exchange -> {
            String userId = exchange.getRequest().getHeaders().getFirst("X-User-Id");
            return Mono.just(userId != null ? userId : "anonymous");
        };
    }
}

Circuit Breaker

YAML📋 코드 (23줄)
spring:
  cloud:
    gateway:
      routes:
        - id: order-service
          uri: lb://ORDER-SERVICE
          predicates:
            - Path=/api/orders/**
          filters:
            - StripPrefix=1
            - name: CircuitBreaker
              args:
                name: orderCircuitBreaker
                fallbackUri: forward:/fallback/orders


resilience4j:
  circuitbreaker:
    instances:
      orderCircuitBreaker:
        slidingWindowSize: 10
        failureRateThreshold: 50
        waitDurationInOpenState: 30s

다음 챕터

CH.23 "Eureka 서비스 디스커버리" — 동적 등록·발견.


AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude

무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6

내 Spring 코드의 API Gateway 부분을 분석해서
라우팅·인증·rate limit 정책와 개선 우선순위를 알려줘.
ChatGPT

무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro

API Gateway vs 다른 패턴 비교를
실전 사례 5개로 보여주고 Spring Gateway vs Kong vs Nginx를 알려줘.
Gemini

무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro

내 코드베이스 전체를 분석해서
API Gateway 관련 Gateway 누락·과도 위치를 보고해줘.
Grok

무료: Grok 4.1 / SuperGrok $30/mo

2026년 한국 기업의 API Gateway 채택률과
한국 MSA Gateway 채택률를 솔직히 알려줘.

⭐ 이것만 기억하세요
Spring Cloud Gateway: API 게이트웨이 이 3가지만 확실히 잡으세요
1.API Gateway는 MSA 단일 진입점 — 라우팅·인증·Rate Limiting 중앙화
2.Spring Cloud Gateway는 reactive(WebFlux) 기반 — 높은 동시성
3.다음 챕터 CH.23에서 Eureka — 서비스 디스커버리


공유하기
진행도 91 / 99