Ch11. MVC 1 : 리다이렉트
리다이렉트 (redirect:)
RegisterController.java
@PostMapping("/register/step2")
public String handleStep2(HttpServletRequest request)
{
// agree 파라미터의 value
String agreeParam = request.getParameter("agree");
if(agreeParam == null || !agreeParam.equals("true"))
{
return "register/step1"; // 약s관 동의 다시 보여줌
}
// 약관 동의했다면 입력 폼 보여주도록 register/step2를 뷰 이름으로 리턴
return "register/step2";
}
위의 RegisterController.java의 handlerStep2() 메소드는 @PostMapping에 의해 POST 방식만을 처리한다.
웹 브라우저에 직접 주소를 입력하는 것은 GET 방식이므로, "http://localhost:8080/sp5-chap11/register/step2"를 직접 입력한다면 404 에러 화면이 나온다.
이럴때는 에러화면 대신 다른 페이지로 이동하도록 하는 리다이렉트를 사용하면 좋다.
예를들어 위에서 step2 주소를 받았을때 step1으로 이동하도록 하는 것이다.
@RequestMapping, @GetMapping, @PostMapping 등 요청 매핑 관련 애노테이션을 적용한 메서드가 "redirect:" 로 시작하는 경로를 리턴하면, 나머지 경로를 이용해서 리다이렉트할 경로를 구한다.
이때 나머지 경로의 시작이 "/" 이면 웹 어플리케이션을 기준으로 이동 경로를 생성한다.
예를들어 아래 메소드는 "/register/step2" 경로를 GET 방식으로 접근할때 (주소창에 직접입력할때) 약관 동의 화면인 step1 으로 리다이렉트시키는 메소드다.
@GetMapping("/register/step2")
public String handleStep2Get()
{
return "redirect:/register/step1";
}
위 메소드에서 리턴하는 문자열은 "redirect:/register/step1" 인데 "redirect:" 다음에 오는 문자가 '/' 이므로, 실제 리다이렉트하는 경로는 웹 어플리케이션 경로인 "/sp5-chap11" 과 "/register/step1"을 연결한 "/sp5-chap11/register/step1" 이다.
만약 나머지 경로가 "/"로 시작하지 않으면 현재 경로 기준 상대경로를 사용한다.
예를들어 "redirect:step1" 문자열을 리턴했다면, 현재 경로가 "~/register/step2" 이므로 "~/register/step1" 이 실제 리다이렉트 경로다.
그냥 완전한 경로를 리턴할수도 있다.
그렇게 되면 그냥 그 경로로 리다이렉트 된다.
출처 : 스프링5 프로그래밍 입문 (최범균 저)