반응형
sendRedirect() vs forward()
웹 개발을 하다보면 특정 페이지로 이동시키는 기능을 구현해야 하는데, 그 중 대표적으로 이 두가지 함수들이 존재한다.
사실 이정도는 개발 입문 일주일차쯤에 알게되는 내용이겠지만.. 개발 블로그를 시작했음에도 아직 뭔가 거창한 걸 올리기에는 실력이 부족하기 때문에..
밑바닥부터 쌓아 올라가는 느낌으로 한 번 업로드해보려고 한다.
아 근데 물론 리다이렉션 되는거 vs 안되는 거 처럼 막 너무 간단하고 추상적인 비교 말고 좀 더 깊게 비교해보려고 한다.
현재 서블릿을 학습 중이므로 서블릿을 기준으로 코드를 작성했지만, HTTP 웹 개발 전반에 해당되는 개념임을 명심하자.
sendRedirect()
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect(request.getContextPath() + "/regist.html");
}
- HTTP 302 응답을 보내고, 브라우저가 다시 /regist.html로 요청.
- 즉, 두 번의 요청이 발생한다. (redirect 응답 -> 새 요청)
- 주소창 URL이 바뀜.
- request 객체가 초기화되므로 setAttribute()로 전달한 값은 사라짐.
sendRedirect() 언제 쓰면 좋은가?
- URL을 바꿔야 할 때 (사용자에게 최종 주소를 보여주고 싶을 때)
- PRG 패턴(Post-Redirect-Get) -> 폼 제출 후 새로고침 중복 전송 방지
- 다른 컨텍스트나 외부 사이트로 이동할 때
- 로그인 성공 후 메인 페이지로 이동하는 느낌 + 회원 가입 폼을 중복 제출하는 것을 방지하는 느낌
forward()
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/regist.html").forward(request, response);
}
- 서버 내부에서 요청을 넘김.
- 주소창 URL 안 바뀜.
- request와 response가 그대로 유지 -> setAttribute()로 전달한 데이터 JSP에서 바로 꺼낼 수 있음.
- 네트워크 요청은 한 번만 발생
forward() 언제 쓰면 좋은가?
- 데이터를 JSP로 넘겨서 출력해야 할 때
- 같은 요청 안에서 결과 화면을 바로 보여줄 때
- 주소창이 바뀌지 않아도 되는 경우
- 로그인 실패 시에 같은 화면에 사용자가 입력한 값과 에러 메시지 등을 다시 그대로 화면에 뿌려주는 느낌

실제 예시를 확인해보면, forward()의 경우에는 하나의 HTTP 요청만이 발생했고 sendRedirect()의 경우는 두 번의 요청이 발생했음을 확인할 수 있음.
또한 sendRedirect()의 경우에는 HTTP 302 상태 코드를 반환하는 것을 볼 수 있음.
302는 Found 또는 임시 리디렉션(Temporary Redirect)을 나타내는 코드
차이를 잘 알고 사용하자.
반응형