include사용 시점
JSP에서 공통 파일 불러올 때:
<jsp:include page="header.jsp" />
Servlet에서 여러 응답을 하나로 구성할 때 (출력 병합 등)
request.getRequestDispatcher("second").include(request, response);
- 동작 흐름도
클라이언트 요청 ▼ First Servlet 처리 중 ▼ request.getRequestDispatcher("second").include(request, response) ▼ Second Servlet 실행 (출력 내용만 응답에 포함됨) ▼ First Servlet 이어서 실행 (응답 계속 작성) ▼ 클라이언트에게 완성된 응답 반환
Second서블릿의 출력 내용이 현재 응답 스트림에 붙어서 출력됨.- 이후
First서블릿의 로직도 계속 실행 가능 (단, 실무에서는 사용에 주의).
forward사용 시점
request.getRequestDispatcher("second").forward(request, response);
- 동작 흐름도
클라이언트 요청 ▼ First Servlet → 일부 로직 처리 ▼ request.getRequestDispatcher("second").forward(request, response); ▼ Second Servlet이 요청 마무리 처리 ▼ 클라이언트에게 응답 반환 (브라우저 URL은 여전히 /first)
First서블릿은 응답을 완전히 넘기고, 이후 로직은 실행되지 않음.
redirect사용 시점
response.sendRedirect("second");
- 동작 흐름도
클라이언트 요청 (/first) ▼ First Servlet → 로직 처리 ▼ response.sendRedirect("second") ▼ 브라우저가 /second로 새 요청 전송 ▼ Second Servlet 처리 ▼ 응답 반환 (브라우저 URL도 /second)
- 클라이언트가 새로운 요청을 보내기 때문에, form 재전송 방지 등에서 유용.
| API 객체 | 메서드 | 설명 | 관련 방식 |
|---|---|---|---|
| HttpServletResponse | sendRedirect(String location) | 클라이언트에게 HTTP 302 응답을 보내 새 URL로 다시 요청하게 함 | redirect |
| HttpServletRequest | getRequestDispatcher(String path) | 요청 경로에 대한 RequestDispatcher 반환 → forward/include에 사용 | forward / include |
setAttribute(String name, Object value) | 요청 범위(request scope)에 데이터를 저장하여 다른 리소스와 공유 | forward / include | |
getAttribute(String name) | setAttribute()로 저장한 값을 가져옴 | forward / include | |
| RequestDispatcher | forward(HttpServletRequest, HttpServletResponse) | 서버 내부에서 다른 리소스로 요청 전달 (클라이언트는 URL 변화 인지 불가) | forward |
include(HttpServletRequest, HttpServletResponse) | 다른 리소스의 응답 결과를 현재 응답에 포함시킴 (출력 병합) | include |
| 항목 | include | forward | redirect |
|---|---|---|---|
| 요청 객체 공유 | ✅ 공유됨 | ✅ 공유됨 | ❌ 공유되지 않음 |
| 브라우저 URL 변경 | ❌ 안 됨 | ❌ 안 됨 | ✅ 변경됨 |
| 새로운 요청 여부 | ❌ 없음 | ❌ 없음 | ✅ 있음 (클라이언트가 새 요청) |
| 응답 이어서 실행 | ✅ 가능 (응답에 포함 후 다음 로직 실행 가능) | ❌ 불가능 (포워딩 후 뒤 로직 실행 안됨) | ❌ 불가능 (redirect 이후 현재 응답 종료됨) |
| 주 사용 위치 | JSP(View), Servlet 내 출력 조합 | Controller 내부 흐름 제어 | Controller에서 흐름 종료 후 URL 변경 필요 시 |
| 주요 사용 목적 | 공통 템플릿 포함 | 내부 페이지 이동, 결과 화면 연결 | 외부 페이지 이동, 새 요청 유도 |
| 상황 | 사용 방식 | 이유 |
|---|---|---|
| header, footer 불러오기 | include | 하나의 응답 안에 여러 JSP 구성 |
| 로그인 성공 → 마이페이지 이동 | forward | 요청 데이터 유지, URL은 그대로 |
| 로그인 성공 → 홈 URL 변경 이동 | redirect | URL 변경, 새로고침 대응 필요 |
| form 제출 후 중복 제출 방지 | redirect | POST → GET 전환(P.R.G 패턴) |
| JSP끼리 화면 병합 | include | 화면 조각 재사용 |