본문 바로가기
Spring

Chain of Responsibility

by ernest45 2025. 5. 10.

 

 

전에 doFilter를 호출할 때 3개의 파라미터로 넘겼다가 (Filter를 포함한 파라미터)

에러가 났다.

받는 filter는 chain을 따로 넘겨줄 필요가 없다. 왤까..

 

 

 

 

 

 

근데 직접 dofilter를 확인 했을 땐 분명히 chain까지 받았딴 말이지..

 

 

 

그 이유는 ApplicationFilterChain가 중간 관리자로 다음 필터를 호출하기 때문!

 

뭔가 Chain of Responsibility로 구성된 securityChiain이라서  객체가 체인형태라서 각 객체가 부를 것 같았지만,

역시 중간에서 모든 걸 지휘하는 관리자가 있었다..

 

 

그렇지만 핵심은 각 체인이다!

 

현재 체인이 이 일을 처리할 지 말 지를 정해서 다음 필터를 호출하니까!

 

현재 체인이 이 일을 처리하지 않고 넘기기로 했다면, 그 중간관리자인  ApplicationFilterChain에

등록된 다음 필터를 불러준다! (실제로는 현재 체인에서 dofilter를 해서 다음필터를 불렀기에)

 

 

 

 

public final class ApplicationFilterChain implements FilterChain {

    private ApplicationFilterConfig[] filters;  // 등록된 필터 배열
    private int pos = 0;  // 현재 위치

    @Override
    public void doFilter(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {

        // 1. 모든 필터를 다 호출했으면 서블릿으로 넘어감
        if (pos < filters.length) {
            // 2. 다음 필터 호출
            Filter nextFilter = filters[pos++].getFilter();
            nextFilter.doFilter(request, response, this); // ★ 여기 핵심
        } else {
            // 3. 마지막이면 DispatcherServlet 호출
            servlet.service(request, response); // Spring MVC의 시작점
        }
    }
}