@RequestBody는 http 요청의 body 부분으로 JSON 형태의 데이터를 받을 때 Java 객체로 매핑할 수 있게해주는 어노테이션이다.
@SessionAttributes를 사용하면 @ModelAttribute또는 model.addAttribute()를 사용해서 객체를 저장할 경우 세션에 저장이 되도록 지정할 수 있습니다. 이 경우는 세션이 파괴되거나 SessionStatus 객체를 사용해서 명시적으로 지울때까지 동일한 세션에서는 계속 사용할 수 있습니다.
어떤 경우에 session scope에 객체를 저장해두고 쓰면 좋을까요? 가장 먼저 떠오르는게 등록폼에서 입력해야할 정보가 아주 많을 경우 페이지를 나눠서 작성하는 경우가 되겠습니다. 입력한 정보가 세션에 저장되어 있으면 이전/다음 으로 등록폼들 사이를 왔다갔다 하면서 작성하는 것도 가능합니다.
@SessionAttributes를 사용할 때 주의할 점이 있는데, 사용후에는 SessionStatus객체의 setComplete() 메소드를 사용해서 해제해 주어야 하는 것입니다. 그렇지 않으면 세션에 계속 남아 있게 됩니다.
이 해제와 관련해서 생각해 봐야 할 문제가 있는데, 작업시 성공하면 세션에서 제거하게되는데, 사용자가 중도에 다른 메뉴를 클릭해서 빠져 나가게 되면 세션에 저장된 객체가 그대로 남게 됩니다. 세션에 제거되지 않고 남아있는 객체들로 문제가 되지 않을지 생각을 해봐야 할 것 갈습니다.
// 세션에 order 객체 저장
@SessionAttributes("order")
// 비어있는 order 객체 생성
// 이 행위를 안할시 processDesign에서 생성 및 추가 해줘야함 -> 이전으로 돌아왔을 때 초기화가 됨
// model.addAttribute("order", new Order());
@ModelAttribute(name = "order")
public Order order() {
return new Order();
}
@PostMapping()
public String processDesign(@Valid Taco design, Errors errors, @ModelAttribute Order order) {
if(errors.hasErrors()) {
return "design";
}
log.info("Processing design : " + design);
Taco savedTaco = tacoService.saveTaco(design);
order.addDesign(savedTaco);
log.info("Current Order : " + order);
return "redirect:/orders/current"; // 상대경로로 재접속
}
2021-12-09 23:54:13.697 INFO 18712 --- [nio-7777-exec-8] c.e.t.controller.DesignTacoController : Current Order : Order(id=null, deliveryName=null, deliveryStreet=null, deliveryCity=null, deliveryState=null, deliveryZip=null, ccNumber=null, ccExpiration=null, ccCVV=null, placedAt=null, tacos=[Taco(id=1, name=타코의이름은뭘까, ingredients=[Ingredient(id=FLTO, name=Flour Tortilla, type=WRAP), Ingredient(id=COTO, name=Corn Tortilla, type=WRAP)], createdAt=Thu Dec 09 23:54:13 KST 2021)])
2021-12-09 23:54:13.705 INFO 18712 --- [nio-7777-exec-9] c.e.t.controller.OrderController : Order(id=null, deliveryName=null, deliveryStreet=null, deliveryCity=null, deliveryState=null, deliveryZip=null, ccNumber=null, ccExpiration=null, ccCVV=null, placedAt=null, tacos=[Taco(id=1, name=타코의이름은뭘까, ingredients=[Ingredient(id=FLTO, name=Flour Tortilla, type=WRAP), Ingredient(id=COTO, name=Corn Tortilla, type=WRAP)], createdAt=Thu Dec 09 23:54:13 KST 2021)])