ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC - requestScope
    Spring/Spring MVC 2021. 12. 27. 22:29
    반응형

    request - 브라우저의 요청

    • 브라우저에 의해 새로운 요청이 발생하면 브라우저는 서버에 요청에 관련된 정보를 전송하게 된다.
    • 이를 받는 서버는 브라우저가 보낸 요청 정보들을 보관하기 위해 HttpServletRequest 객체를 생성해
      요청 정보들을 담아 두게 된다.
    • 요청 정보가 담겨 있는 HttpServletRequest 객체는 응답 결과가 브라우저로 전송될 때까지 유지되며
      사용이 가능함 (즉, forward 가 진행되면 HttpServletRequest 객체 유지)

    requestScope - request와 관련된 데이터들의 생존 범위

    • 새로운 요청이 발생해 응답결과가 브라우저로 전달될 때까지 요청 정보가 담겨 있는 request 객체를
      사용 가능
    • 이러한 사용 범위는 requestScope라고 부른다.
    • HttpServletRequest 객체에는 서버 개발자가 필요해 의해 데이터나 객체를 저장할 수 있고
      requestScope 내에서 사용 가능하다.

     


     

    RequestScope에 사용되는 객체

    • HttpSevletRequest
    • Model
    • ModelAndView
    • @ModelAttribute

     

    HttpServletRequest 

     

    •  클라이언트로부터 요청이 들어오면 서버는 요청 마다 HttpServletRequest를 생성해 준다.
    •  서버로부터 요청이 들어오면 생기는 객체
    • 클라이언트로 응답결과가 전송될 때까지 유지되고, 전송되면 소멸
    • 같은 URL로 새 요청이 들어오면 새로운 HttpServletRequest를 생성한다.
             - forward를 해주면 HttpServletRequest는 데이터가 유지된다.
             - redirect를 해주면 새로운 요청으로 HttpServletRequest 객체를 생성

     

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

     

     redirect:/result1으로 인해 /result1 요청이 들어오면 새로운 HttpServletRequest 객체를 생성하므로 저장된 data1을 가져올 수 없다.


     

    Model 객체 이용

     Model에 데이터를 저장하면 해당 데이터는 자동으로 HttpServletReqeust에 저장이 된다. 주의할 점이 있다. Model은 데이터를 저장하는 용도지 서버단에서 이동은 안 한다. 다시 말하면 forward로 메서드 호출시 파라미터로 Model 객체를 주입받으면 새로운 Model 객체가 주입된다고 보면 된다.

     

    @Controller
    public class testController {
    
    	@GetMapping("/test2")
    	public String test2(Model model) {
    		
    		model.addAttribute("data2", "문자열2");
    		
    		return "forward:/result2";
    	}
        
    	@GetMapping("/result2")
    	public String result2(HttpServletRequest request) {
    		
    		String data2 = (String)request.getAttribute("data2");
    		
    		return "result2";
    	}
    	
    }
    public String test2(Model model) {
     - Model 객체를 주입 받음

    public String result2(HttpServletRequest request) {
     - 새로운 Model 객체가 주입되므로 해당 Model 객체에는 data2가 존재 x
     - Model에 저장된 데이터는 HttpServletRequest에 저장되므로 HttpServletRequest를 이용하면 된다.
     - Model은 request 영역에 저장된 데이터를 사용하는 게 아닌 저장하기 위한 도구로 생각하자.

     


     

    ModelAndView

     

     Model의 기능과 같다. 다른 점은 View 페이지 정보를 설정할 수 있다.

     

    @Controller
    public class testController {
    
    	@GetMapping("/test3")
    	public ModelAndView test3(ModelAndView mv) {
    		
    		mv.addObject("data3", "문자열3");
    		mv.setViewName("forward:/result3");
    		
    		return mv;
    	}
    	
    	@GetMapping("/result3")
    	public String result3(HttpServletRequest request) {
    		String data3 = (String)request.getAttribute("data3");
    		System.out.println(data3);
    		return "result3";
    	}
    }
    public ModelAndView test3(ModelAndView mv) {
     - ModelAndView 객체를 주입 받음

    mv.setViewName("forward:/result3");
     - View 페이지 설정

     

    @ModelAttribute으로 객체 주입

     

     @ModelAttribute를 이용하여 객체를 주입받는다.

     

    @Controller
    public class testController {
    
    	@GetMapping("/test5")
    	public String test5(@ModelAttribute("bean1") DataBean1 bean1) {
    
    		bean1.setData1("문자열6");
    		bean1.setData2("문자열7");
    		
    		return "forward:/result5";
    	}
    	@GetMapping("/result5")
    //	새로운 bean1 객체를 주입하는거므로 데이터가 전달이 안된다
    //	public String result5(@ModelAttribute("bean1") DataBean1 bean1) {
    //	따라서 주입된 bean1객체를 받고 싶으면 request를 이용하자
    	public String result5(HttpServletRequest request) {
    		DataBean1 bean1 = (DataBean1)request.getAttribute("bean1");
    		System.out.println(bean1.getData1());
    		System.out.println(bean1.getData2());
    		
    		return "result5";
    	}
    }
    public String test5(@ModelAttribute("bean1") DataBean1 bean1) {
     - bean1이라는 이름으로 DaTaBean1 주입

    public String result5(HttpServletRequest request) {
     - Model과 마찬가지로 @ModelAttribute("bean1") DataBean1 bean1을 쓰면 저장된
      bean1 객체를 가져오는게 아닌 새로운 DataBean1을 주입한다.
     - 따라서 HttpServletRequest로 데이터를 가져와야 한다.

     

    반응형

    댓글

Designed by Tistory.