스프링 Request Scope 빈 주입

728x90

spring 리다이렉트 and 포워드.png

  • @Autowired를 활용하여 Bean을 자동으로 주입 받을 수 있다.
  • 스프링 코어에서 prototype과 singleton이 있다.
  • Spring MVC에서는 추가로 request, session, application을 제공하고 있다.

Request scope

  • Bean을 정의 할 때 request scope 로 정의하면 요청이 발생할 때 마다 Bean 객체가 생성되어 자동으로 주입된다.
  • 주입된 Bean은 요청 발생 시 주입만 이루어지는 것이므로 request 영역에 저장되지는 않는다.
  • Xml로 Bean을 설정하고 byName으로 주입 받은 경우에만 request 영역에 자동 저장 된다.

java 방식 @RequestScope 어노테이션 사용

xml 방식 bean을 정의 할 때 scope="request"로 설정

config 패키지를 생성하고 RootAppContext 클래스를 만든다. 모든 빈 주입은 여기서 이루어지게 된다.

 

@Configuration
public class RootAppContext{
	
	@Bean
	@RequestScope //빈이 주입되는 시기가 새로운 요청이 발생했을 때
	
	public MemberDTO member() {
		return new MemberDTO();
	}	
}
@Controller
public class TestController{
	
	@Autowired //정의된 Bean중에서 MemberDTO로 정의가 된 것이 있는지 확인.
	MemberDTO requestMember; 
	
	@GetMapping("/test")
	public String test(){
		requestMember.setName("홍길동");
		requestMember.setId("hong");

		return "forward:test1"; //forward 사용에는 현재 주입되는 시기가 새로운 요청이 발생했을 경우여서
		//forward는 새로운 요청이 아니기에 객체가 유지된다.
	}
}

주입받은 MemberDTO 객체에 requestMember 라는 객체는 유지되지만 request객체에 담기는 것이 아니기 때문에 view로 출력 할 수 없다.

 

따라서

 

	@GetMapping("/test1")
	public String test1(Model model){
		model.addAttribute("requestMember",requestMember);
		//모델로 받아서 request 영역에 저장해야만 출력이가능
		
		return ""; 
	}

xml 방식은

root-context.xml 에 주입한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	<bean class="com.tests.test.members.MemberDTO" scope='request'/> <!--패키지명-->
</beans>

이렇게되면 오류가 발생한다. 그 이유는 java 빈 주입을 할 경우는 새로운 요청이 발생하지 않아도 주입이 되기 때문이다. 그래서 여러 해결방안중 한개는 @Lazy를 사용해 나중에 주입되게 만들 수 있다.

@Controller
public class TestController{
	
	@Autowired //정의된 Bean중에서 MemberDTO로 정의가 된 것이 있는지 확인.
	@Lazy //서버가 시작 될 때 주입되지않고 대기하고 있다가 요청이 발생하면 주입된다.
	MemberDTO requestMember; 
	
	@GetMapping("/test")
	public String test(){
		requestMember.setName("홍길동");
		requestMember.setId("hong");

		return "forward:test1"; //forward 사용에는 현재 주입되는 시기가 새로운 요청이 발생했을 경우여서
		//forward는 새로운 요청이 아니기에 객체가 유지된다.
	}
}

Bean에 이름을 정의하는 방법

@Configuration
public class RootAppContext{
	
	@Bean("requestMember") //이름 정의
	@RequestScope //빈이 주입되는 시기가 새로운 요청이 발생했을 때
	
	public MemberDTO member() {
		return new MemberDTO();
	}	
}

이름을 통한 주입 이기 때문에 @Resource를 사용

@Controller
public class TestController{
	
	@Resource(name = "requestMember")
	@Lazy
	MemberDTO requestMember;
	
	@GetMapping("/test")
	public String test(){
		requestMember.setName("홍길동");
		requestMember.setId("hong");

		return "forward:test1"; //forward 사용에는 현재 주입되는 시기가 새로운 요청이 발생했을 경우여서
		//forward는 새로운 요청이 아니기에 객체가 유지된다.
	}
}

이것의 xml 방법은

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- Root Context: defines shared resources visible to all other web components -->
	<bean class="com.tests.test.members.MemberDTO" scope="request"/> <!--패키지명-->
	<bean class="com.tests.test.members.MemberDTO" id="requestMember" scope="request"/>
</beans>

xml 방식의 id 를 주고 scope를 request 주면 request 영역에 자동으로 저장된다. 그래서 위에 다른 방법처럼 model을 생성하지 않아도 출력에 사용 할 수 있다.

 

@Component로 빈을 주입하는 방법

@Component //@Component(value = "requestMember") 이름으로 주입된다. 
@RequestScope
public class MemberDTO{
	private String name;
	private String id;
	//getter, setter 생략
}

config 패키지에 ServletAppContext 클래스

//Spring MVC 프로젝트에 관련된 설정하는 클래스
@Configuration
//Controller 어노테이션이 셋팅되어 있는 클래스를 Controller로 등록한다.
@EnableWebMvc
//스캔할 패키지를 정한다.
@ComponentScan("com.tests.test.controller")
@ComponentScan("com.test.test.beans") // 빈 캐피지를 스캔한다.
public class ServletAppContext implements WebMvcConfigurer{
	//Controller의 메서드가 반환하는 .jsp의 이름앞뒤에 경로와 확장자를 붙여주도록 설정한다.
	
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("WEB-INF/views/", ".jsp");
	}
} 

 

단순 주입만 이루어지기 때문에 request 영역에 저장되지 않는다.

 

xml 방법으론

servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- 스캔할 Bean들이 모여있는 패키지를 지정한다 -->
	<context:component-scan base-package="com.tests.test.controller"/>
	<context:component-scan base-package="com.tests.test.members"/>

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="com.tests.test" />
	
	
	
</beans:beans>

스캔 시켜주어야 한다.

반응형

'Back-End > Spring(Boot)' 카테고리의 다른 글

스프링 Session 빈 주입  (0) 2021.03.06
스프링 Session  (0) 2021.03.06
스프링 RequestScope  (0) 2021.03.06
스프링 Redirect / Forward  (0) 2021.03.06
스프링 Form 커맨드 태그  (0) 2021.03.05