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

+ Recent posts