include vs forward vs redirect

임유진·2025년 7월 22일

목록 보기
2/7
post-thumbnail

include

  • include는 요청 처리 중, 다른 리소스(JSP 또는 Servlet)의 결과를 현재 응답에 삽입하는 방식.
  • 현재 페이지와 포함되는 페이지는 같은 요청/응답 객체를 공유.
  • 주로 공통 레이아웃(header/footer/sidebar) 등을 포함할 때 사용.
  • 사용 시점

    • 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

  • forward는 요청을 서버 내부의 다른 리소스(JSP/Servlet)로 전달하는 방식.
  • 클라이언트는 이 과정을 알 수 없고, URL도 바뀌지 않음.
  • 요청 객체(request)가 그대로 전달되므로 request attribute 공유 가능.
  • 사용 시점

    • 로그인 후 대시보드로 이동
    • 데이터 검증 후 결과 페이지로 이동
    • 응답에 별도 데이터 추가 없이 JSP로 포워딩할 때
request.getRequestDispatcher("second").forward(request, response);
  • 동작 흐름도
클라이언트 요청
   ▼
First Servlet → 일부 로직 처리
   ▼
request.getRequestDispatcher("second").forward(request, response);
   ▼
Second Servlet이 요청 마무리 처리
   ▼
클라이언트에게 응답 반환 (브라우저 URL은 여전히 /first)
  • First 서블릿은 응답을 완전히 넘기고, 이후 로직은 실행되지 않음.

redirect

  • redirect는 서버가 클라이언트에게 다른 URL로 새로 요청하라고 응답하는 방식.
  • 새 요청이므로 request 객체는 공유되지 않음.
  • 브라우저 주소창이 실제로 변경됨.
  • 사용 시점

    • 로그인 후 홈 페이지로 이동 (URL 변경 필요)
    • POST-REDIRECT-GET 패턴 (중복 제출 방지)
    • 외부 사이트 이동
response.sendRedirect("second");
  • 동작 흐름도
클라이언트 요청 (/first)
   ▼
First Servlet → 로직 처리
   ▼
response.sendRedirect("second")
   ▼
브라우저가 /second로 새 요청 전송
   ▼
Second Servlet 처리
   ▼
응답 반환 (브라우저 URL도 /second)
  • 클라이언트가 새로운 요청을 보내기 때문에, form 재전송 방지 등에서 유용.

redirect, forward, include 관련 API 정리

API 객체메서드설명관련 방식
HttpServletResponsesendRedirect(String location)클라이언트에게 HTTP 302 응답을 보내 새 URL로 다시 요청하게 함redirect
HttpServletRequestgetRequestDispatcher(String path)요청 경로에 대한 RequestDispatcher 반환 → forward/include에 사용forward / include
setAttribute(String name, Object value)요청 범위(request scope)에 데이터를 저장하여 다른 리소스와 공유forward / include
getAttribute(String name)setAttribute()로 저장한 값을 가져옴forward / include
RequestDispatcherforward(HttpServletRequest, HttpServletResponse)서버 내부에서 다른 리소스로 요청 전달 (클라이언트는 URL 변화 인지 불가)forward
include(HttpServletRequest, HttpServletResponse)다른 리소스의 응답 결과를 현재 응답에 포함시킴 (출력 병합)include

비교 요약표

항목includeforwardredirect
요청 객체 공유✅ 공유됨✅ 공유됨❌ 공유되지 않음
브라우저 URL 변경❌ 안 됨❌ 안 됨✅ 변경됨
새로운 요청 여부❌ 없음❌ 없음✅ 있음 (클라이언트가 새 요청)
응답 이어서 실행✅ 가능 (응답에 포함 후 다음 로직 실행 가능)❌ 불가능 (포워딩 후 뒤 로직 실행 안됨)❌ 불가능 (redirect 이후 현재 응답 종료됨)
주 사용 위치JSP(View), Servlet 내 출력 조합Controller 내부 흐름 제어Controller에서 흐름 종료 후 URL 변경 필요 시
주요 사용 목적공통 템플릿 포함내부 페이지 이동, 결과 화면 연결외부 페이지 이동, 새 요청 유도

상황사용 방식이유
header, footer 불러오기include하나의 응답 안에 여러 JSP 구성
로그인 성공 → 마이페이지 이동forward요청 데이터 유지, URL은 그대로
로그인 성공 → 홈 URL 변경 이동redirectURL 변경, 새로고침 대응 필요
form 제출 후 중복 제출 방지redirectPOST → GET 전환(P.R.G 패턴)
JSP끼리 화면 병합include화면 조각 재사용
profile
말하는 고구마

0개의 댓글