RedirectAttributes

"redirect:/basic/items/" + item.getId() redirect에서 +item.getId() 처럼 URL에 변수를 더해서 사용하는 것은 URL 인코딩이 안되기 때문에 위험하다. => RedirectAttributes 를 사용해서 해결할 수 있다!

상품 저장시, 고객 입장에서 저장이 잘 된 것인지 안 된 것인지 확신이 들지 않는다. 그래서 저장이 잘 되었으면 상품 상세 화면에 "저장되었습니다"라는 메시지를 보여달라는 요구사항이 왔다. 간단하게 해결해보자.

@PostMapping("/add") 수정 파라미터로 RedirectAttributes를 추가로 받는다. 리다이렉트할 때 status=true를 추가한다. 실행해보면 다음과 같은 리다이렉트 결과가 나온다. http://localhost:8080/basic/items/3?status=true

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

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

  • pathVariable 바인딩 : {itemId} 변수처럼 사용하고, 치환할 수 있다!

  • 치환할 데이터가 없다면 쿼리 파라미터로 처리 : ?status=true

redirect:/basic/items/{itemId}

뷰 템플릿 메시지 추가 상품 등록 후 리다이렉트되는 상품 상세 페이지(item.html)에서만 저장완료 메세지가 뜬다. 왜냐하면 상품 등록시에만 RedirectAttributes로 status=true를 전송하기 때문에 상품 등록 후 리다이렉트된 페이지에서 status가 타임리프 if문을 만족하여 저장 완료 메시지가 뜨고, GET 방식의 단순 상품 상세 페이지 접속 시에는 status가 없기 때문에 안 뜬다!

<h2 th:if="${param.status}" th:text="'저장 완료!'"></h2>

타임리프 문법

⭐️th:if : 해당 조건이 참이면 실행 ⭐️${param.status} : 타임리프에서 쿼리 파라미터를 편리하게 조회하는 기능

Last updated