기본 콘텐츠로 건너뛰기

JSP 리다이렉트 완전 정리: sendRedirect, , location.href + flashAttribute 활용법

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()로 서버에서 리다이렉트

가장 기본이 되는 리다이렉트 방식은 HttpServletResponsesendRedirect()입니다.

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는 이 두 가지의 장점을 결합해, “리다이렉트 이후 딱 한 번만 보여줄 데이터”를 다룰 때 가장 깔끔한 방법입니다.

정리하자면, JSP/Servlet 환경에서는 response.sendRedirect(), <c:redirect>, location.href를 상황에 맞게 선택하고,
Spring MVC를 함께 사용한다면 flashAttribute로 1회성 메시지를 전달하면 보다 깔끔한 리다이렉트 UX를 만들 수 있습니다.

프로젝트에 공통 리다이렉트 유틸/패턴을 만들어 두면, 중복 코드도 줄이고 유지보수성도 크게 높일 수 있습니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...