JSP 리다이렉트 정리: response.sendRedirect, <c:redirect>, location.href와 flashAttribute 활용
JSP/Servlet 기반 웹 개발에서 리다이렉트(redirect)는 페이지 이동을 구현할 때 가장 많이 사용하는 기능입니다.
특히 response.sendRedirect(), <c:redirect>, location.href를 언제 어떻게 써야 하는지,
그리고 Spring MVC의 flashAttribute와 함께 어떻게 활용하는지가 실무 포인트입니다.
이 글에서는 JSP에서 사용할 수 있는 대표적인 리다이렉트 방법 3가지와 POST-Redirect-GET 패턴 + flashAttribute까지 한 번에 정리합니다.
리다이렉트(redirect) 기본 개념
리다이렉트는 서버가 클라이언트(브라우저)에게 “다른 URL로 다시 요청하라”는 응답(3xx 상태 코드 + Location 헤더)를 보내는 방식입니다.
- 브라우저가 새로운 URL로 다시 요청을 보내기 때문에, 주소창 URL이 변경됩니다.
- 기존
request영역의 데이터는 새 요청에서는 사용할 수 없습니다. - 주로 폼 처리 후 새로고침 시 중복 전송 방지(POST-Redirect-GET 패턴)에 사용합니다.
JSP/Servlet 환경에서는 대표적으로 다음 3가지 방법으로 리다이렉트를 구현합니다.
- 서버 사이드 :
response.sendRedirect() - JSTL 태그 :
<c:redirect> - 클라이언트 사이드 :
location.href(JavaScript)
1) response.sendRedirect()로 서버에서 리다이렉트
가장 기본이 되는 리다이렉트 방식은 HttpServletResponse의 sendRedirect()입니다.
JSP 페이지에서 사용 예시
<%
// 서버에서 다른 URL로 리다이렉트
response.sendRedirect("/login.do");
%>
질문에 있던 코드 형태는 아래와 같이 표현할 수 있습니다.
<%= response.sendRedirect("/someUrl.do") %>
하지만 표현식(<%= %>)보다는 스크립틀릿(<% %>)으로 호출하는 것이 일반적입니다.
sendRedirect() 자체는 반환값이 void이기 때문에, 표현식으로 출력할 값이 없습니다.
sendRedirect() 특징
- HTTP 302 응답 + Location 헤더를 내려보냄
- 브라우저가 Location URL로 새 요청을 보냄
- 현재 요청의
request속성은 새 요청에서 사용할 수 없음 - 로그인/로그아웃, 폼 제출 후 목록 페이지로 이동 등에서 자주 사용
2) JSTL <c:redirect>로 리다이렉트
JSP에서 스크립틀릿 코드를 줄이고 태그 중심(선언형)으로 개발하고 싶다면
JSTL의 <c:redirect>를 사용할 수 있습니다.
기본 사용 예시
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:redirect uri="/login.do" />
파라미터 함께 넘기기
<c:redirect uri="/search.do">
<c:param name="keyword" value="spring" />
<c:param name="page" value="1" />
</c:redirect>
내부적으로는 response.sendRedirect()를 사용하는 것과 의미는 비슷하지만,
JSP 태그 구조 안에서 파라미터를 선언적으로 정의할 수 있다는 점이 장점입니다.
3) JavaScript location.href로 클라이언트 리다이렉트
마지막으로, 클라이언트(브라우저)에서 직접 URL을 변경하는 방식이
location.href입니다. JSP/서블릿과 상관없이 HTML/JS 어디에서나 사용할 수 있습니다.
기본 예시
<script>
// SCRIPT 방식 리다이렉트
location.href = "/login.do";
</script>
location.href vs location.replace
location.href = "URL": 새 히스토리로 쌓임 (뒤로가기 가능)location.replace("URL"): 현재 페이지를 대체 (뒤로가기 시 원래 페이지로 못 돌아감)
JavaScript 방식은 버튼 클릭, 조건 분기, Ajax 결과에 따라 동적 이동이 필요할 때 유용합니다.
다만, 서버에서 강제해야 하는 보안/권한 정책은 가급적 sendRedirect()를 통해 처리하는 것이 안전합니다.
Spring flashAttribute로 리다이렉트 시 메시지 전달하기
리다이렉트의 단점은 request 범위의 데이터가 다음 요청으로 넘어가지 않는다는 점입니다. 예를 들어, 회원가입이나 저장 처리 후 목록 페이지로 리다이렉트하면서 “정상적으로 저장되었습니다.” 같은 1회성 메시지를 보여주고 싶을 때 문제가 됩니다.
Spring MVC에서는 이런 문제를 해결하기 위해 flashAttribute를 제공합니다.
RedirectAttributes를 통해 설정한 flashAttribute는
리다이렉트 이후 한 번만 유효한 속성으로 동작합니다.
컨트롤러에서 flashAttribute 사용 예
@PostMapping("/save")
public String save(
@ModelAttribute FormDto form,
RedirectAttributes redirectAttributes) {
// 1. 비즈니스 로직 처리
service.save(form);
// 2. flashAttribute에 1회성 메시지 등록
redirectAttributes.addFlashAttribute("message", "정상적으로 저장되었습니다.");
// 3. PRG 패턴: 목록 화면으로 리다이렉트
return "redirect:/list";
}
JSP에서 flashAttribute 출력 예
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty message}">
<div class="alert alert-success">
${message}
</div>
</c:if>
flashAttribute의 특징 정리
- 리다이렉트 이후 단 한 번만 사용 가능 (보통 세션을 통해 임시 저장)
- 주로 성공/실패 메시지, 경고, 알림 등을 보여줄 때 활용
- 개발자가 세션에서 직접 삭제하지 않아도, 한 번 사용 후 알아서 제거되는 패턴
- POST-Redirect-GET 패턴에서 자주 등장
💡 왜 flashAttribute를 써야 할까?
단순한Model또는request.setAttribute()는 리다이렉트 시 사라집니다. 반대로세션에 직접 저장하면, 수동으로 삭제 로직을 넣어야 하고 관리가 번거롭습니다. flashAttribute는 이 두 가지의 장점을 결합해, “리다이렉트 이후 딱 한 번만 보여줄 데이터”를 다룰 때 가장 깔끔한 방법입니다.
댓글
댓글 쓰기