Deep Dive into Spring Cloud Gateway Filters and Customization

스프링 클라우드 게이트웨이 필터 및 커스터마이징에 대한 딥 다이브

스프링 클라우드 게이트웨이는 마이크로서비스 아키텍처를 위한 API 게이트웨이 역할을 하는 프레임워크입니다. 게이트웨이에서 필요한 기능을 필터로 제공하여, 요청과 응답을 수정하거나 중간에 중단할 수 있습니다. 이번 글에서는 스프링 클라우드 게이트웨이의 필터 유형과 우선순위, 그리고 사용자 정의 필터 작성 및 적용 방법에 대해 살펴보겠습니다.

필터 유형 및 우선순위 이해

스프링 클라우드 게이트웨이에는 전역 필터와 라우터별 필터가 있습니다. 전역 필터는 모든 라우터에 적용되는 필터이며, 라우터별 필터는 특정 라우터에만 적용되는 필터입니다. 필터는 우선순위에 따라 적용됩니다. 필터가 여러 개일 경우, 우선순위가 높은 필터부터 적용됩니다.

스프링 클라우드 게이트웨이에는 기본적으로 다음과 같은 필터가 있습니다.

  • 인증 필터: 요청에 대한 인증을 수행하는 필터입니다.
  • 로깅 필터: 요청과 응답에 대한 로깅을 수행하는 필터입니다.
  • 보안 필터: 요청에 대한 보안을 수행하는 필터입니다.
  • 캐싱 필터: 요청에 대한 캐시를 수행하는 필터입니다.

각각의 필터는 스프링 빈으로 등록되어 있으며, 필요에 따라 커스터마이징할 수 있습니다.

사용자 정의 필터 작성 및 적용 방법 소개

스프링 클라우드 게이트웨이에서 사용자 정의 필터를 작성하는 방법은 크게 세 가지입니다.

GlobalFilter 인터페이스 구현

GlobalFilter 인터페이스를 구현하여 전역 필터를 작성할 수 있습니다. GlobalFilter 인터페이스는 다음과 같은 메서드를 제공합니다.

public interface GlobalFilter extends Ordered {
    Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
}

ServerWebExchange 객체는 요청과 응답에 대한 정보를 제공하며, GatewayFilterChain은 다음 필터를 호출하는 역할을 합니다. Ordered 인터페이스를 구현하여 필터의 우선순위를 설정할 수 있습니다.

다음은 GlobalFilter 인터페이스를 구현한 예시입니다.

@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 필터 로직 작성
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 1; // 필터 우선순위 설정
    }
}

GatewayFilterFactory 구현

GatewayFilterFactory 인터페이스를 구현하여 라우터별 필터를 작성할 수 있습니다. GatewayFilterFactory 인터페이스는 다음과 같은 메서드를 제공합니다.

public interface GatewayFilterFactory {
    GatewayFilter apply(T config);
    class Config {
        // 필터 설정 정보
    }
}

apply 메서드는 필터를 생성하여 반환하며, Config 클래스는 필터의 설정 정보를 담고 있습니다.

다음은 GatewayFilterFactory 인터페이스를 구현한 예시입니다.

@Component
public class CustomGatewayFilterFactory implements GatewayFilterFactory {
    @Override
    public GatewayFilter apply(Config config) {
        return ((exchange, chain) -> {
            // 필터 로직 작성
            return chain.filter(exchange);
        });
    }

    @Override
    public Config newConfig() {
        return new Config();
    }

    public static class Config {
        // 필터 설정 정보
    }
}

RoutePredicateFactory 구현

RoutePredicateFactory 인터페이스를 구현하여 특정 라우터에 대한 필터를 작성할 수 있습니다. RoutePredicateFactory 인터페이스는 다음과 같은 메서드를 제공합니다.

public interface RoutePredicateFactory {
    RoutePredicate apply(T config);
    class Config {
        // 필터 설정 정보
    }
}

apply 메서드는 필터를 생성하여 반환하며, Config 클래스는 필터의 설정 정보를 담고 있습니다.

다음은 RoutePredicateFactory 인터페이스를 구현한 예시입니다.

@Component
public class CustomRoutePredicateFactory implements RoutePredicateFactory {
    @Override
    public RoutePredicate apply(Config config) {
        return exchange -> {
            // 필터 로직 작성
            return true;
        };
    }

    @Override
    public Config newConfig() {
        return new Config();
    }

    public static class Config {
        // 필터 설정 정보
    }
}

결론

이번 글에서는 스프링 클라우드 게이트웨이의 필터 유형과 우선순위, 그리고 사용자 정의 필터 작성 및 적용 방법에 대해 살펴보았습니다. 필터는 게이트웨이에서 필요한 기능을 제공하며, 필요에 따라 커스터마이징할 수 있습니다. 이를 통해 마이크로서비스 아키텍처에서 필요한 요청과 응답 처리를 보다 쉽게 구현할 수 있습니다.