리다이렉트란?
폼 형식의 문서를 작성하고 확인 버튼을 누르면, 해당 내용이 POST 방식으로 서버로 보내진다.
그 후, 다른 페이지로 GET방식을 통해 리다이렉트하게 된다.
이때, 리다이렉트가 발생한다는 것은, 원래 요청은 종료되고, 새로운 GET 요청이 시작된다는 것이다.
그렇기 때문에, 원래 요청에서 가지고 있던 모델 데이터는, 당연히 새로운 요청에서는 소멸되게 된다.
그래서, POST/Redirect/GET 방식을 사용하는 리다이렉트는, 데이터를 전달하기에 부적합하게 된다.
다시 말해 Model을 전달하는 것은 의미가 없어진다.
이 점을 해결해주기 위해 스프링에서 제공하는 것이, RedirectAttributes 클래스이다.
이 클래스는, addFlashAttribute() 메서드를 통해 리다이렉트가 발생하기 전에 모든 플래시 속성을 세션에 복사해준다.
리다이렉션 이후에는, 저장된 플래시 속성을 세션에서 모델로 이동시킨다.
이를 통해, Model이 초기화되는 단점을 극복할 수 있다.
[예제 코드]
@PostMapping(path="/login")
public String login(@RequestParam(name="passwd", required=true) String passwd,
HttpSession session,
RedirectAttributes redirectAttr) {
if("1234".equals(passwd)) {
session.setAttribute("isAdmin", "true");
}else {
// 리다이렉트에서도 데이터를 전달하기 위해, RedirectAttributes 클래스 사용
// key : errorMessage, value : 암호가 틀렸습니다
redirectAttr.addFlashAttribute("errorMessage","암호가 틀렸습니다.");
return "redirect:/loginform";
}
return "redirect:/list";
}