
RequestDispatcher는 하나의 HTTP 요청을 서버 내부에서 다른 JSP나 서블릿으로 넘기거나, 특정 리소스의 결과를 응답에 포함시킬 수 있게 해주는 서블릿 API의 인터페이스입니다.
즉, 클라이언트가 보낸 하나의 요청을 서버 내부의 다른 자원(JSP, 서블릿 등)으로 넘기거나 포함시킬 수 있도록 도와주는 도구입니다.
이때 이동은 오직 서버 내부에서만 이루어지며, 클라이언트는 이를 인지하지 못합니다.
javax.servlet.RequestDispatcherRequestDispatcher는 단순한 객체가 아니라, WAS 내부의 요청 제어 시스템(경로 매핑, 버퍼 제어, 요청 전달 등 핵심 로직)과 밀접하게 연결된 객체입니다.
따라서 RequestDispatcher는 직접 new로 생성하지 않고, WAS에게 요청해서 Dispatcher를 “얻는” 구조로 설계되어 있습니다.
RequestDispatcher는 개발자가 직접 생성하지 않고, 다음 두 객체를 통해 얻습니다.
request.getRequestDispatcher()getServletContext().getRequestDispatcher() 또는context.getRequestDispatcher()| 방식 | 설명 | 코드 |
|---|---|---|
| HttpServletRequest 객체 | 현재 서블릿의 경로 기준 상대경로로 Dispatcher를 가져옴 | request.getRequestDispatcher("result.jsp") |
| ServletContext 객체 | 애플리케이션 루트(/) 기준 절대 경로로 Dispatcher를 가져옴 | getServletContext().getRequestDispatcher("/WEB-INF/result.jsp") |
| 구분 | 기준 경로 | 사용 예시 | 특징 |
|---|---|---|---|
| request.getRequestDispatcher() | 현재 요청한 서블릿의 위치 기준 상대 경로 | "result.jsp" | 상대 경로라서 경로 실수가 발생할 수 있음 |
| context.getRequestDispatcher() | 웹 애플리케이션 루트(/) 기준 절대 경로 | "/WEB-INF/views/result.jsp" | 구조가 명확하고 실무에서 더 선호됨 |
클라이언트가 로그인 요청:
POST /login
위 요청을 처리할 수 있는 방식에는 다음의 두 가지가 있습니다.
| 방식 | 설명 |
|---|---|
| response.sendRedirect("/welcome.jsp") | 클라이언트에게 다시 /welcome.jsp를 요청하라고 지시 (요청이 두 번) |
| RequestDispatcher.forward("/welcome.jsp") | 클라이언트 요청을 서버 내부에서 JSP로 넘김 (요청은 한 번만 발생) |
sendRedirect 흐름 (2번 요청)
1. 클라이언트 → /login 요청
2. 서버: 로그인 처리 완료 → "응답 헤더에 Location: /welcome.jsp"
3. 클라이언트가 다시 → /welcome.jsp 요청
4. 서버 → welcome.jsp를 실행하고 응답
forward 흐름 (1번 요청)
1. 클라이언트 → /login 요청
2. 서버: 로그인 처리 완료 → 내부에서 "/welcome.jsp"로 forward
3. 서버가 JSP 실행 → 바로 클라이언트에게 응답
즉, “요청 한 번으로 여러 자원이 협력해 응답을 구성한다”는 건, 클라이언트 입장에서는 한 번 요청했을 뿐인데,
서버 내부에서 서블릿 → JSP로 데이터와 흐름이 자연스럽게 전달되어 결과적으로 응답이 깔끔하고 구조적인 방식으로 완성된다는 뜻입니다.
| 메서드 | 설명 | 사용 예시 |
|---|---|---|
forward() | 요청을 다른 서블릿/JSP로 넘김. 사용자는 이동 사실을 모름. | 로그인 처리 → 결과 JSP |
include() | 다른 결과를 현재 응답 중간에 끼워 넣음. 응답 내용이 합쳐짐. | 헤더/푸터 공통 삽입 등 |
RequestDispatcher rd = request.getRequestDispatcher("result.jsp");
rd.forward(request, response);
RequestDispatcher rd = request.getRequestDispatcher("header.jsp");
rd.include(request, response);
response.getWriter() 등으로 출력하면 안 됩니다.RequestDispatcher는 서버 내부에서 요청을 다른 리소스로 “넘기거나 끼워 넣을 수 있게 해주는 도구”입니다.
forward() → 요청을 다른 곳으로 넘김 (응답을 완전히 대체)include() → 다른 리소스의 결과를 현재 응답에 끼워 넣음context.getRequestDispatcher() → 절대 경로 (루트 기준)request.getRequestDispatcher() → 상대 경로 (현재 경로 기준)