ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring MVC(RedirectAttribute)
    웹개발/Spring 2020. 7. 30. 19:31

    이 내용은 인프런의 스프링 웹 MVC강좌를 참고하여 만들었습니다.

     

    이전에 폼 서블릿 오류로 인하여 post방식으로 받은 것을 다시 get 매핑으로 redirect 하여 처리하는 것에 대하여 공부를 하였다.

     

    이번에는 redirect를 할 때 값을 전달하는 몇 가지 방법에 대하여 살펴본다.

     

    1, model을 이용하는 방법

    - 기본적으로 스프링 부트에서는 지원을 하지 않는다.(WebMvcProperties에서 ignoreDefaultModelOnRedirect값이 true 이기 때문)

    - 설정을 바꾸기 위해서는 application.properties에 다음과 같은 구문을 추가

    spring.mvc.ignore-default-model-on-redirect=false

     

    2, 파라미터로 RedirectAttributes를 사용하면 넘기기 원하는 파라미터를 넘길 수 있다.

    - URI에 파라미터가 노출이 될 수 있는 단점을 가지고 있음

     

    -redirect요청을 처리하는 곳에서 쿼리 매개변수를 @RequestParam 혹은 @ModelAttribute로 받을 수 있다.

     

    - model.getAttribute()를 하게 되면 위에 @SessionAttributes어노테이션의 인지와 이름이 같으면 자동적으로 세션이 생성이 된다.

     

    @Controller
    @SessionAttributes("event")
    public class EventController {
    
        @GetMapping("/events/form/name")
        public String eventsForm(Model model){
            model.addAttribute("event",new Event());
            return "events/form-name";
    
        }
        @PostMapping("/events/form/name")
        public String getEvent(@Valid @ModelAttribute Event event, BindingResult bindingResult, Model model) {
            if(bindingResult.hasErrors()){
                return "events/form-name";
            }
            return "redirect:/events/form/limit";
        }
    
        @GetMapping("/events/form/limit")
        public String eventsForm2(@ModelAttribute Event event, Model model){
            model.addAttribute("event",event);
            return "events/form-limit";
    
        }
        @PostMapping("/events/form/limit")
        public String getEvent2(@Valid @ModelAttribute Event event,
                                BindingResult bindingResult,
                                Model model,
                                RedirectAttributes attributes) {
            if(bindingResult.hasErrors()){
                return "events/form-limit";
            }
    
            attributes.addAttribute("name",event.getName());
            attributes.addAttribute("limit",event.getLimit());
            return "redirect:/events/list";
        }
    
        @GetMapping("/events/list")
        public String getEvents(
                @ModelAttribute("newEvent") Event event,
                Model model){
    
            Event event1 = new Event();
            event1.setName(event.getName());
            event1.setLimit(event.getLimit());
    
            Event event2 = new Event();
            event2.setName("test");
            event2.setLimit(10);
    
    
            List<Event> eventList = new ArrayList<>();
            eventList.add(event2);
            eventList.add(event1);
            model.addAttribute(eventList);
    
            return "events/list";
        }
    }

     

    3, RedirectAttributes변수에서 addFlashAttribute를 사용해서도 인자 전달이 가능하다.

     

    - 데이터가 URI에 노출이 되지 않는다.

     

    - 임의의 객체를 저장할 수 있고 http 세션을 사용하기 때문에 redirect요청을 처리하게 되면 그 즉시 제거를 한다.

     

    -@ModelAttribute를 사용 시 인자를 name명과 맞춰 주워야 찾아서 매핑이 가능하다.

    @Controller
    @SessionAttributes("event")
    public class EventController {
    
        @GetMapping("/events/form/name")
        public String eventsForm(Model model){
            model.addAttribute("event",new Event());
            return "events/form-name";
    
        }
        @PostMapping("/events/form/name")
        public String getEvent(@Valid @ModelAttribute Event event, BindingResult bindingResult, Model model) {
            if(bindingResult.hasErrors()){
                return "events/form-name";
            }
            return "redirect:/events/form/limit";
        }
    
        @GetMapping("/events/form/limit")
        public String eventsForm2(@ModelAttribute Event event, Model model){
            model.addAttribute("event",event);
            return "events/form-limit";
    
        }
        @PostMapping("/events/form/limit")
        public String getEvent2(@Valid @ModelAttribute Event event,
                                BindingResult bindingResult,
                                Model model,
                                RedirectAttributes attributes) {
            if(bindingResult.hasErrors()){
                return "events/form-limit";
            }
    
            attributes.addFlashAttribute("newEvent",event);
    
            return "redirect:/events/list";
        }
    
        @GetMapping("/events/list")
        public String getEvents(
                @ModelAttribute("newEvent") Event event,
                Model model){
    
            Event event1 = new Event();
            event1.setName(event.getName());
            event1.setLimit(event.getLimit());
    
            Event event2 = new Event();
            event2.setName("test");
            event2.setLimit(10);
    
    
            List<Event> eventList = new ArrayList<>();
            eventList.add(event2);
            eventList.add(event1);
            model.addAttribute(eventList);
    
            return "events/list";
        }
    }
Designed by Tistory.