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;
}
'SpringMVC' 카테고리의 다른 글
[SpringMVC] SessionScope Bean(2) (0) | 2021.10.04 |
---|---|
[SpringMVC] SessionScope(1) (0) | 2021.09.20 |
[SpringMVC] RequestScope(1) (0) | 2021.09.10 |
[SpringMVC] Server응답 처리방식(Redirect, Forward) (0) | 2021.09.08 |
[SpringMVC] Server응답 처리방식(Request, Model, ModelAndView) (0) | 2021.09.05 |