-
Spring MVC - requestScopeSpring/Spring MVC 2021. 12. 27. 22:29728x90반응형
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로 데이터를 가져와야 한다.728x90반응형'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC - Session (0) 2021.12.29 spring MVC - requestScope 빈 주입 (0) 2021.12.27 Spring MVC - Redirect와 Forward (0) 2021.12.27 Spring MVC - form 요소 - select, option, options, checkbox, checkboxs, radiobutton, radiobuttons (0) 2021.12.27 Spring MVC - form 속성 - form, button, hidden, input, textarea (0) 2021.12.27