Search

redirect, forward

RequestDispatcher가 있는 이유. HttpServletResponse.sendRedirect() 와의 차이점
HttpServletResponse를 사용하면 sendRedirect() 메서드를 이용하여 지정한 경로로 제어를 이동시킬 수 있다. 그러나 sendRedirect()는 하나의 요청 범위 안에서 처리를 하는것이 아니다.
브라우저에게 HTTP 리다이렉션를 Response후, 브라우저측에서 지정받은 요청 경로로 다시 재요청을 하는 방식이기에 두 번의 HTTP 트랜잭션이 발생하게 된다.
분리되는 트랜잭션으로 인해, 서버측에서는 최초에 받은 요청 도중 처리한 내용을 리다이렉트 된 요청안에서 공유할 수 없다는 문제가 발생한다.
sendRedirect() 에서도 쿠키나 세션등을 이용해 특정 상태를 유지하여 공유할 수는 있겠으나
상황에 따라 제한적일 수 있으며, 코드 레벨 에서의 알고리즘 등을 곧바로 이어가는데에도 한계가 있기 때문에 좋은 방법이라고 할 수는 없을것이다.
RequestDispatcher 생성
RequestDispatcher는 ServletContext나 ServletRequest 클래스에서 제공하는 팩토리 메서드(Factory Method)를 통해 생성할 수 있다. RequestDispatcher는 기존 존재하는 Request의 정보를 담는다.
생성된 RequestDispatcher의 forward() 메서드
forward() 메서드는 대상 자원으로 제어를 넘기는 역할을 한다. 브라우저에서 /a.jsp로 요청했을 때 /a.jsp에서 forward()를 실행하여 /b.jsp로 제어를 넘길 수 있다. 제어를 넘겨받은 /b.jsp는 처리 결과를 최종적으로 브라우저에게 출력한다.
브라우저 입장에서는 /a.jsp를 요청했지만 받은 결과는 /b.jsp의 결과이다.
HTTP 리다이렉트 방식과는 달리 하나의 HTTP 요청(Request) 범위 안에서 동작이 이루어진다.
생각해보기
HttpServletResponse를 통해 리다이렉트 하는 방식은 현재 어플리케이션 이외에 다른 자원의 경로를 요청할 수 있게 되는 장점은 존재한다.
RequestDispatcher는 현재 처리중인 서블릿이 속해 있는 웹 어플리케이션 범위 내에서만 요청을 제어할 수 있다.