핸들러 메소드의 매개변수중 하나인 RedirectAttributes, FlashAttributes에 대해 알아보도록 하겠습니다.
1. RedirectAttributes
1.1 RedirectAttributes 란 ?
Handler에서 요청을 처리한 뒤 redirect를 하는 경우가 있습니다. 예를 들면 중복 서브밋을 방지하기 위해 postHandler의 경우 getHandler로 redirect를 하는등의 경우가 있습니다. 이때 어떤 데이터를 같이 전달하고 싶은 경우 데이터를 전달하는 방법은 session, requestParameter
등이 있습니다.
하지만 session
의 경우에는 한 클라이언트(브라우저)가 종료하기 전까지 유지해야하는 데이터(로그인 여부, 장바구니 등)
를 담아야 하기 때문에, redirect를 할 때에 session에 데이터를 담는것은 올바르지 않을 수 있습니다.
x"/test") (
public String getRedirect(Model model){
model.addAttribute("name", "jjy");
model.addAttribute("age", 10);
return "redirect:/redirect";
}
// 자동으로 다음과 같이 요청이 됨 -> /redirect?name=jjy&age=10
이런 경우 때문에 SpringMVC에서는 위와 같이 model에 data를 담고 Redirect를 하는 경우, Primitive Type(기본자료형)
에 한해서 자동으로 url의 Parameter로 추가해서 데이터를 넘겨 주었습니다.
SpringBoot의 경우에는 이 기능이 off가 되어있습니다. RedirectAttributes
매개변수를 핸들러에 추가하여 원하는 데이터만을 선택적으로 Redirect시 전달할 수 있습니다.
1.2 RedirectAttributes 예제
public class SampleController {
"/get") (
public String get(RedirectAttributes redirectAttributes){
redirectAttributes.addAttribute("name", "jjy");
redirectAttributes.addAttribute("age", 10);
return "redirect:/redirect";
}
"/redirect") (
public String redirect( String name, int age){
System.out.println(name + " " + age);
return "ok";
}
}
사용방법은 간단합니다. redirect시 primitive Type
의 데이터를 parameter로 전달하고자 하는 handler에 매개변수로 RedirectAttributes
를 추가하고 addAttribute() 메소드를 이용해 data를 추가하면 끝입니다. 간단히 설명드리면, /get
에 맵핑된 handler는 요청을 받으면 model에 name, age
를 추가하여 /redirect
로 리다이렉션합니다. /redirect
에 맵핑된 handler는 요청을 받으면, 요청 url로 부터 parameter를 가져와 출력을 합니다.
어플리케이션을 시작하고 /get
으로 요청합니다.
/redirect
로 리다이렉션되면서 앞서 RedirectAttributes에 추가했던 데이터가 parameter로 자동으로 전달되는 것을 볼 수 있습니다.
1.3 ignoreDefaultModelOnRedirect 설정
앞서서 SpringBoot의 경우에는 Model에 담긴 Primitive Type의 데이터
가 redirect시 자동으로 Parameter에 추가되는 기능이 off 되어있다고 말씀드렸습니다. 이것을 다시 활성화 시켜 자동으로 데이터가 parameter로 전달되는지 테스트를 해보겠습니다.
application.properties
에 다음과 같이 설정을 합니다.
xxxxxxxxxx
public class SampleController {
"/get") (
public String get(Model model){
model.addAttribute("name", "jjy");
model.addAttribute("age", 10);
return "redirect:/redirect";
}
"/redirect") (
public String redirect( String name, int age){
System.out.println(name + " " + age);
return "ok";
}
}
RedirectAttributes
에 데이터를 등록할 필요가 없으므로 해당 로직이 제거된 것을 제외하면 1.2
에서 작성했던 handler와 거의 동일합니다.
어플리케이션을 실행한 뒤 /get
으로 요청을 보냅니다.
/redirect
로 리다이렉션되며 자동으로 parameter들이 추가된것을 볼 수 있습니다.
2. FlashAttributes
2.1 FlahsAttributes란?
redirect시 Primitive Type
이 아닌 Object를 전달하고 싶은 경우도 있을 것입니다. 이때 사용할 수 있는 것이 바로 FlashAttributes
입니다. FlashAttributes
는 RedirectAttributes
와 마찬가지로 Session에 데이터를 담는것이 올바르지 않을때 사용할 수 있습니다만, 사실 FlashAttributes
도 Session을 이용해서 데이터를 전달합니다.
조금 자세히 설명드리자면, Redirect시 Parameter로 데이터를 전달하는 것은 문자열로 데이터가 넘어가기 때문에, Object를 전달하는데 어려움이 있습니다. 이 때문에 FlashAttributes
를 사용합니다. 또 FlashAttributes는 Session을 이용하여 데이터를 전달하는데요, 이때 넘겨받은 핸들러에서만 사용이 가능하고, 넘겨받은 핸들러가 종료될때 Session에서 FlashAttributes에 저장된 데이터들은 삭제가 됩니다.
2.2 FlashAttributes 예제
xxxxxxxxxx
public class SampleController {
"/get") (
public String get(RedirectAttributes redirectAttributes){
Event event = new Event();
event.setName("jjy");
event.setAge(10);
redirectAttributes.addFlashAttribute("event", event);
return "redirect:/redirect";
}
"/redirect") (
public String redirect( Event event){
System.out.println(event.toString());
return "ok";
}
}
FlashAttributes
를 추가하는 방법은 RedirectAttributes
의 메소드를 사용하여 추가를 할 수 있습니다. /get
에 맵핑된 handler에서는 요청을 받게되면 Event 객체를 생성하여 FlashAttributes
에 담아 /redirect
로 리다이렉션 합니다.
/redirect
에서는 요청을 받게되면 event객체를 매개변수로 받아 콘솔에 출력합니다. flashAttributes에 담긴 객체는 @ModelAttribute를 이용하여 가져올수도 있으며, 자동으로 Model에 등록되기 때문에 model 객체를 asMap()을 이용해 Map으로 변환하여 key값을 통해 가져올 수도 있습니다.
어플리케이션을 실행한 뒤 /get
으로 요청합니다. Object형태로 데이터를 가져온 것을 볼 수 있습니다.
FlashAttributes에 담긴 데이터는 요청을 처리하게 되면 삭제된다고 말씀드렸습니다. 새로고침을 연타해봅니다. 그림과 같이 한번의 요청 처리 후 데이터가 제가 되었기 때문에 null이 출력되는 것을 볼 수 있습니다.
'FrameWork > Spring MVC' 카테고리의 다른 글
SpringMVC - 핸들러 메소드 - 8 (파일 다운로드 기능 구현, 리턴타입 : ResponseEntity) (0) | 2019.06.04 |
---|---|
SpringMVC - 핸들러 메소드 - 7 (파일업로드 매개변수 : MultipartFile) (0) | 2019.05.29 |
SpringMVC - 핸들러 메소드 - 5 (session 관련 argument @SessionAttributes(s), @SessionAttribute, SessionStatus) (0) | 2019.05.27 |
SpringMVC - 중복 서브밋 처리(새로고침시 POST 재요청 방지 : PRG 패턴) (0) | 2019.05.23 |
SpringMVC - 핸들러 메소드 - 3 (사용자 요청 데이터 Error 상황처리) (0) | 2019.05.23 |