지금까지 강의를 따라하면서 만든 상품 등록 처리 컨트롤러에 심각한 문제가 있었다고 한다. 상품 등록을 완료하고 웹 브라우저의 새로고침 버튼을 눌러보면 상품이 중복해서 등록이 된다. 새로고침을 계속 해 보니까 ID 수가 계속 오른다.. 이 문제를 해결하는 강의였다.
[출처] : springmvc1 강의자료 218 페이지
이런 문제가 생긴 이유를 그림으로 설명해 주었다. 웹 브라우저에서 새로 고침은 마지막으로 서버에 전송한 데이터를 다시 전송하는데 상품 등록 폼에서 데이터를 입력하고 저장을 선택하면 Post/add+상품 데이터를 서버로 전송하는데 여기서 새로고침을 하면 다시 전송을 하게 되고 그렇게 중복이 계속 되어 데이터가 쌓이게 되는 것이다.
[출처] : springmvc1 강의자료 219 페이지
이 문제를 해결하기 위해 위와 같은 그림을 보여주었다.
새로 고침 문제를 해결하기 위해 상품 저장 후 뷰 템플릿으로 이동하지 않고 상품 상세 화면으로 리다이렉트 호출을 해주면 되는 것이다. 이때, 새로 고침을 하게 되면 다시 상품 상세 화면으로 이동하게 되므로 전과 같은 현상이 일어나지 않는다.
@PostMapping("/add")
public String addItemV5(Item item) {
itemRepository.save(item);
return "redirect:/basic/items/" + item.getId();
}
먼저 컨트롤러에 추가를 해준다.
상품 등록 처리하고 뷰 템플릿이 아닌, 리다이렉트를 통해 상품 상세로 넘어가도록 해결한다. 이런 문제 해결 방식을 PRG라고 한다고 한다. Post, Redirect, Get 앞 글자를 따서 PRG.
이런 방식에도 주의해야 하는 점이 있는데 URL 인코딩이 안 되기 때문에 공백이나 다른 문자가 있다면 곤란하다. 떄문에 인코딩이나 다른 처리를 해줘야 하는데 이번 강의에서는 다루지 않고 다음 강의에서 다룬다고 한다.
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고하여 공부하였습니다.
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : 타임리프, thymeleaf 소개 (0) | 2022.02.04 |
---|---|
[Spring Boot] : RedirectAttributes 사용하기 (0) | 2022.02.03 |
[Spring Boot] : 상품 수정 구현하기 (0) | 2022.02.03 |
[Spring Boot] : 상품 등록 처리 @ModelAttribute 사용하기 (0) | 2022.02.03 |
[Spring Boot] : 상품 상세 페이지 타임리프 적용 및 목록으로 가기 구현 (0) | 2022.02.03 |
댓글