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(백기선)
Author And Source
이 문제에 관하여(MVC 활용(16) : 핸들러 메소드 8부 - @SessionAttributes), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jsj3282/스프링-MVC-활용16-핸들러-메소드-8부-SessionAttributes저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)