response.sendRedirect는 클라이언트-서버 간 통신에서 서버가 클라이언트(브라우저)에게 다른 URL로 이동하라고 지시하는 방식이다.
response.sendRedirect 동작 원리
- 클라이언트 요청: 클라이언트가 서버에 HTTP 요청(예: GET 또는 POST)을 보냅니다.
- 서버 응답: 서버는 sendRedirect를 사용해 클라이언트에게 302 HTTP 상태 코드와 새 URL을 포함한 Location 헤더를 보냅니다.
- 클라이언트 동작: 클라이언트(브라우저)는 응답을 받고, Location 헤더에 지정된 URL로 새로운 요청을 보냅니다.
- 최종 처리: 서버는 새 요청을 처리하고 결과를 반환합니다.
특징
- URL 변경:
- 브라우저의 주소창에 새 URL이 표시됩니다.
- 클라이언트가 새로운 요청을 하기 때문입니다.
- 두 번의 요청/응답 과정:
- 기존 요청과 새 요청이 완전히 별개로 처리됩니다.
- 기존의 request 데이터는 유지되지 않으므로, 데이터 전달이 필요한 경우 쿼리 파라미터 또는 세션을 사용해야 합니다.
- 클라이언트 중심:
- 서버가 아닌 클라이언트가 새 URL로 이동을 요청합니다.
- 외부 URL 가능:
- 리다이렉션 대상 URL은 같은 서버 내부뿐만 아니라 외부 서버의 URL도 가능합니다.
예제 코드
1. 간단한 사용
response.sendRedirect("https://www.example.com");
2. 내부 페이지로 리다이렉트
response.sendRedirect("/myApp/login.jsp");
- 클라이언트는 현재 웹 애플리케이션의 login.jsp로 이동합니다.
3. 데이터 전달 (쿼리 파라미터)
String username = "john";
// URL 파라미터 값 인코딩
String encodedUser = URLEncoder.encode(username, "UTF-8");
// 리다이렉트 수행
response.sendRedirect("/myApp/welcome.jsp?user=" + encodedUser);
- 클라이언트는 welcome.jsp로 이동하며, URL에 user=john이 포함됩니다.
- welcome.jsp에서 request.getParameter("user")로 값을 가져올 수 있습니다.
sendRedirect vs. RequestDispatcher.forward
| 특징 |
sendRedirect |
RequestDispatcher.forward |
| 요청 방식 |
클라이언트가 새 요청을 생성 |
서버 내부에서 요청 처리 |
| 주소창 변경 |
브라우저 주소창이 새 URL로 변경 |
주소창이 변경되지 않음 |
| HTTP 요청 수 |
두 번 (기존 요청 + 새 요청) |
한 번 |
| 외부 URL 이동 |
가능 |
불가능 (같은 애플리케이션 내에서만 동작) |
| 속도 |
느림 (추가 요청 발생) |
빠름 |
| 데이터 전달 |
쿼리 파라미터나 세션 사용 |
request 객체를 통해 데이터 전달 가능 |
사용 사례
- 로그인 성공 후 리다이렉트:
response.sendRedirect("/myApp/dashboard.jsp");
- 외부 사이트로 이동:
- 페이지 리프레시 또는 데이터 초기화:
- 이전 요청의 데이터를 클라이언트에서 지우고 싶을 때.
response.sendRedirect("https://www.google.com");
주의 사항
- 기존 데이터 유실:
- 기존 요청 객체에 저장된 데이터는 새 요청에서 사용할 수 없습니다.
- 데이터를 유지하려면 세션이나 쿠키를 사용해야 합니다.
- 속도 문제:
- 추가 요청/응답이 발생하므로 RequestDispatcher.forward보다 느릴 수 있습니다.
- 상대 경로 주의:
- 경로를 설정할 때 상대 경로와 절대 경로를 혼동하지 않도록 해야 합니다.
요약
- response.sendRedirect는 클라이언트 측에서 새 URL로 이동하게 만드는 방식.
- 브라우저 주소창이 변경되며, 완전히 새로운 요청이 발생.
- 데이터 전달이 필요한 경우 쿼리 스트링 또는 세션 사용.
- 외부 URL 리다이렉트가 가능하므로 범용성이 높은 방식입니다.