개인의 좋아요 기록을 남기는 테이블만 있으면 게시글의 좋아요 개수는 count만 하면 되는 거라니..! 재밌었땅 ㅎㅎ 수업시간에 구현한 방식은 게시글 상세에 들어가야만 나의 좋아요 여부 확인이 가능한데, 게시글 목록에서 내가 좋아요한 글을 확인하는 것도 해봐야겠음
create table member_board_like(
member_id references member(member_id) on delete cascade not null,
board_no references board(board_no) on delete cascade not null,
like_time date default sysdate not null,
primary key(member_id, board_no)
);
String memberId = (String)session.getAttribute(SessionConstant.ID);
if(memberId != null) {
MemberBoardLikeDto likeDto = new MemberBoardLikeDto();
likeDto.setMemberId(memberId);
likeDto.setBoardNo(boardNo);
model.addAttribute("isLike", boardLikeDao.check(likeDto));
}
@GetMapping("/like")
public String boardLike(@RequestParam int boardNo,
HttpSession session,
RedirectAttributes attr) {
String memberId = (String)session.getAttribute(SessionConstant.ID);
MemberBoardLikeDto dto = new MemberBoardLikeDto();
dto.setMemberId(memberId);
dto.setBoardNo(boardNo);
if(boardLikeDao.check(dto)) {//좋아요 상태면
boardLikeDao.delete(dto); //좋아요 지우기
}else {
boardLikeDao.insert(dto); //좋아요 등록
}
attr.addAttribute("boardNo", boardNo);
return "redirect:/board/detail";
}
<!-- 좋아요 -->
<c:if test="${isLike == null}">
<div>
<a href="/member/login">♡</a>
<br>
좋아요를 누르려면 로그인하세요
</div>
</c:if>
<c:if test="${isLike == true}">
<div>
<a href="like?boardNo=${dto.boardNo}">♥</a>
<br>
좋아요 취소
</div>
</c:if>
<c:if test="${isLike == false}">
<div>
<a href="like?boardNo=${dto.boardNo}">♡</a>
<br>
좋아요
</div>
</c:if>
select count(*)
from member_board_like
where board_no = ?;
model.addAttribute("likeCount", boardLikeDao.count(boardNo));
내역
이 필요하면 join 해야 함@Override
public void refresh(int boardNo) {
String sql = "update board "
+ "set board_like = ("
+ "select count(*) "
+ "from member_board_like "
+ "where board_no = ?) "
+ "where board_no = ?";
Object[] param = {boardNo, boardNo}; //홀더 개수만큼 파라미터 사용
jdbcTemplate.update(sql, param);
}
boardLikeDao.refresh(boardNo); //좋아요 수 갱신