MVC 활용(16) : 핸들러 메소드 8부 - @SessionAttributes

16. 핸들러 메소드 8부 - @SessionAttributes

모델 정보를 HTTP 세션에 저장해주는 애노테이션

  • HttpSession을 직접 사용할 수도 있지만
  • 이 애노테이션에 설정한 이름에 해당하는 모델 정보를 자동으로 세션에 넣어준다.
  • @ModelAttribute는 세션에 있는 데이터도 바인딩한다.
  • 여러 화면(또는 요청)에서 사용해야 하는 객체를 공유할 때 사용한다.

SessionStatus를 사용해서 세션 처리 완료를 알려줄 수 있다.

  • 폼 처리 끝나고 세션을 비울 때 사용한다.

HttpSession을 직접 사용

@Controller
public class SampleController {

    @GetMapping("/events/form")
    public String eventsForm(Model model, HttpSession httpSession) {
        Event newEvent = new Event();
        newEvent.setLimit(50);
        model.addAttribute("event", newEvent);
        httpSession.setAttribute("event", newEvent);
        return "events/form";
    }

    @PostMapping("/events")
    public String createEvent(@ModelAttribute @Valid Event event, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "/events/form";
        }
		// 데이터베이스에서 save 했다고 가정
        return "redirect:/events/list";
    }
    
    @GetMapping("/events/list")
    public String getEvents(Model model){    
        Event event = new Event();
        event.setName("spring");
        event.setLimit(10);
        // 데이터베이스에서 읽어왔다고 가정한다.
        List<Event> eventList = new ArrayList<>();
        eventList.add(event);
        model.addAttribute("eventList", eventList);
        return "/events/list";
    }
}
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;
    
    @Test
    public void eventForm() throws Exception{
        MockHttpServletRequest request = mockMvc.perform(get("/events/form"))
                .andDo(print())
                .andExpect(view().name("/events/form"))
                .andExpect(model().attributeExists("event"))
                .andExpect(request().sessionAttribute("event", notNullValue()))
                .andReturn().getRequest();
        Object event = request.getSession().getAttribute("event");
        System.out.println(event);
    }
    
	
    @Test
    public void createEvent() throws Exception{
        ResultActions result = mockMvc.perform(post("/events")
                .param("name", "spring)
                .param("limit", "-10"))
                .andDo(print())
                .andExpect(status().isOk())
                .andExpect(model().hasErrors());
        ModelAndView mav = result.andReturn().getModelAndView();
        Map<String, Object> model = mav.getModel();
        System.out.println(model.size());
    }
}

@SessionAttributes 사용

@Controller
@SessionAttributes("event")
public class SampleController {

    @GetMapping("/events/form")
    public String eventsForm(Model model) {
        Event newEvent = new Event();
        newEvent.setLimit(50);
        model.addAttribute("event", newEvent);
        // 자동으로 세션에 넣어줌
        return "events/form";
    }

    @PostMapping("/events")
    public String createEvent(@ModelAttribute @Valid Event event, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "/events/form";
        }
		// 데이터베이스에서 save 했다고 가정
        return "redirect:/events/list";
    }
    
    @GetMapping("/events/list")
    public String getEvents(Model model){    
        Event event = new Event();
        event.setName("spring");
        event.setLimit(10);
        // 데이터베이스에서 읽어왔다고 가정한다.
        List<Event> eventList = new ArrayList<>();
        eventList.add(event);
        model.addAttribute("eventList", eventList);
        return "/events/list";
    }
}
@RunWith(SpringRunner.class)
@WebMvcTest
public class SampleControllerTest {

    @Autowired
    MockMvc mockMvc;
    
    @Test
    public void eventForm() throws Exception{
        MockHttpServletRequest request = mockMvc.perform(get("/events/form"))
                .andDo(print())
                .andExpect(view().name("/events/form"))
                .andExpect(model().attributeExists("event"))
                .andExpect(request().sessionAttribute("event", notNullValue()))
                .andReturn().getRequest();
        Object event = request.getSession().getAttribute("event");
        System.out.println(event);
    }
}

@SessionAttributes + SessionStatus

@Controller
@SessionAttributes("event")
public class SampleController {

    @GetMapping("/events/form")
    public String eventsForm(Model model) {
        Event newEvent = new Event();
        newEvent.setLimit(50);
        model.addAttribute("event", newEvent);
        // 자동으로 세션에 넣어줌
        return "events/form";
    }

    @PostMapping("/events")
    public String createEvent(@ModelAttribute @Valid Event event, BindingResult bindingResult, SessionStatus sessionStatus){
        if(bindingResult.hasErrors()){
            return "/events/form";
        }
        // 데이터베이스에서 save 했다고 가정
        sessionStatus.setComplete();
        return "redirect:/events/list";
    }
    
    @GetMapping("/events/list")
    public String getEvents(Model model){    
        Event event = new Event();
        event.setName("spring");
        event.setLimit(10);
        // 데이터베이스에서 읽어왔다고 가정한다.
        List<Event> eventList = new ArrayList<>();
        eventList.add(event);
        model.addAttribute("eventList", eventList);
        return "/events/list";
    }
}

참고

  • 인프런 : 스프링 웹 MVC(백기선)

좋은 웹페이지 즐겨찾기