스프링 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 |