@PreAuthorize("isAuthenticated()")
@GetMapping("/modify/{id}")
public String questionModify(QuestionForm questionForm, @PathVariable("id") Integer id, Principal principal) {
Question question = this.questionService.getQuestion(id);
if(!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
}
questionForm.setSubject(question.getSubject());
questionForm.setContent(question.getContent());
return "question_form";
}
이 메서드는 "/modify/{id}" URI에 대한 HTTP GET 요청을 처리합니다.
주로 해당 리소스(질문 수정 페이지)를 보여주는데 사용됩니다.
URL에서 {id}는 경로 변수(path variable)로, 이를 통해 특정 ID의 질문을 식별합니다.
현재 사용자(principal)가 질문의 작성자인지를 확인하고, 작성자라면 질문의 내용을 수정할 수 있는 폼을 보여줍니다.
@PreAuthorize("isAuthenticated()")
@PostMapping("/modify/{id}")
public String questionModify(@Valid QuestionForm questionForm, BindingResult bindingResult, Principal principal, @PathVariable("id") Integer id) {
if(bindingResult.hasErrors()) {
return "question_form";
}
Question question = this.questionService.getQuestion(id);
if(!question.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정권한이 없습니다.");
}
this.questionService.modify(question, questionForm.getSubject(), questionForm.getContent());
return String.format("redirect:/question/detail/%s", id);
}
이 메서드는 "/modify/{id}" URI에 대한 HTTP POST 요청을 처리합니다.
주로 질문 수정 폼에서 제출된 데이터를 처리하고, 실제로 데이터를 수정하는 로직이 수행됩니다.
먼저 데이터 유효성 검사를 위해 @Valid 어노테이션과 BindingResult를 사용합니다.
데이터가 유효하다면, 현재 사용자가 질문의 작성자인지를 확인하고, 작성자라면 질문의 내용을 수정하고 수정된 질문의 상세 페이지로 리다이렉트합니다.
-> 이러한 구분은 HTTP 메서드의 의미와 RESTful한 아키텍처 원칙을 따름
여러 파라미터를 조합하여 게시물 목록을 조회할 때는 GET 방식을 사용하는 것이 좋은 이유 :
POST 방식은 동일한 POST 요청이 발생할 경우 중복 요청을 방지하기 위해 "만료된 페이지입니다." 라는 오류를 발생시키기 때문
(예 : 2페이지에서 3페이지로 갔다가 뒤로가기를 했을 때 2페이지로 가는것이 아니라 오류가 발생)