1. web.xml에 필터 등록하기
사용자 삽입 이미지FilterToBeanProxy를 Acegi Filter Chain Proxy로 등록합니다. FilterToBeanProxy는 스프링 애플리케이션 컨텍스트에 위치한 bean을 참조할 수 있도록 만들어둔 클래스입니다. 이녀석이 없었다면 일일히 모든 Filter에서 다음과 같은 코드를 삽입하여, Spring에 종속적인 코드를 만들어 가면서까지, 스프링 애플리케이션 컨텍스트에 위치한 bean을 필터에서 사용했을 것입니다.

ApplicationContext ctx = WebApplicationContextUtils.
getWebApplicationContext(servletContext);
Bar bar = (Bar) ctx.getBean("bar");

FilterToBeanProxy는 실제로 자신이 할 일을 스프링 애플리케이션 컨텍스트에 위치한 bean에게 모두 위임을 하는데, 그 bean을 찾기 위한 파라미터가 바로 targetClass 입니다. 이 필터를 생성할 때 스프링 애플리케이션 컨텍스트에서 targetClass 파라미터의 값으로 설정된 타입의 bean을 찾습니다. 즉 위의 설정을 보면 org.acegisecurity.util.FilterChainProxy를 찾게 되는 것입니다. 그리고 찾은 FilterChainProxy에게 할 일을 위임하는 것입니다. 그래야 스프링의 장점 중 하나인 DI(Dependency Injection)를 백분 활용할 수 있을 것이며, web.xml이 복잡해지지 않을 것입니다.

targetClass 속성 말고 targetBean 속성을 사용해서 스프링 애플리케이션 컨텍스트에 위치한 bean의 이름을 사용하여 역할을 위임할 bean을 찾을 수도 있는데, 만약에 bean의 이름을 변경하면, web.xml에서도 targetBean 속성의 값을 변경해야하기 때문에, targetClass 속성의 사용을 권장하고 있습니다.

이렇게 filter 설정을 마치면.. 이 filter를 적용할 url을 설정해 줍니다. 그 부분이 filter-mapping이며, 설정 내용을 보시면 모든 url이 모두 이 필터를 거치도록 설정한 것을 보실 수 있습니다.

이제 해당 웹 애플리케이션으로 들어오는 모든 요청은 FilterToBeanProxy를 거치게 되며, 이 녀석은 FilterChainProxy에게 그 역할을 위임합니다. 결국 모든 요청은 스프링 애플리케이션 컨텍스트에 등록되어 있는 FilterChainProxy를 거치게 되는 것입니다.

그럼 다음 글에서 FilterChainProxy를 살펴보겠습니다.

참조 : SIA 2판 7장