본문 바로가기
Spring/Spring MVC 5

RequestScope 빈 주입

코동이 2020. 5. 26.

Bean을 @Autowired를 통해서 자동주입 받을 수 있다.

스프링 코어에서 prototype(새로운 객체 생성)과 singleton(같은 객체에 반복)이 있다.

Spring MVC에서는 request,session,application의 기능을 잘 사용해야 한다.

 

*주입된 Bean은 요청 발생시 주입만 이루어지기 때문에!!! request에 자동으로 저장되지 않는다.!!!

따라서 jsp에 전달하기 위해서는 model을 통해서 전달해야 한다.

 

Bean을 생성하는 방법에는 2가지가 있다.

1. @Bean을 이용한 생성 2. @Component를 이용한 생성

 

1. @Bean을 이용한 생성 

<RootAppContext.text>

@Bean
@RequestScope
public DataBean1 databean1(){
	return new DataBean1();
}

@Bean
@RequestScope
public DataBean2 databean2(){
	return new DataBean2();
}

Bean을 먼저 생성해주도록 한다. DataBean1과 DataBean2 이며, return은 생성자를 return한다.

 

2. @Component를 이용한 생성

 

<DataBean3.java>

@Component
@ReqeustScope
public String DataBean3{
	private String data3;
    private String data4;
    
    //getteer(), setter()생성
}

==================================================

<DataBean4.java>

@Component
@RequestScope
public String DataBean4{
	private String data5;
    private String data6;
  	
    //getter() , setter() 생성
}

RootAppContext.java는 Bean을 생성하기 위한 전용 클래스이며 @Bean을 통해 생성했는데, 이번에는 직접 class에서 @Component와 @RequestScope를 통해 등록한다.

 

2가지 방법 모두 @RequestScope를 가지고 있기 때문에, 요청이 왔을 때 Bean에 등록이 된다.

 

<TestController.java>

@Autowired
DataBean1 requestBean1;

@Resource(name="requestBean2")
DataBean2 requestBean2;

@Autowired
DataBean3 requestBean3;

@Resource(name="requestBean4")
DataBean4 requestBean4;

@Bean을 이용하든지, @Component를 이용하던지 controller에서 사용은 같다. @Autowired를 사용하면, Bean 주입이 되고 사용이 가능하다. 각 클래스가 가지고 있는 setter()함수를 통해 값을 설정할 수 있으며 getter()함수를 통해 설정 한 값을 출력 해 볼 수 있다.

 

<TestController.java>

@GetMapping("/test1")
	public String test1() {
		requestBean1.setData1("문자열1");
		requestBean1.setData2("문자열2");
		
		requestBean2.setData3("문자열3");
		requestBean2.setData4("문자열4");
		
		requestBean3.setData5("문자열5");
		requestBean3.setData6("문자열6");
		
		requestBean4.setData7("문자열7");
		requestBean4.setData8("문자열8");
		//foward는 새로운 요청을 하지 않기 때문에 그냥 result1으로 객체가 넘아간다.
		return "forward:/result1";
	}

forward는 새로운 요청을 하지 않으므로, result1에 그대로 객체의 정보가 이동을 한다.

 

@GetMapping("/result1")
	//public String result1(HttpServletRequest request) { <- 정보가 제대로 전달되지 못한다.
	public String result1(Model model) {
		System.out.println(requestBean1.getData1());
		System.out.println(requestBean1.getData2());
		System.out.println(requestBean2.getData3());
		System.out.println(requestBean2.getData4());
		System.out.println(requestBean3.getData5());
		System.out.println(requestBean3.getData6());
		System.out.println(requestBean4.getData7());
		System.out.println(requestBean4.getData8());
		
		
		model.addAttribute("requestBean1", requestBean1);
		model.addAttribute("requestBean2", requestBean2);
		model.addAttribute("requestBean3", requestBean3);
		model.addAttribute("requestBean4", requestBean4);
		return "result1";
	}

여기서 주의할 것은, @Autowired는 Bean의 주입만 해 줄 뿐, request객체에 저장하지는 않는다.!!

따라서 model을 통해서 값을 저장해야 jsp에 정상적으로 출력할 수 있다.

반응형

'Spring > Spring MVC 5' 카테고리의 다른 글

유효성 검사  (0) 2020.05.27
Properties / Message  (0) 2020.05.27
RequestScope  (0) 2020.05.26
Redirect와 Forward  (0) 2020.05.26
Form 커스텀 태그  (0) 2020.05.25