본문 바로가기

Spring

항해 99 - 트러블 슈팅 Optional(Likes)

 금일의 작업 중 Likes 부분에서 오류가 발생하였다. 그 이유를 둘러보니 그냥 로직이 이상했다... 

likesRepositoy.findByMemberId(Long) // 이와 같은 부분에서 오류가 발생하였다.

 이 부분이 문제가 된 이유는 해당 코드를 Optional로 사용하고 있는데 MemberId로 찾아오는 값이 단일 값을 찾아오지 못한다는 저번고 같은 오류를 발생시키고 있는 것이였다. 

 

 이 이유는 기초적으로 봤을 때, 1번 퀴즈에 좋아요를 누르고 2번 퀴즈에 좋아요를 누를 경우 까지만 가능하고 3번째 누를 때, findBy로 찾아오는 값이 유니크 값이 아닐 때 발생하는 지난번과 같은 오류가 발생하는 구조였다. 근데 진짜 문제는 이게 해당 하는 것이 아니였다. 즉, 위에 해당하는 코드는 문제가 맞지만, 진짜 문제는 로직 자체가 문제인 것이였다. 

if (likesRepository.findByMemberId(member.getId()).isPresent()){
    likesNum--;
    quiz.pushLikes(likesNum);
    likesRepository.delete(likesRepository.findByMemberId(member.getId()).get);
    return new MsgResponse("좋아요를 취소했습니다! ");
}

해당 로직이 문제였는데, 이 로직을 보면 잘못된 부분은 Member 단일값으로 Likes레포에서 조회하기 때문에 원하는 값이 조회가 되는거이 아니라 기존의 다른 곳에 누른 좋아요가 삭제되고 해당하는 퀴즈의 좋아요가 차감된다는 것입니다. 즉, 

아래와 같은 플로우가 완성됩니다. 

  • 첫 시도에서 좋아요가 정상적으로 작동 
  • 다른 게시글의 좋아요를 누른 때, "좋아요를 취소했습니다!" 문구와 함께 - 1 적용
  • 3 번째 좋아요를 누를 시 정삭적으로 작동

즉, 1번 누르면 등록, 2번 누르면 삭제인 것은 맞는데 어떤 퀴즈이든 상관없이 된다는 것이 문제였다. 때문에 이를 아래와 같은 코드로 변경하였다. 

 //해당 퀴즈와 멤버를 통해 찾아옴 
 Optional<Likes> likesOptional = likesRepository.findByMemberIdAndQuiz(member.getId(),quiz);
 // 즉, 멤버 단일만 찾은 것을 해당 퀴즈에만 해당하게 수정함 
if (likesOptional.isPresent()){
    likesNum--;
    quiz.pushLikes(likesNum);
    likesRepository.delete(likesOptional.get());
    return new MsgResponse("좋아요를 취소했습니다! ");
}

  이를 통해 해당 퀴즈를 좋아요를 누르는 것을 인식 하도록 코드를 수정하였다. 

 

결국 이번 트러블을 요약한다면 기존의 코드를 바꾸는 과정에서 잘못된 로직으로 수정되었고, 그로인해 기존에 정상적으로 작동했던 좋아요 기능으로 인해 동일한 memberId가 여러개 존재했으며 이로 인해 단일값을 조회하지 못하는 오류가 Optional에서 발생한 것이다. 즉, 내가 체크를 못해서 문제를 만든 것이다. 

 

 이로인해 마음 고생을 심하게 했을 우리 프론트 개발자님에게 죄송하다는 말씀을 올리며 글을 마치겠다...