스프링 MVC Redirect 처리 방법
#Spring/MVC
- /1. HttpServletResponse의 sendRedirect()
 - /2. ResponseEntity
 - /3. RedirectView 직접 반환
 - /4. “redirect:” 접두사
 
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 |