Spring

Spring Cloud Gateway에서 Custom Filter, Global Filter, Logging Filter 예제

TedDev 2024. 11. 28. 16:04
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