요청, 세션, 애플리케이션, 웹소켓 레벨의 scope를 제공하고 싶다면, bean을 정의하기 전에 약간의 minor한 초기 설정들이 필요하다(이러한 초기 설정은 싱글턴이나 프로토타입 scope에서는 필요없다).
이 초기 설정을 어떻게 하느냐는 어떤 서블릿 환경이냐에 따라 다르다.
스프링 웹 MVC의 DispatcherServlet을 통해 처리되는 요청에서는, 위 scope를 가진 bean들에 접근할 때 사실상 특별한 설정이 필요없다. DispatcherServlet이 이미 모든 관련된 상태값을 표현하고 있기 때문이다.
스프링의 DispatcherServlet 밖에서 요청이 처리되는 서블릿 2.5 웹 컨테이너를 사용한다면(예를 들어, JSF나 Struts) org.springframework.web.context.request.RequestContextListener, ServletRequestListener를 등록해줘야 한다. 서블릿 3.0 이상일 때는, WebApplicationInitializer 인터페이스를 사용하면 이 등록과정이 프로그램적으로 이루어진다. 더 오래된 컨테이너들이라면, 다음 선언을 web.xml 파일에 추가해주면 된다.
<web-app>
...
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
...
</web-app>
만약 listener 설정에 문제가 있다면 스프링의 RequestContextFilter를 사용하면 된다. 웹 애플리케이션 설정의 환경에 의존하기 때문에 필터 매핑을 적절하게 바꿀 수 있기 때문이다. 다음 리스트는 웹 애플리케이션의 필터 부분이다.
<web-app>
...
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>
DispatcherServlet, RequestContextListener, RequestContextFilter는 모두 정확히 같은 일을 한다. 즉, 서비스 중인 쓰레드와 HTTP 요청 객체를 묶어주는 일이다. 이를 통해 요청, 세션 scope의 bean들이 call chain의 더 깊은 곳에서 사용가능해지는 것이다.
'SpringFramework Core - I. IoC 컨테이너 > 5. Bean Scopes' 카테고리의 다른 글
5.4.3. 세션 Scope (0) | 2020.03.19 |
---|---|
5.4.2. 요청 scope (0) | 2020.03.19 |
5.4. 요청, 세션, 애플리케이션 그리고 웹소켓 Scopes (0) | 2020.03.19 |
5.3. 싱글턴 bean과 프로토타입 bean 사이의 의존성 (0) | 2020.03.19 |
5.2. 프로토타입 Scope (0) | 2020.03.19 |