작성
·
173
0
강사님 안녕하세요.
16강 질문 있습니다.
delete 이후에 alert 메세지를 띄우기 위해서 RedirectAttributes rttr을 파라미터로 하나 선언하고
rttr.addFlashAttribute("msg", "삭제되었습니다.") 이후에 view에서 {{msg}} 받도록 되어 있는데
그냥 Model model 을 파라미터로 두고
model.addAttribute("msg", "삭제되었습니다.")
view {{msg}}
이렇게 받으면 안되나요 ? 어차피 view에서는 전달받은 객체의 변수를 가져만 오는 거고 addFlashAttribute setAttribute가 클래스 내부적으로는 map 으로 구성되어 있겠지만 둘 다 string으로 되어 있으니 다른 점 있을까 싶어서요.
그리고 예전 스프링에서 보면 view에 해당하는 jsp 파일들은 실제로 서블릿으로 동작하고, requestDispatcher -> forward를 통해 넘겨진 request, response 객체들이 동작되어서 jsp 페이지에서 변수처리가 가능한데 이것도 같은 동작방식이라 이해하면 될까요 ?
그렇다면 예를 들어
public String delete(RedirectsAttribute rtts, Model model){
rtts.addFlashAttribute("msg", "삭제되었습니다.");
model.addAttribute("msg", "삭제되었습니다(모델)");
return "test";
}
하였을 때 test 뷰에서 {{msg}} 이렇게 받으면 결과가 어떻게 나오나요 ?
이 때의 동작방식은 어떻게 되는지 설명 부탁드립니다.
감사합니다.
답변 1
0
리다이렉트 시,
모델 객체에 등록된 값은 사라지게 됩니다.
이는 HTTP의 Stateless 특성 때문인데요
이로 인해,
model.addAttribute()로 등록된 값을
리다이렉트된 페이지에서 사용할 수 없습니다.
예시로 든 "test.mustache" 페이지에서는
리다이렉트 방식이 아니므로
모델에 등록된 값 "삭제되었습니다.(모델)"이 보여지게 됩니다.
(리다이렉트가 아닌
forward로 호출된 경우엔
model의 값을 그대로 사용할 수 있습니다.)
PS.
삭제 후, 리다이렉트하는 것이
포워딩하는 것 보다 일반적인 방식(선호방식)입니다.
질문과 함께 예시로 든 코드를
직접 수행해보세요.