java
CHAPTER 91 / 99
읽기 약 2분
FUNCTION
Spring Cloud Gateway: API 게이트웨이
핵심 개념
라우팅·필터·로드 밸런싱·Rate Limiting — MSA 앞단 게이트웨이.
본문
Gateway 역할
[Client] → [Gateway] → [User Service]
→ [Product Service]
→ [Order Service]
기능:
- 라우팅 (path 기반 → 서비스)
- 인증 (JWT 검증)
- 로드 밸런싱
- Rate Limiting
- 요청/응답 변환
- 로깅·모니터링Gateway 설정
// build.gradle
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'# 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 인증
@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
@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
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