가능하다면 한 페이지에 많은 기능이 있는 것이 좋으므로 /exchange라는 주소를 만들고, 대신 mode에 따라 /usd2krw와 /krw2usd로 redirect 하도록 처리한다. 그림으로 표현하면 다음과 같다.
HttpServletResponse 사용
/exchange1 매핑을 만들어 mode, amount 파라미터를 수신하고 redirect 처리하도록 구현하는 Mapping은 다음과 같다. Redirect는 JSP/Servlet 기본 응답 객체인 HttpServletResponse에서 지원하므로 매개변수에 추가하며, IOException이 발생하므로 예외 전가 처리까지 해야 한다.
현재 페이지에서는 사용자에게 반환할 내용이 없으므로 반환형은 void를 사용하였다. 접속하면 다음과 같이 Redirect 처리 됨을 확인할 수 있다. 자세히 살펴볼 내용은 개발자 도구에서 기록이 남는다는 것과, 주소가 /exchange가 아니라는 점이다.
크롬 개발자 도구에서 네트워크 이력을 확인하면 다음과 같이 Redirect가 되었음을 확인할 수 있다.
Redirect 접두사 사용
Spring에서는 redirect: 접두사로 redirect 처리가 가능하다. 단, View Resolver를 사용해야 한다. /exchange2 를 만들어 redirect 접두사를 사용하여 처리하도록 구현한다.
접속 테스트를 하면 정상적으로 Redirect가 이루어지는 것을 확인할 수 있다.
RedirectView 사용
Spring에서는 Redirect만을 위한 RedirectView 클래스를 제공한다. /exchange3을 만들고 테스트를 위한 코드를 작성한다.
반환형으로 RedirectView를 설정하고 객체를 반환하도록 코드를 구성한다. 객체 내부에는 Redirect 목표 매핑 주소를 작성한다.
테스트 시 정상적으로 Redirect 됨을 확인할 수 있다.
RedirectAttributes
Redirect 할 때 파라미터를 작성하는 것이 번거로운 경우가 많다. 파라미터는 ?와 &를 사용하여 작성해야 하므로 수식이 지저분해지는데, RedirectAttributes는 Model과 동일한 방법으로 Redirect시 파라미터를 처리할 수 있도록 Spring에서 제공하는 도구이다.
RedirectAttributes는 Model을 확장한 형태이다
매개변수에 선언한 뒤 Model처럼 key=value 형식으로 데이터를 추가한다. redirect 접두사와 RedirectView 등 Spring에서 지원하는 기능에서 사용할 수 있다.
Redirect 접두사 사용 시
RedirectView 사용 시
주의사항
Redirect를 처리할 경우의 주의사항은 다음과 같다.
절대 경로에 대한 처리
JSP/Servlet 방식일 경우 절대경로를 사용하려면 HttpServletRequest 객체를 통한 계산이 필요하다(1번 방식)
상대 경로 - response.sendRedirect("usd2krw?usd=100")
절대 경로 - response.sendRedirect(request.getContextPath()+"/usd2krw?usd=100")
Spring에서 제공하는 방식(2번, 3번 방식)일 경우 경로 앞에 /를 적으면 절대경로로 인식한다.
redirect 접두사(2번 방식)를 사용하는 경우
상대 경로 - return "usd2krw?usd=100"
절대 경로 - return "/usd2krw?usd=100";
RedirectView를 사용하는 경우
상대 경로 - return new RedirectView("usd2krw?usd=100")