1. 포워딩(forward)
1️⃣ forward의 개념
1) 정의
forward는 클라이언트 요청을 유지한 채, 서버 내부에서 다른 리소스에게 처리를 위임하는 방식RequestDispatcher dispatcher =
request.getRequestDispatcher("/result.jsp");
dispatcher.forward(request, response);2) 핵심
- 요청은 1번
- 응답도 1번
- 서버 내부 이동
- 클라이언트는 이동 사실을 모름
2️⃣ forward의 동작 흐름
Browser
↓ (HTTP 요청 1회)
Servlet A
↓ forward
JSP / Servlet B
↓
Browser (HTTP 응답)- 주소창(URL) 변경 없음
- 같은
request,response객체가 전달됨
3️⃣ forward의 핵심 특징
1) request 객체 유지
request.setAttribute("user", user);
dispatcher.forward(request, response);${user.name}requestscope 데이터 공유 가능
- MVC 패턴에서 Controller → View 이동에 적합
2) 클라이언트는 모른다
- 브라우저는 최초 요청만 인지
- 서버 내부 처리 흐름만 변경
3) URL 유지
/login.do (그대로 유지)- 실제 응답은
/loginResult.jsp가 생성했어도 URL은 변경되지 않음
4) 응답이 아직 커밋되지 않아야 함
response.getWriter().println("출력");
dispatcher.forward(request, response); // ❌ 예외 발생- 응답 버퍼가 commit되기 전에만 가능
- forward 이후에는 출력 불가
4️⃣ forward vs redirect 비교
구분 | forward | redirect |
이동 방식 | 서버 내부 이동 | 클라이언트 재요청 |
요청 횟수 | 1회 | 2회 |
request 유지 | O | X |
URL 변경 | X | O |
사용 객체 | RequestDispatcher | HttpServletResponse |
성능 | 빠름 | 상대적으로 느림 |
5️⃣ forward 사용 시점
1) ✅ forward가 적합한 경우
- 로그인 처리 후 결과 화면 출력
- 서버 로직 결과를 JSP에 전달
- MVC 패턴에서 Controller → View 이동
// Controller
User user = service.login(id, pw);
request.setAttribute("user", user);
request.getRequestDispatcher("/view.jsp")
.forward(request, response);2) ❌ forward가 부적합한 경우
- 새 요청이 필요한 경우
- URL 변경이 필요한 경우
- 새로고침 시 중복 요청이 문제되는 경우 (POST 중복 전송)
6️⃣ 내부 경로 규칙 (중요)
request.getRequestDispatcher("/view.jsp"); // context 기준/로 시작 → Context Root 기준
- 절대경로 URL 아님 (http://… ❌)
7️⃣ include와의 차이 (간단 비교)
구분 | forward | include |
응답 제어 | 완전 위임 | 결과를 포함 |
이후 코드 실행 | 불가 | 가능 |
용도 | 화면 전환 | 공통 헤더/푸터 |
8️⃣ 한 줄 요약
forward는 “요청은 그대로 두고, 처리 담당자만 서버 내부에서 바꾸는 것”
9️⃣ 그림으로 이해하기

Share article