728x90
반응형
SMALL
엔티티에 속성 추가하기
질문이나 답변을 추천한 사요자를 저장해야하므로 엔티티에 속성을 추가해야한다.
/qeustion/Question.java
...
//관계주입(추천)
@ManyToMany
Set<SiteUser> voterSet;
/answer/Answer.java
//관계주입(추천)
@ManyToMany
Set<SiteUser> voterSet;
서버를 재시작하고 콘솔을 확인해보자.

질문 추천 기능 생성하기
추천버튼을 추가하자
/templates/question_detail.html
...
<!--추천, 수정 및 삭제 버튼-->
<div class="my-3">
<!--추천 버튼-->
<a href="javascript:void(0);" class="recommend btn btn-sm btn-outline-secondary"
th:data-uri="@{|/question/vote/${question.id}|}">추천
<span class="badge rounded-pill bg-success"
th:text="${#lists.size(question.voter)}"></span>
</a>
lists.size메서드를 통해 추천 수를 볼 수 있다.
추천 버튼을 클릭하면 javascript:void(0)으로 되어 있어서 아무런 동작을 하지 않는다.
대신 자바스크립트를 통해 data-uri로 이동하게 하고, 메시지 확인창으로 한 번 나타나도록 할 것이다.
/templates/question_detail.html
...
const recommend_elements = document.getElementsByClassName("recommend");
Array.from(recommend_elements).forEach(function(element){
element.addEventListener('click', function(){
if(confirm("정말로 추천하시겠습니까?")){
location.href = this.dataset.uri;
}
})
})
</script>
기능을 서비스에 추가하자.
/question/QuestionService.java
...
public void vote(Question question, SiteUser siteUser) {
question.getVoter().add(siteUser);
this.questionRepostiory.save(question);
}
추천을 눌럿을 때 GET방식으로 작동하는 URL을 처리하도록 컨트롤러를 수정하자.
/question/QuestionController.java
@PreAuthorize("isAuthenticated()")
@GetMapping("/vote/{id}")
public String questionVote(Principal principal, @PathVariable("id") Integer id) {
Question question = this.questionService.getQuestion(id);
SiteUser siteUser = this.userService.getUser(principal.getName());
this.questionService.vote(question, siteUser);
return String.format("redirect:/question/detail/%s", id);
}



답변 추천 기능 생성하기
위와 똑같으니 코드만 보자
/templates/question_detail.html
....
<!-- 추천, 수정 및 삭제 버튼 -->
<div class="my-3">
<!--추천 버튼-->
<a href="javascript:void(0);" class="recommend btn btn-sm btn-outline-secondary"
th:data-uri="@{|/answer/vote/${answer.id}|}">추천
<span class="badge rounded-pill bg-success"
th:text="${#lists.size(answer.voter)}"></span>
</a>
/answer/AnswerService.java
...
public void vote(Answer answer, SiteUser siteUser) {
answer.getVoter().add(siteUser);
this.answerRepository.save(answer);
}
/answer/AnswerController.java
...
@PreAuthorize("isAuthenticated()")
@GetMapping("/vote/{id}")
public String questionVote(Principal principal, @PathVariable("id") Integer id) {
Answer answer = this.answerService.getAnswer(id);
SiteUser siteUser = this.userService.getUser(principal.getName());
this.answerService.vote(answer, siteUser);
return String.format("redirect:/question/detail/%s", answer.getQuestion().getId());
}



728x90
반응형
LIST
'IT > Spring Boot' 카테고리의 다른 글
[Spring Boot] 36. 마크 다운 적용하기 (0) | 2024.05.21 |
---|---|
[Spring Boot] 35. 앵커 기능 추가하기(스크롤 자동 이동) (0) | 2024.05.21 |
[Spring Boot] 33. 수정 일시 나타내기 (0) | 2024.05.20 |
[Spring Boot] 32. 게시판 답변 삭제 기능 추가하기 (0) | 2024.05.20 |
[Spring Boot] 31. 게시판 답변 수정 기능 추가하기 (0) | 2024.05.20 |