회원가입을 처리하기 위한 UserController.java 파일의 소스코드이다.
@Controller
public class UserController {
List<User> Users = new ArrayList<>();
@GetMapping("/user/form")
public String moveForm() {
return "form";
}
@PostMapping("/user/create")
public String addUser(Model model, User user) {
System.out.println("userId : " + user.getUserId() + " password : " + user.getPassword());
model.addAttribute("name", user.getName());
Users.add(user);
return "redirect:/users"; //redirect
}
@GetMapping("/users")
public String viewUsers() {
return "list";
}
}
회원가입을 처리한 후, 왜 바로 회원목록 페이지(list)를 보여주지 않고, 클라이언트로부터 redirect 하도록 하는 것일까?
REST API (URL) Naming Convention 에 따르면 GET과 POST의 역할이 구분되어 있다.
GET의 역할은 리소스[^1]를 요청만 한다.
POST는 리소스를 생성하는 요청이다. (이렇게 하도록 시멘틱에서 약속?을 함) 역할 구분을 위해서...
따라서 POST는 리소스를 생성하는 역할만 하고 끝나야하는 것이다. (끝나고 다른 리소스를 제공해주지 않아야 함.)
물론 기능상 return에 list.html 을 써서 바로 회원목록을 보여줄 수 있지만, (기능상 동작은 하겠지만) 그렇게 하지 말라는 것이다.
따라서 사용자 추가를 완료한 후 사용자 목록 페이지("redirect:/users")로 이동한다.
로 한 이유는,
클라이언트한테 리다이렉트할 주소를 알려주고, 클라이언트는 서버가 알려준 주소로 GET요청( GET /url
)을 다시 보내게 되는 것이다. GET은 자원을 요청하는 역할 이니깐, 이런 식으로 동작하록 하는 게 맞는 것이다.
[^1]: REST에서 기본 데이터 표현
참고
글 잘 봤습니다. 😁
마크다운에서 anchor 태그를 사용할 수 있습니다. (velog에서 직접 글 작성하고 테스트 해봤어요.)
https://stackoverflow.com/questions/6695439/how-to-link-to-a-named-anchor-in-multimarkdown
쨘!
와 같은 식으로요.