필터 체인 디자인 패턴 구현

필터 체인 패턴은 요청을 처리하기 전후에 다양한 필터를 순차적으로 적용하여 처리 흐름을 제어하는 디자인 패턴이다. 이 패턴은 여러 개의 필터를 연결하고, 지정된 순서대로 실행되도록 구성한다.

기본적인 구성 요소는 다음과 같다:

  • FilterChain 인터페이스: 모든 필터가 구현해야 하는 공통 인터페이스
  • MainFilterProcessor: 필터들을 관리하고 순차적으로 호출하는 역할
  • 개별 필터 클래스들: 실제 로직을 수행하는 각각의 필터
  • FilterRunner: 전체 필터 체인을 실행하는 클라이언트 코드

필터 체인 인터페이스 정의

package com.example.demo.filters;

import javax.servlet.http.HttpServletRequest;

public interface FilterChain {
    void process(HttpServletRequest req, FilterChain next);
}

필터 관리 및 실행 담당 클래스

package com.example.demo.filters;

import java.util.ArrayList;
import java.util.List;

public class MainFilterProcessor implements FilterChain {
    
    private final List<FilterChain> filters = new ArrayList<>();
    private int currentIndex = 0;

    @Override
    public void process(HttpServletRequest req, FilterChain next) {
        if (currentIndex >= filters.size()) return;
        
        FilterChain currentFilter = filters.get(currentIndex++);
        currentFilter.process(req, this);
    }

    public void register(FilterChain filter) {
        filters.add(filter);
    }
}

개별 필터 구현체들

package com.example.demo.filters;

import javax.servlet.http.HttpServletRequest;

public class AuthenticationFilter implements FilterChain {
    @Override
    public void process(HttpServletRequest req, FilterChain next) {
        System.out.println("[1] 인증 확인 중...");
        next.process(req, next);
        System.out.println("[6] 인증 후처리 완료");
    }
}
package com.example.demo.filters;

import javax.servlet.http.HttpServletRequest;

public class LoggingFilter implements FilterChain {
    @Override
    public void process(HttpServletRequest req, FilterChain next) {
        System.out.println("[2] 로깅 시작");
        next.process(req, next);
        System.out.println("[5] 로깅 종료");
    }
}
package com.example.demo.filters;

import javax.servlet.http.HttpServletRequest;

public class DataValidationFilter implements FilterChain {
    @Override
    public void process(HttpServletRequest req, FilterChain next) {
        System.out.println("[3] 데이터 검증 진행");
        // 마지막 필터에서는 다음 필터를 호출하지 않음
    }
}

필터 체인 실행기

package com.example.demo.filters;

public class FilterRunner {
    
    private void runFilters() {
        MainFilterProcessor processor = new MainFilterProcessor();
        processor.register(new AuthenticationFilter());
        processor.register(new LoggingFilter());
        processor.register(new DataValidationFilter());
        
        System.out.println("필터 체인 시작");
        processor.process(null, processor);
        System.out.println("필터 체인 종료");
    }

    public static void main(String[] args) {
        new FilterRunner().runFilters();
    }
}

실행 결과:

[1] 인증 확인 중...
[2] 로깅 시작
[3] 데이터 검증 진행
[5] 로깅 종료
[6] 인증 후처리 완료
필터 체인 종료

태그: java Servlet design-pattern filter-chain

7월 16일 19:48에 게시됨