[Spring MVC] 스프링 MVC Redirect 처리 방법

2025. 3. 9. 03:27·Spring/MVC

 

 

스프링 MVC Redirect 처리 방법

#Spring/MVC


/Redirect
/Redirect 처리 방법

  • /1. HttpServletResponse의 sendRedirect()
  • /2. ResponseEntity
  • /3. RedirectView 직접 반환
  • /4. “redirect:” 접두사

/RedirectAttributes

  • /1. Flash Attribute
  • /2. Query Parameter 전달

Redirect

Redirect 는 클라이언트의 요청을 완전히 새로운 URL로 전달하여 처리하는 방식이다.
웹 브라우저는 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동한다.


Redirect 처리 방법

1. HttpServletResponse의 sendRedirect()

@PostMapping("/add")
public void ItemOrderCompleteForm(HttpServletResponse response) throws IOException {
    response.sendRedirect("/items");
}

2. ResponseEntity

ResponseEntity를 사용하면 HTTP 응답의 헤더와 상태 코드를 직접 제어할 수 있다. 이를 통해 리다이렉트 URL을 포함한 응답을 반환할 수 있다.

@PostMapping("/add")
public ResponseEntity<Void> addItem() {
    HttpHeaders headers = new HttpHeaders();
    headers.setLocation(URI.create("/items"));
    // 302(FOUND) 또는 303(SEE_OTHER)를 사용하여 리다이렉트 응답 생성
    return new ResponseEntity<>(headers, HttpStatus.FOUND);
}


3. RedirectView 직접 반환

  • RedirectView 객체를 반환하여 리다이렉트를 처리할 수 있다.
    • 리다이렉트 관련 추가 옵션(예: 모델 속성 노출 여부)을 세밀하게 제어 가능
    • 컨트롤러가 View 객체를 직접 반환하므로, ViewResolver가 추가 작업을 하지 않는다.
@PostMapping("/add")
public RedirectView addItem() {
    RedirectView redirectView = new RedirectView("/items");
    // 필요 시 모델 속성을 URL에 포함하지 않도록 설정 가능
    redirectView.setExposeModelAttributes(false);
    return redirectView;
}


4. “redirect:” 접두사

반환 값 앞에 “redirect:” 접두사를 붙이면 스프링이 이를 리다이렉트로 인식한다.

@PostMapping("/add")
public String addItem() {
    // 비즈니스 로직 처리 후, "/items" URL로 리다이렉트
    return "redirect:/items";
}

Spring MVC에서 "redirect:" 접두사를 사용하면 내부적으로 RedirectView가 생성되어, HttpServletResponse의 sendRedirect() 메서드를 호출한다. 이때 기본적으로 HTTP 상태코드는 302 Found가 된다.

주의 : @RestController에서는 이 방식으로 리다이렉트를 처리할 수 없다.


RedirectAttributes

리다이렉트 시 데이터(예: 일회성 메시지)를 전달하기 위해 RedirectAttributes를 사용할 수 있다.

  • 주로 Post/Redirect/Get(PGR) 패턴에서 사용된다.
  • URL에 직접 데이터를 노출하지 않고 안전하게 전달할 수 있는 Flash Attribute와 URL 쿼리 파라미터 방식이 있다.

1. Flash Attribute

Flash Attribute는 리다이렉트 후 한 번만 사용되는 데이터를 세션에 임시 저장하여 전달한다.

  • Flash Attribute는 리다이렉트된 후 자동으로 세션에서 제거되므로, 반복 사용되지 않는다.
  • URL에 데이터가 노출되지 않아 보안상 안전하다.

참고 | 세션에 데이터가 저장되므로, RedirectAttributes를 사용할때, @SessionAttributes와 함께 사용한다면 주의해서 개발을 해야한다. 세션의 변경사항이 RedirectAttributes에 영향을 줄 수도 있기 때문이다.

(ex. sessionStatus.setComplete()로 세션을 비워버리는 경우)


@PostMapping("/add")
public String addItem(RedirectAttributes redirectAttributes) {
    // 비즈니스 로직 처리 후, 일회성 메시지 저장
    redirectAttributes.addFlashAttribute("message", "아이템이 성공적으로 추가되었습니다.");
    return "redirect:/items";
}

2. Query Parameter 전달

리다이렉트 URL에 쿼리 파라미터 형태로 데이터를 추가할 경우, addAttribute() 메서드를 사용한다.

  • URL 뒤에 ?id=123 형태로 파라미터가 추가된다.
  • 민감한 정보는 URL에 노출될 수 있으므로 주의해야 한다.
@PostMapping("/add")
public String addItem(RedirectAttributes redirectAttributes) {
    // 비즈니스 로직 처리 후, URL 파라미터로 데이터 추가
    redirectAttributes.addAttribute("id", 123);
    return "redirect:/items";
}

또한, RedirectAttributes를 사용하면 URL 인코딩도 해주고, pathVariable, 쿼리 파라미터까지 처리해준다.

@PostMapping("/add")
public String addItem(Item item, RedirectAttributes redirectAttributes) {
    Item savedItem = itemRepository.save(item);
    redirectAttributes.addAttribute("itemId", savedItem.getId());
    redirectAttributes.addAttribute("status", true);
    return "redirect:/basic/items/{itemId}";
}

'Spring > MVC' 카테고리의 다른 글

[Spring MVC] 스프링 MVC 기본 기능 정리  (0) 2025.03.09
[Spring MVC] 타임리프 문법 정리  (0) 2025.02.13
[Spring/MVC] 12. Bean Validation  (0) 2025.01.19
[Spring/MVC] 11. Validation  (0) 2025.01.19
[Spring/MVC] 10. 메시지 국제화  (0) 2025.01.19
'Spring/MVC' 카테고리의 다른 글
  • [Spring MVC] 스프링 MVC 기본 기능 정리
  • [Spring MVC] 타임리프 문법 정리
  • [Spring/MVC] 12. Bean Validation
  • [Spring/MVC] 11. Validation
lumana
lumana
배움을 나누는 공간 https://github.com/bebeis
  • lumana
    Brute force Study
    lumana
  • 전체
    오늘
    어제
    • 분류 전체보기 (457)
      • Software Development (27)
        • Performance (0)
        • TroubleShooting (1)
        • Refactoring (0)
        • Test (8)
        • Code Style, Convetion (0)
        • DDD (0)
        • Software Engineering (18)
      • Java (71)
        • Basic (5)
        • Core (21)
        • Collection (7)
        • 멀티스레드&동시성 (13)
        • IO, Network (8)
        • Reflection, Annotation (3)
        • Modern Java(8~) (12)
        • JVM (2)
      • Spring (53)
        • Framework (12)
        • MVC (23)
        • Transaction (3)
        • AOP (11)
        • Boot (0)
        • AI (0)
      • DB Access (1)
        • Jdbc (1)
        • JdbcTemplate (0)
        • JPA (14)
        • Spring Data JPA (0)
        • QueryDSL (0)
      • Computer Science (130)
        • Data Structure (27)
        • OS (14)
        • Database (10)
        • Network (21)
        • 컴퓨터구조 (6)
        • 시스템 프로그래밍 (23)
        • Algorithm (29)
      • HTTP (8)
      • Infra (1)
        • Docker (1)
      • 프로그래밍언어론 (15)
      • Programming Language(Sub) (77)
        • Kotlin (1)
        • Python (25)
        • C++ (51)
        • JavaScript (0)
      • FE (11)
        • HTML (1)
        • CSS (9)
        • React (0)
        • Application (1)
      • Unix_Linux (0)
        • Common (0)
      • PS (13)
        • BOJ (7)
        • Tip (3)
        • 프로그래머스 (0)
        • CodeForce (0)
      • Book Review (4)
        • Clean Code (4)
      • Math (3)
        • Linear Algebra (3)
      • AI (7)
        • DL (0)
        • ML (0)
        • DA (0)
        • Concepts (7)
      • 프리코스 (4)
      • Project Review (6)
      • LegacyPosts (11)
      • 모니터 (0)
      • Diary (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
lumana
[Spring MVC] 스프링 MVC Redirect 처리 방법
상단으로

티스토리툴바