728x90
반응형
SMALL

답변 수정 기능 추가하기

 

[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());
	}

답변 수정을 완료한 후에는 상세 페이지로 리다이렉트 한다.

 

확인하기

로컬서버 재시작한 후 확인해보자.

수정 버튼 나타남.
내용 수정
내용 수정 완료

728x90
반응형
LIST

+ Recent posts