회원 가입 후에, 왜 굳이 Redirect로 홈을 보내야 할까?
보통, @Controller
는 String
을 반환하는데, 이는 뷰의 "논리 이름"이다. 스프링에서 지정해준 prefix(보통 /resources/templates
이다.)와 suffix(보통 .html
이다.)을 논리 이름과 조합하여, 우리의 컨트롤러 맵핑 결과를 뷰 템플릿으로 보내어 화면에 출력해준다.
보통, @GetMapping
과 @PostMapping
의 맵핑 url은 동일하게 주어진다. 즉, form 형식으로 데이터를 보낼 때 action을 빈 값을 주어 동일한 url 내에서 두 가지 메소드를 처리하게 만든다.
그렇다는 것은, 우리가 @PostMapping
으로 데이터를 받아 저장한 후,
뷰 템플릿으로 "화면만 전환"
한다면, url은 변경되지 않은 채로
화면만 바뀌어있게 된다.
그 상태에서 새로고침을 누르면, 마지막에 처리되었던 요청이 다시 요청되어,
post method로 form 형식의 data가 다시 전송된다.
이렇게 되면, 중복 회원가입이 되거나, 상품이 무한정 등록되는 등, 아주 치명적인 에러를 발생시킬 수 있다.
그렇기 때문에, 아예 redirect를 사용하여 다른 url(동일 url도 괜찮다.)로 보내버린 후, 해당 url이 @GetMapping
이 되도록 만들어줘야 한다.
이렇게 POST -> Redirect -> GET 형태로 이루어지는 패턴을 "PRG 패턴"이라고 한다.