본문 바로가기

SpringFramework Core - I. IoC 컨테이너/5. Bean Scopes

5.4.1. 웹 초기 설정

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-scopes-other-web-configuration

 

 

요청, 세션, 애플리케이션, 웹소켓 레벨의 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의 더 깊은 곳에서 사용가능해지는 것이다.