[Spring Boot 게시판] 24일차

김정현·2022년 10월 28일
0

SPRINGBOOT게시판

목록 보기
24/36

actorCanMakeReaction 리턴 타입 변경, 좋아요 취소버튼, 싫어요 취소버튼 구현

1) articleController에서 actorCanMakeReaction 사용

	ResultData actorCanMakeReactionRd = reactionPointService.actorCanMakeReaction(rq.getLoginedMemberId(),
				"article", id);

		model.addAttribute("actorCanMakeReactionRd", actorCanMakeReactionRd);
		model.addAttribute("actorCanMakeReaction", actorCanMakeReactionRd.isSuccess());

		if (actorCanMakeReactionRd.getResultCode().equals("F-2")) {
			int sumReactionPointByMemberId = (int) actorCanMakeReactionRd.getData1();

			if (sumReactionPointByMemberId > 0) {
				model.addAttribute("actorCanCancelGoodReaction", true);
			} else {
				model.addAttribute("actorCanCancelBadReaction", true);
			}
		}
  • reactionPointService.actorCanMakeReaction : 좋아요/싫어요 할수있는지 여부를 ResultData로 반환
  • actorCanMakeReactionRd.getResultCode().equals("F-2") : 좋아요/싫어요 할수있는지 결과가 F-2, 즉 할수없을때
  • sumReactionPointByMemberId 를통해
  • 리턴 값이 -1이라면 좋아요 actorCanCancelBadReaction(싫어요 취소 가능) true, 1이라면 actorCanCancelGoodReaction(좋아요 취소 가능한지) true를
  • detail.jsp에서 해당 데이터를 바탕으로 버튼 노출을 하기위해 model객체에 addAttribute한다.
  • 즉, 싫어요 리액션을 했다면 싫어요 취소 버튼이 노출되고 좋아요 버튼은 비활성화 버튼이 노출 되야한다.
  • 반대로 좋아요 리액션을 했다면 좋아요 취소 버튼이 노출되고 싫어요 버튼은 비활성화 버튼이 노출 되야한다.

2) reactionPointService.actorCanMakeReaction()

		public ResultData actorCanMakeReaction(int actorId, String relTypeCode, int id) {
		// 로그인 안한상태
		if (actorId == -1) {
			return ResultData.from("F-1", "로그인 후 이용해주세요");
		}		
		int sumReactionPointByMemberId = reactionPointRepository.getSumReactionPointByMemberId(actorId, relTypeCode, id);
		if (sumReactionPointByMemberId != 0) {
			return ResultData.from("F-2", "리액션을 할 수 없습니다", "sumReactionPointByMemberId", sumReactionPointByMemberId);
		}
		return ResultData.from("S-1", "리액션을 할 수 있습니다", "sumReactionPointByMemberId", sumReactionPointByMemberId);
	}
  • 좋아요/싫어요 할수있는지 여부를 반환하는 메소드
  • 기존에는 boolean타입을 반환 했으나 좋아요/싫어요 할수있는지 여부sumReactionPointByMemberId을 ResultData로 반환
  • sumReactionPointByMemberId != 0 : 회원이 남긴 리액션포인트가 0이 아니라면, 이미 리액션을 한경우이므로 리액션을 할수없다.

3) detail.jsp의 리액션 좋아요 취소 버튼

<c:if test="${actorCanCancelGoodReaction}">
    <span>&nbsp;</span>
    <a href="/usr/reactionPoint/doGoodReaction?relTypeCode=article&relId=${param.id}&replaceUri=${rq.encodedCurrentUri}"
       class="btn btn-outline btn-xs">좋아요 👍</a>
    <span>&nbsp;</span>
    <a onclick="alert(this.title); return false;" title="좋아요를 취소해주세요" href="#" class="btn btn-outline btn-xs">싫어요
        👎</a>
</c:if>
  • 좋아요 리액션을 한 경우에 나타는 버튼
  • 싫어요버튼 을 클릭시 기능이 동작하지 않고 경고창을 띄움

4) 좋아요 취소 버튼 클릭시

	@RequestMapping("/usr/reactionPoint/doCancelGoodReaction")
	@ResponseBody
	public String doCancelGoodReaction(String relTypeCode, int relId, String replaceUri) {

		ResultData actorCanMakeReactionRd = reactionPointService.actorCanMakeReaction(rq.getLoginedMemberId(),
				relTypeCode, relId);

		if (actorCanMakeReactionRd.isSuccess()) {
			return rq.jsHistoryBackOnView("좋아요 버튼이 클릭되지 않았습니다.");
		}

		reactionPointService.deleteGoodReactionPoint(rq.getLoginedMemberId(), relTypeCode, relId);
		return rq.jsReplace("좋아요 취소!", replaceUri);
	}
  • 좋아요 취소 버튼 클릭시 해당 메소드가 실행
  • actorCanMakeReactionRd.isSuccess() : 취소 버튼을 눌렀다면 actorCanMakeReactionRd는 false값을 반환(이미 좋아요가 선택됬기때문에)
  • if (actorCanMakeReactionRd.isSuccess()) : 브라우저에서 버튼클릭이외에 직접 uri작성하여 이동하는 경우
  • 즉, 좋아요가 선택되지 않았음에도 해당 uri로 접근을 하는경우를 막아야한다. 좋아요 선택하지 않았으면 actorCanMakeReactionRd.isSuccess()는 true

간략하게 설명

  • 싫어요기능도 좋아요 기능과 방식은 동일

  • 로그인이 안됬을경우, 좋아요 /싫어요( 선택되지 않은 상태 ) 버튼이 노출 X

  • 로그인이 된경우, 좋아요/ 싫어요( 선택되지 않은 상태 ) 버튼 노출 O

  • 좋아요 버튼을 눌렀을 경우 싫어요 버튼은 비활성화되고 좋아요 버튼은 좋아요취소버튼으로 노출

  • 싫어요 버튼을 눌렀을 경우 좋아요 버튼은 비활성화되고 싫어요 버튼은 싫어요취소버튼으로 노출

  • 각각 버튼클릭시 DB에도 업데이트

0개의 댓글