12. 게시글 좋아요
✅ 좋아요 여부 확인
1번 게시판 - 가장 최근 게시글 DB 추가
INSERT INTO "BOARD_LIKE"
VALUES(1, 1997);
Board 컨트롤러 - boardDetail() 메서드 일부 구문 추가
- Spring 스펙업으로 클래스에 @SessionAttributes("{loginMember}") 생략 가능

board-mapper.xml 서브쿼리 추가

Board DTO에 필드 추가
private int likeCheck;
boardDetail.html 좋아요 부분 th 및 삼항연산자 사용


✅ 좋아요 체크/해제/카운트
boardDetail.html 하단에 구문 추가
<script th:inline="javascript">
const loginMemberNo = "로그인 회원 번호";
const boardNo = "게시글 번호";
let likeCheck = "좋아요 여부";
</script>
<script src="/js/board/boardDetail.js"></script>
boardDetail.js
document.querySelector("#boardLike").addEventListener("click", e => {
if(loginMemberNo == null) {
alert("로그인 후 이용해 주세요.");
return;
}
const obj = {
"memberNo" : loginMemberNo,
"boardNo" : boardNo,
"likeCheck" : likeCheck
};
fetch("/board/like", {
method : "POST",
headers : {"Content-Type" : "application/json"},
body : JSON.stringify(obj)
})
.then(resp => resp.text())
.then(count => {
if(count == -1) {
console.log("좋아요 처리 실패");
return;
}
likeCheck = likeCheck == 0 ? 1 : 0;
e.target.classList.toggle("fa-regular");
e.target.classList.toggle("fa-solid");
e.target.nextElementSibling.innerText = count;
});
});
boardController
@ResponseBody
@PostMapping("like")
public int boardLike(@RequestBody Map<String, Integer> map) {
return service.boardLike(map);
}
boardServiceImpl
@Override
public int boardLike(Map<String, Integer> map) {
int result = 0;
if(map.get("likeCheck") == 1) {
result = mapper.deleteBoardLike(map);
} else {
result = mapper.insertBoardLike(map);
}
if(result > 0) {
return mapper.selectLikeCount(map.get("boardNo"));
}
return -1;
}
board-mapper.xml
<delete id="deleteBoardLike">
DELETE FROM "BOARD_LIKE"
WHERE MEMBER_NO = #{memberNo}
AND BOARD_NO = #{boardNo}
</delete>
<insert id="insertBoardLike">
INSERT INTO "BOARD_LIKE" (MEMBER_NO, BOARD_NO)
VALUES(#{memberNo}, #{boardNo})
</insert>
<select id="selectLikeCount">
SELECT COUNT(*) FROM "BOARD_LIKE"
WHERE BOARD_NO = #{boardNo}
</select>
