728x90
Custom Filter
개념
Custom Filter는 특정한 요구사항을 처리하기 위해 개발자가 직접 정의한 필터이다. 특정 라우트(Route)에만 적용되며 Spring Cloud Gateway의 필터 체인에서 요청 또는 응답을 조작할 수 있다.
예제
Custom Filter 구현
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
public class CustomHeaderFilter extends AbstractGatewayFilterFactory<CustomHeaderFilter.Config> {
public CustomHeaderFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// 요청 헤더에 사용자 정의 헤더 추가
ServerWebExchange modifiedExchange = exchange.mutate()
.request(r -> r.headers(headers -> headers.add("X-Custom-Header", "MyCustomValue")))
.build();
return chain.filter(modifiedExchange);
};
}
public static class Config {
// 추가 설정이 필요한 경우 여기에 정의 가능
}
}
Spring Bean 등록
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Bean
public CustomHeaderFilter customHeaderFilter() {
return new CustomHeaderFilter();
}
}
YAML에서 Custom Filter 사용
spring:
cloud:
gateway:
routes:
- id: custom_filter_route
uri: http://example.com
filters:
- name: CustomHeaderFilter
Global Filter
개념
Global Filter는 모든 라우트에 공통으로 적용되는 필터이다. 보통 애플리케이션 전역에서 공통으로 필요한 작업(예: 인증, 로깅, 요청 검증 등)을 처리할 때 사용된다.
예제
Global Filter 구현
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
public LoggingFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// 요청 로깅
System.out.println("Request Path: " + exchange.getRequest().getPath());
System.out.println("Request Headers: " + exchange.getRequest().getHeaders());
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 응답 로깅
System.out.println("Response Status Code: " + exchange.getResponse().getStatusCode());
}));
};
}
public static class Config {
// 추가 설정 필요 시 여기에 정의
}
}
자동 적용
- Global Filter는 모든 라우트에 자동으로 적용되므로 별도의 추가 설정이 필요하지 않다.
Logging Filter
개념
Logging Filter는 요청/응답 정보를 로깅하기 위해 사용되는 필터이다. 이를 통해 디버깅이나 모니터링에 필요한 데이터를 기록할 수 있다.
예제
Logging Filter 구현
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
public class LoggingFilter extends AbstractGatewayFilterFactory<LoggingFilter.Config> {
public LoggingFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
return (exchange, chain) -> {
// 요청 로깅
System.out.println("Request Path: " + exchange.getRequest().getPath());
System.out.println("Request Headers: " + exchange.getRequest().getHeaders());
return chain.filter(exchange).then(Mono.fromRunnable(() -> {
// 응답 로깅
System.out.println("Response Status Code: " + exchange.getResponse().getStatusCode());
}));
};
}
public static class Config {
// 추가 설정 필요 시 여기에 정의
}
}
Spring Bean 등록
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Bean
public LoggingFilter loggingFilter() {
return new LoggingFilter();
}
}
YAML에서 Logging Filter 사용
spring:
cloud:
gateway:
routes:
- id: logging_filter_route
uri: http://example.com
filters:
- name: LoggingFilter
요약
- Custom Filter : 특정 라우트에만 적용되며, 사용자가 직접 정의.
- Global Filter : 모든 요청에 공통으로 적용. 전역 설정 작업 처리.
- Logging Filter : 요청 및 응답 데이터를 기록하여 디버깅 및 모니터링에 활용.
반응형
'Spring' 카테고리의 다른 글
Resilience4j 개요 (0) | 2024.12.21 |
---|---|
Spring Cloud Gateway (0) | 2024.11.26 |
분산 락(Distributed Lock) (0) | 2024.11.21 |
AOP - Advice, Target, Pointcut (0) | 2024.11.18 |
Spring Cloud Config (1) | 2024.11.12 |