[참고] 포워딩(forward)

박은서's avatar
Jan 29, 2026
[참고] 포워딩(forward)

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}
  • request scope 데이터 공유 가능
  • 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️⃣ 그림으로 이해하기

notion image
Share article