답변 수정 기능 추가하기
[Spring Boot] 29. 게시판 질문 수정 기능 추가하기
수정 및 삭제 기능 추가수정 일시 추가하기게시판의 질문과 답변을 수정하거나 삭제 기능을 추가하기 전에 언제 수정되었는지 확인할 수 있도록 속성을 추가하자./question/Question.javapackage com.mysit
exuzii.tistory.com
[Spring Boot] 30. 게시판 질문 삭제 기능 추가하기
[Spring Boot] 29. 게시판 질문 수정 기능 추가하기수정 및 삭제 기능 추가수정 일시 추가하기게시판의 질문과 답변을 수정하거나 삭제 기능을 추가하기 전에 언제 수정되었는지 확인할 수 있도록
exuzii.tistory.com
위 질문 수정 삭제 기능과 매우 유사하다.
버튼 추가하기
/templates/question_detail.html
...
<!-- 수정 버튼 -->
<div class="my-3">
<a th:href="@{|/answer/modify/${answer.id}|}" class="btn btn-sm btn-outline-secondary"
sec:authorize="isAuthenticated()"
th:if="${answer.author != null and #authentication.getPrincipal().getusername() == answer.author.username}"
th:text="수정"></a>
</div>
<!-- 수정 버튼 끝 -->
</div>
</div>
<!-- 답변 반복 끝 -->
로그인한 사용자와 답변 작성자와 동일할 경우에만 수정 버튼이 활성화됟록 했다.
수정 버튼을 클릭하면 /answer/modify/답변id URL이 GET방식으로 요청된다.
서비스 수정하기
답변을 수정하기 위해서는 답변을 먼저 조회해야한다.
/answer/AnswerService.java
package com.mysite.sbb.answer;
import java.time.LocalDateTime;
import java.util.Optional;
import org.springframework.stereotype.Service;
import com.mysite.sbb.DataNotFoundException;
import com.mysite.sbb.question.Question;
import com.mysite.sbb.user.SiteUser;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class AnswerService {
private final AnswerRepository answerRepository;
public void create(Question question, String content, SiteUser author) {
Answer answer = new Answer();
answer.setContent(content);
answer.setCreateDate(LocalDateTime.now());
answer.setQuestion(question);
answer.setAuthor(author);
this.answerRepository.save(answer);
}
public Answer getAnswer(Integer id) {
Optional<Answer> answer = this.answerRepository.findById(id);
if (answer.isPresent()) {
return answer.get();
} else {
throw new DataNotFoundException("answer not found");
}
}
public void modify(Answer answer, String content) {
answer.setContent(content);
answer.setModifyDate(LocalDateTime.now());
this.answerRepository.save(answer);
}
}
조회하기 위한 getAnswer와 modify 메서드를 추가했다.
컨트롤러 수정하기
다음으로 URL 처리하는 컨트롤러를 수정하자.
/answer/AnswerController.java
...
@PreAuthorize("isAuthenticated()")
@GetMapping("/modify/{id}")
public String answerModify(AnswerForm answerForm, @PathVariable("id")Integer id, Principal principal) {
Answer answer = this.answerService.getAnswer(id);
if (!answer.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정 권한이 없습니다.");
}
answerForm.setContent(answer.getContent());
return "answer_form";
}
답변 수정 템플릿 생성하기
/templates/answer_form.html
<html layout:decorate="~{layout}">
<div layout:fragment="content" class="container">
<h5 class="my-3 border-bottom pb-2">답변 수정</h5>
<form th:object="${answerForm}" method="post">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div th:replace="~{form_errors :: formErrorsFragment}"></div>
<div class="mb-3">
<label for="content" class="form-label">내용</label>
<textarea th:field="*{content}" class="form-control" rows="10"></textarea>
</div>
<input type="submit" value="저장하기" class="btn btn-primary my-2">
</form>
</div>
</html>
여기서도 form태그에 action속성을 사용하지 않았다.
생략하면 현재 호출된 URL로 폼이 전송된다.
답변 컨트롤러 재수정하기
POST방식으로 요청되는 URL을 처리하는 메서드를 추가한다.
/answer/AnswerController.java
@PreAuthorize("isAuthenticated()")
@PostMapping("/modify/{id}")
public String answerModify(@Valid AnswerForm answerForm, BindingResult bindingResult,
@PathVariable("id") Integer id, Principal principal) {
if (bindingResult.hasErrors()) {
return "answer_form";
}
Answer answer = this.answerService.getAnswer(id);
if (!answer.getAuthor().getUsername().equals(principal.getName())) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "수정 권한이 업습니다.");
}
this.answerService.modify(answer, answerForm.getContent());
return String.format("redirect:/question/detail/%s", answer.getQuestion().getId());
}
답변 수정을 완료한 후에는 상세 페이지로 리다이렉트 한다.
확인하기
로컬서버 재시작한 후 확인해보자.
'IT > Spring Boot' 카테고리의 다른 글
[Spring Boot] 33. 수정 일시 나타내기 (0) | 2024.05.20 |
---|---|
[Spring Boot] 32. 게시판 답변 삭제 기능 추가하기 (0) | 2024.05.20 |
[Spring Boot] 30. 게시판 질문 삭제 기능 추가하기 (0) | 2024.05.20 |
[Spring Boot] 29. 게시판 질문 수정 기능 추가하기 (0) | 2024.05.20 |
[Spring Boot] 28. 게시판 작성자 기능 구현 (0) | 2024.05.10 |