SpringMVC

[SpringMVC] RequestScope Bean(2)

wookjae 2021. 9. 14. 19:01

RequestScope Bean ?

* 빈(Bean)을 정의할 때 RequestScope로 정의할시, Servlet요청이 발생할 때 마다 새로운 Bean객체가 주입된다. 

* @Autowired, @Resource 어노테이션을 사용하여 생성되는 빈을 활용 할 수 있다.

* 빈(Bean)을 등록하는 방법으로 Java의 @RequestScope 어노테이션 활용 또는, Xml의 <bean/> 정의시 scope="request" 속성을 지정하는 방법이 있다.

* 스코프(scope)에 관한 속성은 request 이외에 prototype, singleton, session, application 등.. 존재한다. 스코프 설정에 따라서 빈(Bean)으로 선언한 객체가 생성되서 주입받는 시기가 달라진다.

  - prototype(프로토타입) : 빈(Bean)을 주입 받을때마다 새로운 객체가 생성, 다른 주소값으로 할당된다.

  - sigleton(싱글톤) : 애플리케이션에서 한번만 생성하며 같은 객체, 같은 주소값으로 사용한다.

 

 

 


RequestScope Bean Exercise..

 

 

-- Java 설정.

 

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

* ReqBean, ReqBean2, ReqBean3, ReqBean4 클래스 선언 (리퀘스트스코프)

[ReqBean, ReqBean2] :  클래스 선언 -> @Configuration, @Bean, @RequestScope 사용하여 빈 수동등록

[ReqBean3, ReqBean4] :  @Component, @ComponentScan, @RequestScope 사용하여 빈 자동등록

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

 

 

 

2. RootAppContext, ServletAppContext 수정 - 빈 등록 

* ReqBean, ReqBean2, ReqBean3, ReqBean4 빈 등록 

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

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

 

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

--> ReqBean2:  @Bean("빈 이름: requestBean2")

     ReqBean4 @Component(value="빈 이름: requestBean4")

 

 

 

3. TestReqBeanScope 컨트롤러 생성 

* @Autowired, @Resource 어노테이션을 사용하여 생성되는 빈(Bean)을 주입을 받아 사용할 수 있다.

-- @Autowired : 클래스 타입을 통하여, 객체를 주입받는다 (ReqBean, ReqBean3)

-- @Resource : 빈 생성시 설정했던 이름으로 주입받는다.  (ReqBean2, ReqBean4)

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

 

* @RequestScope는 Request요청 발생시 주입만 이루어지는 것 이므로, Request영역에 저장되지 않는다. 따라서, 빈(Bean)을 브라우저에서 활용할 시 Request영역 (Model, ModelAndView)에 저장해야 활용이 가능하다.

 

 

 

 

4. RequestScopeBean 확인 (Browser 테스트)

* 새로운 서블릿요청 ("/reqBeanTest1") 발생시 RequstScope로 정의된 빈(Bean) @Autowired, @Resource를 통한 객체주입 및 Setter를 통한 데이터저장 이후, forward 처리로 인하여 내부적으로 URL("/reqBeanTest1/result1")로 흐름이 이동되며 Getter를 통하여 이전, 주입된객체에 저장된 데이터 확인. 

 

 

 


-- Xml 설정.

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

 

 

 

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

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

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

 

 

 

2. servlet-context.xml 수정 - "빈 자동등록"

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

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

 

* Xml.설정파일에 선언한 빈(Bean) 주입 시도시. scope="request"으로 설정하여도 새로운요청 발생시 객체주입이 아닌, 애플리케이션이 구동될 시 빈(Bean) 주입을 시도하여 에러가 발생한다. 문제를 해결하기 위해 @Lazy어노테이션 활용.

 

@Controller
public class TestReqBeanScope {

   @Autowired
   @Lazy
   ReqBean requestBean1;

}