ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 핸들러 메소드 12부 - FlashAttributes
    SPRING/스프링 MVC 2021. 7. 9. 01:09

    주로 리다이렉트시에 데이터를 전달할 때 사용한다.

    • 데이터가 URI에 노출되지 않는다.
    • 임의의 객체를 저장할 수 있다.
    • 보통 HTTP 세션을 사용한다.

    리다이렉트 하기 전에 데이터를 HTTP 세션에 저장하고 리다이렉트 요청을 처리 한 다음 그 즉시 제거한다. RedirectAttributes를 통해 사용할 수 있다.

     

    @Controller
    @SessionAttributes("event")
    public class SampleController2 {
    
        // 이름 Form 화면
        @GetMapping("/events/form/name")
        public String eventsForm(Model model, HttpSession httpSession) {
    
            model.addAttribute("event",new Event());
            return "/events/form-name";
        }
    
    
        // 이름 form에서 입력받은 내용 전송
        @PostMapping("/events/form/name")
        public String eventForNameSubmit(@ModelAttribute @Validated(Event.ValidateName.class) Event event,
                              BindingResult bindingResult, Model model,
                              SessionStatus sessionStatus) {
    
            // @Validated 어노테이션을 통하여 Validation 체크에 맞지 않으면 다시 form으로 리턴
            if(bindingResult.hasErrors()) {
                return "/events/form-name";
            }
    
            // POST-REDIRECT-GET 패턴
            // ( Post 이후에 브라우저를 리프래시 하더라도 폼 서브밋이 발생하지 않도록 하는 패턴)
            return "redirect:/events/form/limit";
        }
    
        // limit Form 화면
        @GetMapping("/events/form/limit")
        public String eventForLimit(@ModelAttribute Event event, Model model) {
    
            model.addAttribute("event",event);
            return "events/form-limit";
        }
    
        // limit form에서 입력받은 내용 전송
        @PostMapping("/events/form/limit")
        public String eventForLimitSubmit(@ModelAttribute @Validated(Event.ValidateLimit.class)
                                          Event event, BindingResult bindingResult,
                                          RedirectAttributes attributes, SessionStatus sessionStatus) {
    
            if(bindingResult.hasErrors()) {
                return "/events/form-limit";
            }
            // 세션 데이터 초기화
            sessionStatus.setComplete();
    
            attributes.addFlashAttribute("newEvent",event);
            return "redirect:/events/list";
        }
    
        // 이벤트 목록 페이지
        @GetMapping("/events/list")
        public String getEvents(@ModelAttribute("newEvent") Event newEvent,
                                Model model, @SessionAttribute LocalDateTime visitTime) {
    
            System.out.println(visitTime);
            // 리스트를 불러오는 부분
            Event event = new Event();
            event.setName("spring");
            event.setLimit(10);
    
            List<Event> eventList = new ArrayList<>();
            eventList.add(event);
            eventList.add(newEvent);
            model.addAttribute(eventList);
            return "/events/list";
        }
        
    }

    RedirectAttributes : redirect 시 URI 쿼리 파라미터에 데이터를 붙여 전송하기 때문에 String 타입으로 변환가능한 데이터만 전달할 수 있다. 

    FlashAttributes : 객체를 세션에 넣어서 전송할 수 있다. 

    데이터를 받는 쪽에서는 @ModelAttributes나 @Model을 이용하여 데이터를 전달 받을 수 있다. 

     

    1. @ModelAttribute

    // 이벤트 목록 페이지
        @GetMapping("/events/list")
        public String getEvents(@ModelAttribute("newEvent") Event newEvent,
                                Model model, @SessionAttribute LocalDateTime visitTime) {
    
            System.out.println(visitTime);
            // 리스트를 불러오는 부분
            Event event = new Event();
            event.setName("spring");
            event.setLimit(10);
    
            List<Event> eventList = new ArrayList<>();
            eventList.add(event);
            eventList.add(newEvent);
            model.addAttribute(eventList);
            return "/events/list";
        }

    2. @Model

    - model.asMap().get("newEvent"); 사용

     // 이벤트 목록 페이지
        @GetMapping("/events/list")
        public String getEvents(
                                Model model, @SessionAttribute LocalDateTime visitTime) {
    
            System.out.println(visitTime);
            // 리스트를 불러오는 부분
            Event event = new Event();
            event.setName("spring");
            event.setLimit(10);
    
            Event newEvent = (Event) model.asMap().get("newEvent");
    
            List<Event> eventList = new ArrayList<>();
            eventList.add(event);
            eventList.add(newEvent);
            model.addAttribute(eventList);
            return "/events/list";
        }

     

Designed by Tistory.