SpringMVC

[SpringMVC] ApplicationScope Bean(2)

wookjae 2021. 10. 16. 23:11

ApplicationScope Bean ?

* 빈(Bean)을 정의할 때 ApplicationScope로 정의할시,  WAS(Web Application Server) 가동될 때, @ApplicationScope로 정의된 Bean객체가 주입된다.

(주입객체는 웹애플리케이션서버(WAS)가 종료되기 전까지 같은 주소값을 가지며 해당 객체에 데이터 저장유지 및 공유된다)

* 빈(Bean)이 주입되는 방법만 정의되는 것이며, Application영역에 빈(Bean)이 저장되지 않는다. 

* 빈(Bean)을 등록하는 방법으로 Java의 @ApplicationScope 어노테이션 활용 또는,

Xml의 <bean/> 정의시 scope="application" 속성을 지정하는 방법이 있다.

 

# @RequestScope: 새로운 요청이 발생될 때마다 Bean주입되며 새로운 인스턴스가 할당되므로 객체주소값이 바뀐다.

# @SessionScope: 세션영역 생성시점(Browser에서 서버로 최초요청)에 Bean주입되며 해당 브라우저가 종료되기 전 까지 Bean은 재 주입 되지않는다. 객체의주소값이 유지된다.

 


 ApplicationScope Bean Exercise..

 

-- Java 설정.

 

1. 빈 등록을 위한, 클래스선언 (ApplicationScope) 

* ApplicationBean1, ApplicationBean2, ApplicationBean3, ApplicationBean4 클래스 선언 (어플리케이션스코프)

[ApplicationBean1, ApplicationBean2] :  빈 등록 클래스 --> @Configuration, @Bean, @ApplicationScope 사용하여 빈 수동등록

[ApplicationBean3, ApplicationBean4] :  @Component, @ComponentScan, @ApplicationScope 사용하여 빈 자동등록

@Component사용시, @ComponentSacn에 스캔할 컴포넌트의 패키지(Package)경로를 등록해야 한다.

 

 

2. RootAppContext, ServletAppContext 수정 - 빈 등록 

* ApplicationBean1, ApplicationBean2, ApplicationBean3, ApplicationBean4 빈 등록 

[ApplicationBean1, ApplicationBean2] :  @Configuration, @Bean을 사용하여 수동으로 빈 수동등록.

[ApplicationBean3, ApplicationBean4] :  @ComponentSacn("컴포넌트 스캔경로") 를 선언함으로써 컴포넌트 스캔을 통한 @Component 선언된 클래스 빈(Bean) 자동등록.  

 

* [ApplicationBean2, ApplicationBean4] 클래스타입이 아닌 설정 빈 이름으로 주입.

--> ApplicationBean2:  @Bean("빈 이름: applicationBean2")

    ApplicationBean4  @Component(value="빈 이름: applicationBean4")

 

 

4. TestApplicationScopeBeanController 컨트롤러 생성

* @Autowired, @Resource 어노테이션을 사용하여 @ApplicationScope로 생성되는 빈(Bean)을 주입 및 사용한다.

-- @Autowired : 클래스 타입을 통하여, 객체주입 (ApplicationBean1, ApplicationBean3)

-- @Resource : 빈 생성시 설정했던 이름으로 객체주입  (ApplicationBean2, ApplicationBean4)

   선언형식은 @Resource(name="빈 이름")와 같다.

 

* @Application는 빈(Bean)이 주입되는 방법만 정의되는 것이며, Application영역에 빈(Bean)이 저장되지는 않는다. 따라서, Request영역(Model, ModelAndView)에 저장하여 빈(Bean) 활용이 가능하다.

 



3. ApplicationScopeBean 확인 (Browser 테스트)

* 최초 서블릿요청 ("/applicationBeanTest1") 발생시 ApplicationScope로 정의된 빈(Bean) @Autowired, @Resource를 통한 객체주입 및 Setter를 통한 데이터저장 이후, 서블릿 재 요청 ("/applicationBeanResult/{browser}") 에서 위, ApplicationScope저장된 객체에 관하여 Getter를 통하여 저장된 데이터 확인. 

 

*  WAS(Web Application Server) 가동될 때, @ApplicationScope로 정의된 Bean객체가 주입 후 유지.

 

* 여러 웹 브라우저(Chrome, Internet Explorer, Edge Explorer) 요청에 관계없이 같은 메모리공간(객체주소) 사용.

(@ApplicationScope객체는 웹애플리케이션서버(WAS)가 종료되기 전까지 같은 주소값을 가지며 해당 객체에 데이터 저장유지 및 공유된다 따라서, 여러브라우저에서도 동일하게 사용가능)

 

 


-- Xml 설정.

java 설정과 거의 동일하며 "빈 등록" 및 "컴포넌트스캔" 설정부분만 다르다.

 

 

1. root-context.xml 수정 - "빈 수동등록"

* 빈 수동등록 <bean class="빈 경로" scope="application" id="빈 이름"/>

  --> id 속성 지정시 @Resource(name="빈 이름") 으로 주입받으며, 객체주입시 Application영역에 자동으로 저장된다.

 

 

2. servlet-context.xml 수정 - "컴포넌트스캔: 빈 자동등록"

* 컴포넌트 스캔 경로 등록 - 스캔경로 관하여, @Component설정 빈(Bean) 자동등록

<context:component-scan base-package="컴포넌트 스캔경로" /> 

 

* 서버가 가동될 때 주입이 이루어지므로, 빈(Bean)을 주입받는 곳에서 @Lazy설정을 하지 않아도 된다.

 

@Controller
public class "ApplicationBean주입Controller" {

   @Autowired
   @Lazy
   ApplicationBean1 applicationBean1;

}

'SpringMVC' 카테고리의 다른 글

[SpringMVC] Properties 정의 및 활용(2)  (0) 2021.10.27
[SpringMVC] Properties 정의 및 활용(1)  (0) 2021.10.20
[SpringMVC] ApplicationScope(1)  (0) 2021.10.11
[SpringMVC] SessionScope Bean(2)  (0) 2021.10.04
[SpringMVC] SessionScope(1)  (0) 2021.09.20