woowacourse-teams / 2022-nae-pyeon

내 마음을 편지로, 내 편 💌
https://naepyeon.site
47 stars 7 forks source link

[BE] 메세지 좋아요의 동시성 이슈를 해결한다. #631

Open asebn1 opened 2 years ago

asebn1 commented 2 years ago

기능 상세

image

메세지 좋아요에 엄청난 연타를 해보았을 때 다음과같은 이슈가 발생하였습니다.

중복된 데이터가 쌓였습니다!

image

기존 코드

public MessageLikeResponseDto likeMessage(Long memberId, Long rollingpaperId, Long messageId) {
        // 메세지 좋아요 대상 "메세지"를 찾는다.
    final Message message = messageRepository.findById(messageId)
            .orElseThrow(() -> new NotFoundMessageException(messageId));
        // "메세지 좋아요" 테이블에 존재하면 에러를 던진다.
    if (messageLikeRepository.existsByMemberIdAndMessageId(memberId, messageId)) {
        throw new InvalidLikeMessageException(messageId, messageId);
    }
        // 메세지 좋아요 추가
    message.like();
    messageLikeRepository.save(new MessageLike(memberId, rollingpaperId, messageId));
    return new MessageLikeResponseDto(message.getLikes(), true);
}
  1. 메세지 좋아요 대상 "메세지"를 찾습니다.
  2. "메세지 좋아요" 테이블에 기록이 존재하면 에러를 던집니다.
  3. 메세지 좋아요를 추가한다.