질문 추천 기능
Question
@ManyToMany
Set<SiteUser> voter;
Set은 중복을 허용하지 않는 자료형이다.
Answer
@ManyToMany
Set<SiteUser> voter;
h2-console확인
QUESTION_VOTER, ANSWER_VOTER 테이블이 생성된 것을 확인할 수 있다.
이렇게 @ManyToMany 관계로 속성을 생성하면 새로운 테이블을 생성하여 데이터를 관리한다.
테이블에는 서로 연관된 엔티티의 고유번호(id) 2개가 프라이머리 키로 되어 있기 때문에 다대다(N:N) 관계가 성립하는 구조이다.
https://blog.naver.com/drv982/222922939469
<a
onclick="return confirm('추천 하시겠습니까?')"
th:href="@{|/question/vote/${question.id}|}"
class="recommend btn btn-sm btn-outline-secondary vote"
>
추천
<span
class="badge rounded-pill bg-success"
th:text="${#lists.size(question.voter)}"
></span>
</a>
QuestionService
//추천인 저장
public void vote(Question question, SiteUser siteUser) {
question.getVoter().add(siteUser);
qRepo.save(question);
}
QuestionController
// 질문 추천
@PreAuthorize("isAuthenticated()")
@GetMapping("/vote/{id}")
public String questionVote(Principal principal,@PathVariable("id") int id) {
Question question = qService.getQuestion(id);//질문 id로 조회
SiteUser siteUser = uService.getUser(principal.getName());//현재 로그인 중인 유저정보 조회
qService.vote(question, siteUser);
return String.format("redirect:/question/detail/%s", id);
}
답변 추천 기능
question_detail.html
에도 추천 버튼 추가함
<a
onclick="return confirm('정말로 추천하시겠습니까?')"
th:href="@{|/answer/vote/${answer.id}|}"
class="recommend btn btn-sm btn-outline-secondary"
>
추천
<span
class="badge rounded-pill bg-success"
th:text="${#lists.size(answer.voter)}"
></span>
</a>
AnswerService
//추천인 저장
public void vote(Answer answer, SiteUser siteUser) {
answer.getVoter().add(siteUser);
aRepo.save(answer);
}
AnswerController
//답변 추천기능
@PreAuthorize("isAuthenticated()")
@GetMapping("/vote/{id}")
public String answerVote(Principal principal, @PathVariable("id") int id) {
Answer answer = aService.getAnswer(id);
SiteUser siteUser = uService.getUser(principal.getName());
aService.vote(answer, siteUser);
return String.format("redirect:/question/detail/%s", answer.getQuestion().getId());
}
아까 set 자료형으로 작성하여서 중복 추천은 불가능하다.
추천 한 번 더 눌러봄
추천 수가 늘어나지않음
번외로 그러면 한 번더 추천을 클릭 시
추천을 취소하는 기능을 추가한다.
QuestionService
//추천인 저장
//이미 추천을 했으면 제거하고 없으면 추천한다.
public void vote(Question question, SiteUser siteUser) {
Set<SiteUser> list = question.getVoter();
boolean removeVote = false; //이미 추천했습니까?
for(SiteUser user:list) {
if(user.getUsername().equals(siteUser.getUsername()))
list.remove(user); // 추천리스트에서 제거함
removeVote = true; //이미 추천했음
}
if(!removeVote) {
question.getVoter().add(siteUser);// //Set(SiteUser>리스트에 유저 추가
}
qRepo.save(question); //추천 유저 업데이트
}
추천 취소 완료
AnswerService 답변도 질문과 동일하게 추천 취소 기능 추가
//추천인 저장
//이미 추천을 했으면 제거하고 없으면 추천한다.
public void vote(Answer answer, SiteUser siteUser) {
Set<SiteUser> list = answer.getVoter();
boolean removeVote = false; //이미 추천했습니까?
for(SiteUser user:list) {
if(user.getUsername().equals(siteUser.getUsername()))
list.remove(user); // 추천리스트에서 제거함
removeVote = true; //이미 추천했음
}
if(!removeVote) {
answer.getVoter().add(siteUser);// //Set(SiteUser>리스트에 유저 추가
}
aRepo.save(answer); //추천 유저 업데이트
}
'BACKEND > SpringBoot' 카테고리의 다른 글
스프링부트 게시판 만들기 강의 (0) | 2023.11.13 |
---|---|
h2 -> MySQL로 DB변경하기 (0) | 2023.11.13 |
수정일시 표시하기( 질문, 답변) (1) | 2023.11.13 |
답변 삭제 (0) | 2023.11.13 |
답변 수정 (0) | 2023.11.13 |