p292에 보니까 "DelegatingFilterProxy는 기본적으로 Filter.init() 메서드와 Filter.destroy() 메서드에 대한 호출은 위임하지 않는데, 그 이유는 스프링 컨테이너가 제공하는 라이프 사이클이 있기 때문이다."라는 부분이 있습니다.
그런데 이 부분은 무슨 말인지 통 이해가 되지 않아서 설명을 좀 부탁드리고자 합니다.
일단 그냥 init(), destory()가 아니고 Filter.init(), Filter.destroy()인데 Filter라는 객체가 어디 나오는 것인지 모르겠고요.
---> Filter는 서블릿 스펙에 정의되어 있는 타입입니다. Filter에 대한 내용은 서블릿이나 JSP 관련 서적내지 관련 글을 보시면 참고하실 수 있습니다.
스프링 컨테이너가 제공하는 라이프 사이클이 있다는 말은 Filter.init(), Filter.destroy() 메서드를 스프링 컨테이너에서 호출해준다는 말인가요? 아님 그 반대의 뜻인가요? 스프링 컨테이너에서 호출해주는게 아니라면 어디서 통제가 된다는 뜻인지요?
제가 웹 개발을 초기에만 조금 공부하고 한동안 덮어서 아는게 가물가물하는지라... 지도편달해주시면 감사하겠습니다.
---> 원래 Filter를 web.xml 파일에 정의하면 서블릿 콘테이너(쉽게 말해 톰캣)가 Filter의 라이프사이클 메서드를 호출해줍니다. 하지만, Filter 객체를 스프링 컨테이너에 빈 객체로 등록할 경우 스프링이 제공하는 라이프사이클 인터페이스/애노테이션을 이용해서 라이프사이클을 관리할 수 있게 되죠. 이런 이유로 DelegatingFilterProxy는 Filter 자체의 라이프사이클 관련 메서드를 서블릿 컨테이너가 호출할 때, 그 호출을 스프링 컨테이너 빈에 등록된 Filter 객체에 전달하지 않는다는 겁니다.
p.s) 아 그리고... 책에 나온 말을 쭉 연결해보니까
하나의 "웹 어플리케이션"마다 하나의 "ServletContext"가 대응되고
하나의 "웹 어플리케이션"은 하나 이상의 "Servlet"으로 구성되고 또한 하나 이상의 "WebApplicationContext"를 가질 수 있는데
그럼 "WebApplicationContext"는 "Servlet"과 일대일로 대응되는 관계인가요?
일대일 대응이 아니라면 p290에서 "서블릿이름"으로 만든 "속성 이름(attrName)"을 가지고
"WebApplicationContext"를 찾을 수 없을 것 같긴 한데 정확히 어떤 관계인지 궁금합니다.
---> WebApplicationContext는 스프링 컨테이너인데요, 서블릿 수준의 컨테이너와 ServletContext 수준의 컨테이너가 존재합니다.