새발블로그
[Spring] 요청 포워딩 본문
forward vs redirect
| 구분 | forward | redirect |
| 처리 주체 | 서버 내부 | 클라이언트 브라우저 |
| URL 변경 | 안 바뀜 | 바뀜 |
| 요청 횟수 | 1번 | 2번 (요청 → 응답 → 재요청) |
| request 객체 | 공유됨 | 공유 안됨 |
| 사용 예 | 로그인 처리, 내부 페이지 이동 | 외부 페이지 이동, 새 URL로 유도 |
코드 예시
// forward
RequestDispatcher rd = request.getRequestDispatcher("result.jsp");
rd.forward(request, response);
// redirect
response.sendRedirect("result.jsp");
RequestDispatcher, HttpServletResponse
| 용어 | 설명 |
| RequestDispatcher | 서버 내부에서 요청을 다른 자원(JSP, 서블릿 등) 으로 포워딩(forward) 하는 객체 |
| HttpServletResponse | 클라이언트(브라우저)에게 응답을 보낼 때 사용하는 객체 |
1. RequestDispatcher란?
역할:
요청을 서버 안에서 다른 자원(서블릿이나 JSP) 으로 "넘겨주는" 데 사용된다.
이걸 "포워딩(forwarding)" 이라고 한다.
사용 예시:
RequestDispatcher dis = request.getRequestDispatcher("/result.jsp");
dis.forward(request, response);
실행 흐름:
- 사용자가 /request에 요청
- RequestServlet이 요청 처리 후
- result.jsp로 내부 이동 (브라우저 주소는 그대로 /request!)
특징:
- 서버 내부 이동 (브라우저는 모름)
- 요청 객체(Request) 그대로 전달됨 (속성도 유지됨!)
- 주소(URL)는 안 바뀜
비유로 이해:
RequestDispatcher는 회사 내부에서 부서 간 문서를 전달하는 것
예: "A 부서에서 작성한 문서를 B 부서로 보내 처리하게 함 (하지만 고객은 A 부서와 얘기한 줄 암)"
2. HttpServletResponse란?
역할:
- 서버가 클라이언트(브라우저)에게 응답을 보내기 위한 객체예요.
이 객체로 HTML을 직접 출력하거나, 리다이렉트(redirect) 같은 작업을 할 수 있다.
사용 예시 (리다이렉트):
response.sendRedirect("nextPage.jsp");
실행 흐름:
- 사용자가 /request_redirect 요청
- 서버가 응답으로 “/response_redirect로 이동해!” 라고 말함
- 브라우저가 새 요청을 만들어 /response_redirect로 이동
특징:
- 브라우저가 새로운 요청을 보냄
- Request 객체 초기화됨 (속성 없어짐)
- 주소(URL)가 바뀜
비유로 이해:
HttpServletResponse.sendRedirect()는
"죄송한데 이 업무는 저쪽 창구 가셔야 해요~" 하며 손님을 다시 밖으로 내보내 다른 데로 보내는 것
예제 비교
| 구분 | forward (RequestDispatcher) | redirect (HttpServletResponse) |
| 요청 방식 | 서버 내부 이동 | 클라이언트가 새로 요청 |
| 사용 객체 | RequestDispatcher | HttpServletResponse |
| request 속성 유지 | ✅ 유지됨 | ❌ 사라짐 (새 request) |
| URL 변경 여부 | ❌ 변경되지 않음 | ✅ 변경됨 |
| 예시 | 로그인 후 내부 JSP로 이동 | 글쓰기 후 목록 페이지로 리다이렉트 |
결론
| 용어 | 의미 | 언제 사용? |
| RequestDispatcher | 서버 내부에서 다른 자원으로 요청을 넘기는 도구 | 데이터를 JSP에 넘길 때, 내부 이동 |
| HttpServletResponse | 브라우저에게 응답을 줄 때 쓰는 객체 | 페이지 이동, 리다이렉트, 출력 등 |
언제 forward를 써야 할까?
적절한 상황:
- 서버 내부 처리만 하고, 클라이언트는 몰라도 될 때
- 예: 로그인 후 사용자 정보를 JSP에 보여줄 때
- 예: 폼 데이터 처리 후 결과 페이지 보여줄 때
- JSP에서만 결과를 보여주는 경우
- 컨트롤러 → JSP로 내부 이동
- 속성(attribute)을 넘겨야 할 때
- request.setAttribute()로 넘긴 값을 JSP나 다른 서블릿에서 받아야 할 때
사용 예:
request.setAttribute("msg", "로그인 성공!");
RequestDispatcher dis = request.getRequestDispatcher("/welcome.jsp");
dis.forward(request, response);
언제 redirect를 써야 할까?
적절한 상황:
- 완전히 다른 URL로 이동할 때
- 예: 로그인 성공 후 /main.do로 이동
- 예: 글 등록 후 /list.do로 이동
- 브라우저 주소창을 바꿔야 할 때
- 예: 새 페이지로 이동한 것을 사용자에게 명확히 보여줘야 할 때
- 새로운 요청으로 시작해야 할 때
- request에 남아 있는 데이터 초기화가 필요할 때
- 중복 제출 방지 (Post/Redirect/Get 패턴)
- 외부 사이트나 경로로 보낼 때
- 예: 로그인 후 타 서비스로 이동
사용 예:
response.sendRedirect("/main.jsp");
예시 시나리오로 정리
| 시나리오 | 추천 방식 | 이유 |
| 로그인 처리 후 환영 페이지 표시 | forward | 사용자 정보 request에 유지해야 함 |
| 로그인 후 메인 페이지 이동 | redirect | URL도 바뀌고, 새 요청으로 시작 |
| 게시글 작성 후 목록으로 돌아가기 | redirect | 새 요청으로 리프레시, 중복 제출 방지 |
| 검색어 입력 후 결과 보여주기 | forward | 내부 페이지에서 결과 표시 |
| 외부 사이트로 이동 | redirect | 클라이언트가 다른 사이트로 요청해야 함 |
'Server > Spring' 카테고리의 다른 글
| [Spring] Spring Container 스프링 컨테이너 (0) | 2025.07.06 |
|---|---|
| [Spring] FrontController (0) | 2025.07.06 |
| [Spring] 필터 (0) | 2025.07.06 |
| CORS (Cross-Origin Resource Sharing) (0) | 2025.06.25 |
| 쿠키(Cookie) / 세션(Session) / 로컬스토리지(LocalStorage) (1) | 2025.06.25 |