웹 개발을 하다보면 url, 경로나 view를 처리할때 forward/ redirect라는 개념을 사용하게 된다.
특히, 웹을 처음 공부할때에는 정확한 의미도 모르고 사용했을 가능성이 있다.(나처럼..)
이번에 Servlet을 공부해보다가 forward개념이 중요한 것 같아 자세하게 알아보려고 한다.
먼저 forward는 사전적의미로 전달하다라는 의미를 가지고 있다. 그렇다면 무엇을 전달하는가? 바로 request, response 제어권이다.
해당 말을 이해하려면 forward기술이 언제 사용되는지 알아야한다.
웹 개발을 하다보면 옛날 페이지가 새로운 페이지로 대체되는 경우가 생긴다. 예를 들어 페이지가 리뉴얼 되어서 새로운 사이트를 만들었다면, 기존의 옛날 페이지 url로 들어와도 새로운 페이지 url로 들어오도록 해야한다.
이때 Redirect와 forward를 사용할 수 있다.
옛날 페이지에서 redirect로 새로운 페이지를 설정해 두었을때의 페이지의 동작을 살펴보면,
옛날 url 요청
↓
오류 페이지 / 새로운 url 응답
↓
새로운 url 요청
↓
새로운 url 페이지 응답
즉, 두번의 요청과 두번의 응답을 실행하게 되어 결국에는 내가 요청한 url이 아닌 새로운 url로 표시되는 것을 볼 수 있다.
하지만 요청과 응답을 한번 더한다고 크게 문제가 되어 보이지는 않는다.
forward는 자신의 request와 response의 제어권을 넘기는 기능이 있다고 하였는데, redirect에서 보여준 상황을 forward로 하였을 때 동작을 살펴보면,
옛날 url 요청
↓
새로운 페이지에게 제어권을 주고 새로운 페이지가 응답
한번의 요청으로 응답을 받았기 때문에 url경로도 처음 요청한 url 그대로 이다.
하지만 위에서 말한 제어권을 넘기는 기능을 사용하지 않았는데, 언제 사용하는 걸까.. 바로 request에 데이터가 담겨져 있을때 이다.
생각을 해보면 각각의 페이지에는 request, response가 있다는 것을 알고 있는가? 그렇다면 바로 이해가 될 것인데, redirect로 페이지를 보내버리면 기존에 있던 페이지의 request 데이터가 새로운 페이지 request에 담겨지지 않는다.
하지만 forward를 사용하게 되면 옛날 페이지의 request, response를 넘겨 버리기때문에 새로운 페이지에서 옛날 request의 데이터를 사용할 수 있게 된다.
웹 개발에서 사용하는 Spring에서 기본적인 개념중 하나인 servlet은 이러한 forward 기능을 많이 사용하게 된다. servlet에서 추가 작업을 다른 서블릿에게 수행하게 할때, 요청에 정보를 덧붙여서 다른 서블릿으로 전달할때, mvc패턴에서는 서블릿에서 jsp로 정보를 전달할때 등 forward 기술을 사용하게 된다.
(여기서 알아야할 것은 servlet은 페이지의 기능을 할 수 있어서 각각의 request, response를 가지고 있다.)
MVC에서 servlet 코드를 보여주면
RequestDispatcher rd = request.getRequestDispatcher(url);
rd.forward(request, response);
마지막에 forward로 request, response를 넘겨주는 것을 볼 수 있다. 물론, Spring 프레임워크에서는 servlet기능이 내장되어 있어 직접 구현하거난 코드를 수정할 일이 없다.