Spring/MVC

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

lumana 2025. 3. 9. 03:27

 

 

스프링 MVC Redirect 처리 방법

#Spring/MVC


/Redirect
/Redirect 처리 방법

/RedirectAttributes


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