필터 체인 패턴은 요청을 처리하기 전후에 다양한 필터를 순차적으로 적용하여 처리 흐름을 제어하는 디자인 패턴이다. 이 패턴은 여러 개의 필터를 연결하고, 지정된 순서대로 실행되도록 구성한다.
기본적인 구성 요소는 다음과 같다:
- 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] 인증 후처리 완료 필터 체인 종료