개발 공부 로그

[Spring] PRG Post/Redirect/Get, @RedirectAttributes 기능과 사용방법 본문

카테고리 없음

[Spring] PRG Post/Redirect/Get, @RedirectAttributes 기능과 사용방법

mejii 2025. 5. 8. 11:58

김영한 강사님의 스프링 MVC 1편 강의자료의 일부를 정리한 내용입니다.


 

상품 등록 폼을 이용해 상품을 저장하면, 내부 호출로 상품 상세 페이지가 보여진다.

화면만 보아서는 문제가 없어보인다. 하지만 상품 상세 페이지를 새로고침하면 문제를 발견할 수 있다..!

웹 브라우저의 새로고침은 마지막에 서버에 전송한 데이터를 다시 전송한다.

즉, 내용은 같고 자동으로 생성되는 ID만 다른 상품이 내 의도와 다르게 저장이 되어버린다!

 

 

이 문제는 어떻게 해결할까?

새로 고침 문제를 해결하려면, 상품 저장 후 뷰 템플릿으로 이동하는 것이 아니라, 상품 상세 화면으로 리다이렉트를 호출해야한다.

웹 브라우저는 상품 저장 후, 상품 상세 화면으로 다시 이동한다.

따라서 마지막에 호출한 내용이 Post/add가 아닌, Get/items/{id}가 된다.

이제 새로고침해도 상품 상세 화면으로 다시 이동하고,  원하지 않는 상품이 등록되지 않는다!

 

 

 

 @RedirectAttributes

 

  요구사항이 추가되었다. 고객 입장에서 저장이 잘된 것인지를 바로 알 수 있게,

저장이 잘되었으면 상품 상세 화면에 "저장되었습니다" 메시지를 추가해보자!

 

/**
  * RedirectAttributes 사용하기
  */
 @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

URL 인코딩을 해주고, pathVariable, 쿼리파리미터까지 처리해준다.

- pathVariable 바인딩: {itemId}

- 나머지는 쿼리 파라미터로 처리: ?status=true

 

뷰 템플릿에 메시지 추가

<div class="py-5 text-center">
        <h2>상품 상세</h2>
    </div>
    <!-- 추가 -->
    <h2 th:if="${param.status}" th:text="'저장 완료'"></h2>

 

타임리프를 사용하였다. 

- th:if : 해당 조건이 참이면 실행

- ${param.status} : 타임리프에서 쿼리 파라미터를 편리하게 조회하는 기능,

 저장에 성공하는 경우 status 파라미터가 true로 들어가므로, 저장에 성공하는 경우 '저장 완료' 메시지를 h2에 띄운다.