본문 바로가기
Spring/Spring MVC 5

RequestScope

by 코동이 2020. 5. 26.

- 새로운 요청이 발생해 응답결과가 브라우저로 전달 될 때까지 요청 정보가 담겨 있는 Request 객체를 사용할 수 있다.

- HttpServletRequest 객체에는 서버 개발자가 필요에 의해 데이터나 객체를 저장할 수 있고,

RequestScope 내에서 사용이 가능하다.

 

redirect : request 객체 소멸

forward : request 객체 유지

 

 

HttpServletRequest

Model

@ModelAttribute

 

 

1. redirect

@Controller
public class TestController {
	@GetMapping("/test1")
	public String test1(HttpServletRequest request) {
		request.setAttribute("data1","문자열1");
		return "redirect:/result1";
	}
	
	@GetMapping("/result1")
	public String result1(HttpServletRequest request) {
		String data1 = (String) request.getAttribute("data1");
				
		return "result1";
	}
}

redirect 요청을 하게 되면, test1에 대한 Request 객체는 소멸되며 브라우저는 다시 result1을 요청한다.

그러면 result1에 맞는 새로운 Request객체가 생성된다.

 

따라서 tes1에서 data1에 문자열1을 저장했지만, result1에서는 값을 인식하지 못하고 data1에 null이 저장된다.

 

2. forward

@Controller
public class TestController {
	@GetMapping("/test1")
	public String test1(HttpServletRequest request) {
		request.setAttribute("data1","문자열1");
		return "forward:/result1";
	}
	
	@GetMapping("/result1")
	public String result1(HttpServletRequest request) {
		String data1 = (String) request.getAttribute("data1");
				
		return "result1";
	}
}

forward는 브라우저가 아닌 서버에서 주소이동하므로 ,

HttpServletRequest가 유지되기 때문에 data1에 문자열1이 담긴다.

 

@GetMapping("/test2")
	public String test2(Model model) {
		model.addAttribute("data2","문자열2");
		return "forward:/result2";
	}
	
	@GetMapping("/result2")
	//public String result2(Model model) {
    public String result2(HttpServletRequest request) {
		String data2 = (String)request.getAttribute("data2");
		System.out.println("data2 : "+data2);
		return "result2";
	}

Model 객체에 addAttribute를 하고 forward를 하면 "Request" 객체에 내용이 담기게 된다.

result2에서는 파라미터로 model을 쓰면, 새로운 model을 주입받는 의미가 되므로 data2가 null을 출력한다.

 

Model 객체를 파라미터로 주입받으면 기존의 model 객체를 사용하지 못하고 새로운 model 객체가 주입된다.

따라서 result2에 Model 객체를 쓴다면 model이 초기화되서 data2=null이다.

따라서, result2의 파라미터에는 request 객체를 받아야 test2에 설정한 data2의 값을 사용할 수 있다.

 

 

 

 

@GetMapping("/test3")
	public String test3(@ModelAttribute DataBean bean1) {
		bean1.setData1("data1");
		bean1.setData2("data2");
		
		return "forward:/result3";
	}
	
	@GetMapping("/result3")
	public String result3(HttpServletRequest request) {
		DataBean bean1 = (DataBean) request.getAttribute("dataBean");
		System.out.println(bean1.getData1());
		System.out.println(bean1.getData2());
		
		return "result3";
	}

@ModelAttribute를 사용할 수도 있다.  DataBean 클래스의 bean1참조변수를 이름으로 bean1에 대해 setData를 한다. 그러면 request객체에 저장이 되기 때문에, forward를 할 때, HttpServletReuqest request 객체에 담아주어야 한다. 이 때getAttribute("dataBean")은 클래스 이름의 맨 앞 대문자를 소문자로 바꾼 것이다. 

 

test3(@ModelAttribute("bean1") DataBean bean1)으로 만들었다면,

request.getAttribute("bean1")으로 확인하는 것이 가능하다.

 

 

@GetMapping("/test4")
	public String test4(Model model) {
		DataBean bean1 = new DataBean();
		bean1.setData1("data1");
		bean1.setData2("data2");
		model.addAttribute("bean1", bean1);
		return "forward:/result4";
	}
	
	@GetMapping("/result4")
	public String result4(HttpServletRequest request) {
		DataBean bean1 = (DataBean) request.getAttribute("bean1");
		System.out.println(bean1.getData1());
		System.out.println(bean1.getData2());
		
		return "result4";
	}

Model객체를 사용할 경우, 마찬가지로 forward할 때 request에 저장되기 때문에 파라미터로 request를 받는다. model.addAttribute에서 bean1이라는 이름으로 저장했으므로 getAttribute할 때도 bean1으로 꺼내 쓸 수 있다.

 

어떤 방식을 가장 많이 사용할까?

반응형

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

Properties / Message  (0) 2020.05.27
RequestScope 빈 주입  (0) 2020.05.26
Redirect와 Forward  (0) 2020.05.26
Form 커스텀 태그  (0) 2020.05.25
커맨드 객체  (0) 2020.05.25