JSP 개발에서 페이지를 이동시키는 대표적인 두 가지 방법은 바로 <jsp:forward> 액션 태그와 response.sendRedirect() 메서드입니다. 두 방식은 겉보기에는 비슷해 보이지만, 동작 원리와 활용 목적이 완전히 다릅니다.
<jsp:forward>의 동작 방식
<jsp:forward> 액션 태그는 클라이언트의 요청 정보를 담고 있는 request 객체를 그대로 유지한 채, 현재 JSP 파일에서 다른 파일로 요청을 전달(포워딩)합니다. 전달 대상은 포워딩을 수행하는 JSP와 같은 애플리케이션 컨텍스트(웹 애플리케이션) 내에 존재하기만 하면 되며, HTML 파일, 다른 JSP 파일, 서블릿 등 어떤 것이든 가능합니다.
이 과정은 모두 서버 내부에서 일어나기 때문에 브라우저는 페이지가 전환되었다는 사실조차 인식하지 못하며, 주소창의 URL도 변하지 않습니다.
sendRedirect()의 동작 방식
반면 response.sendRedirect(url)는 브라우저에 HTTP 302(임시 이동) 리다이렉트 응답을 전송합니다. 브라우저는 이 응답을 받은 뒤 지정된 URL로 새로운 요청을 직접 생성하여 해당 페이지로 이동합니다. 즉, 클라이언트와 서버 간에 한 번의 추가 왕복이 발생하며, 기존 request 객체에 담겨 있던 데이터는 유지되지 않습니다.
핵심 차이점 비교
| 구분 | <jsp:forward> | sendRedirect() |
|---|---|---|
| 처리 위치 | 서버 내부에서 처리 | 브라우저가 새 요청 생성 |
| request 객체 | 기존 객체 유지(데이터 공유 가능) | 새로 생성(기존 데이터 소실) |
| URL 변경 | 주소창 URL 변화 없음 | 주소창 URL이 변경됨 |
| 이동 범위 | 같은 웹 애플리케이션 내에서만 가능 | 외부 사이트로도 이동 가능 |
| 속도 | 상대적으로 빠름 | 추가 왕복으로 인해 느림 |
어떤 상황에서 무엇을 사용해야 할까?
로그인 처리처럼 요청 데이터를 다음 페이지에서 그대로 활용해야 하는 경우에는 <jsp:forward>가 적합합니다. 반면, 로그아웃 후 메인 페이지로 이동하거나 외부 사이트로 연결해야 하는 경우에는 sendRedirect()를 사용하는 것이 좋습니다. 특히 새로고침 시 폼이 중복 제출되는 문제를 방지하고 싶다면 PRG(Post-Redirect-Get) 패턴에 따라 sendRedirect()를 활용하는 것이 권장됩니다.