중복 아이디 체크도 이와 같은 문제가 발생한다고 언급
INSERT
쿼리만을 통해 게시물 별 좋아요/싫어요를 반영할 때 사용자가 처음으로 좋아요 또는 싫어요를 누를 때는 문제가 없었지만 그 다음 좋아요 또는 싫어요를 누를 때는 같은 문제가 발생했다.
org.springframework.dao.DuplicateKeyException
SQL [INSERT INTO forum.board_vote (board_seq, board_type_seq, member_seq, is_like, reg_dtm) VALUES(?, ?, ?, ?, DATE_FORMAT(NOW(), '%Y%m%d%H%i%s')); ];
Duplicate entry '1-1-1' for key 'board_vote.PRIMARY';
board_vote
의 pk
는 (board_seq, board_type_seq, member_seq)
와 같다. 사용자가 좋아요/싫어요를 처음이 아닌 경우 클릭할 때 이미 존재하는 pk
로 또 다시 INSERT
를 하려 하기 때문에 위와 같은 에러가 발생하는 것이다.
위와 같은 에러가 발생하는 경우를 service
계층에서 try-catch
문으로 잡아 INSERT
대신 UPDATE
로 쿼리를 실행했다.
public int vote(Integer boardSeq, Integer boardTypeSeq, Integer memberSeq, String isLike) {
try { // 처음 좋아요/싫어요를 하는 경우
return boardDao.addVote(boardSeq, boardTypeSeq, memberSeq, isLike);
} catch (DuplicateKeyException dke) { // 좋아요/싫어요가 이미 있는 경우
// 같은 좋아요 또는 싫어요를 한번 더 눌렀을 경우
if (boardDao.cntVote(boardSeq, boardTypeSeq, memberSeq, isLike) == 1) {
boardDao.deleteVote(boardSeq, boardTypeSeq, memberSeq);
return 2;
}
// 좋아요 -> 싫어요 OR 싫어요 -> 좋아요
return boardDao.updateVote(boardSeq, boardTypeSeq, memberSeq, isLike);
}
}