Spring MVC에서의 빈 관리 (ApplicationScope)
처음 요청이 발생해서부터 응답결과가 전달될 때까지의 범위를 RequestScope,
브라우저에 의해 최초의 요청이 발생되고 브라우저가 종료될 때까지의 범위를 SessionScope,
서버가 가동될 때부터 서버가 종료되는 시점까지의 범위를 ApplicationScope라고 부른다!!
ApplicationScope동안 사용할 수 있는 메모리영역이 만들어지며 ServletContext라는 클래스 타입의 객체로 관리된다.
ServletContext에 저장된 데이터나 객체는 서버가 종료되기 전까지 웹브라우저에 관계없이 동일한 메모리 공간을 사용하게 된다. 즉, 서버만 종료되지 않는다면 다른 브라우저에서도 같은 메모리공간을 사용할 수 있다는 의미이다.
1. ServletContext
ServletContext는 HttpServletRequest에서 받아올 수 있다. 위와 같이 ServletContext형 변수를 만들어서 받아온 후에 사용할 수 있다. Request영역이나 Session영역과 크게 다를바는 없다. ServletContext를 사용한다는것만 알아두도록 하자.
ServletContext는 타입을 통한 주입으로 Controller에서 주입을 받을 수 있다.
위와 같이 @Autowired로 ServletContext를 자동주입 받아 오면 매개변수로 HttpServletRequest를 받아오지 않아도 ServletContext를 이용해서 Application영역의 메모리공간을 사용할 수 있다.
2. ApplicationScope 빈 주입
빈을 정의할 때 ApplicationScope로 정의하면 서버가 가동될 때 자동으로 주입된다. 주입된 빈은 주입만 이루어지는 것이므로 Application영역에는 저장되지 않는다. (RequestScope, SessionScope와 동일하다.)
자바 빈 설정파일에 다음과 같이 @ApplicationScope를 사용해서 빈을 2개 정의해주었다. 위의 bean1메소드는 타입을 통한 빈 주입에 사용될 것이고 bean2메소드는 이름을 통한 빈 주입에 사용될 것이다.
각각 타입을 통한 주입과 이름을 통한 주입이다. 위에서 설명하였듯, Application영역에 직접 주입되는 것이 아니기 때문에 View단에서 사용하려면 Model을 사용하여 현재 빈을 Request영역에 넣어서 보내주어야 한다.
<body>
<h1> result </h1>
data1 : ${requestScope.application.data1}<br/>
data2 : ${requestScope.application.data2}<br/>
</body>
Application영역이 아닌 Request영역에 잘 들어갔는지 (사실 Model로 넘겨주었으니 당연한것.) 확인하기 위해 requestScope를 앞에 붙여주었다. 결과는 잘 나왔다.
만약 빈을 xml에서 만들어주었다면?
root-context.xml에 위와 같이 설정해 주면 되겠다.
다음으로는 컨포넌트 어노테이션을 이용한 빈 주입을 살펴보도록 하자.
빈 클래스에 @Component와 @ApplicationScope을 붙여준다. 그리고 컴포넌트 스캔을 설정해주면 된다.
자바 빈 설정파일과 xml의 컴포넌트 스캔 등록방법은 다음과 같다. bean객체가 있는 패키지를 등록해주면 된다.
@Component는 기본적으로 타입을 통한 객체 자동주입이 때문에 위의 @Autowired를 사용한 예제와 똑같이 해주면 된다.