์ง๋ฌธ ์ถ์ฒ ๊ธฐ๋ฅ
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
์ง๋ฌธ ์ถ์ฒ
์ํฐํฐ ๋ณ๊ฒฝ ์ง๋ฌธ, ๋ต๋ณ์ ์ถ์ฒ์ ์ถ์ฒํ ์ฌ๋(SiteUser ๊ฐ์ฒด)์ ์ง๋ฌธ, ๋ต๋ณ ์ํฐํฐ์ ์ถ๊ฐํด์ผ ํ๋ค. Q...
blog.naver.com

<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๋ณ๊ฒฝํ๊ธฐ (1) | 2023.11.13 |
| ์์ ์ผ์ ํ์ํ๊ธฐ( ์ง๋ฌธ, ๋ต๋ณ) (2) | 2023.11.13 |
| ๋ต๋ณ ์ญ์ (1) | 2023.11.13 |
| ๋ต๋ณ ์์ (0) | 2023.11.13 |