본문 바로가기

Spring

항해 99 실전 프로젝트 - 트러블 (Optional)

 이번에 있었던 문제 과정이다. 

 이번 프로젝트에서 담당한 부분 중 하나인 퀴즈에서 문제가 있다는 소식이 갑자기 새벽에 들려왔다. 

" ??님 이거 퀴즈를 여러개 못만드는 데요?"

 

 때문에 즉시 노트북을 키고 코드를 봤다. 바로 작동을 돌려보니 문제가 생기는 지점은

Optional<Quiz> quizOptional = quizRepository.findByMemberId(member.getId());
if(quizOptional.isEmpty()){
    MemberDetail memberDetail = member.getMemberDetail();
    memberDetail.gainMileagePoint(100);
    memberDetailRepository.save(memberDetail);
}

이 지점이였다. 해당 값에서 findByMemberId로 찾아오는 값이 unique result를 반환하지 못한다고 하여 오류가 생기는 것이였다. 해당 위 코드에서 목표하는 로직은 유저가 이 전에 생성한 퀴즈가 없다면 100의 마일리지를 얻는 서비스를 만든 것이다. 그러나 오류가 생기는 부분인 findBy에서 3번째  퀴즈를 만드는 당시에 2개의 퀴즈를 가지고 있기 때문에 Optional이 퀴즈 2가지를 반환한다는 문제로 인해 오류가 발생한 것이다. 즉,  하나의 객체만을 찾는 findBy에서 2가지 이상의 값이 나오는 것이 문제였다. 

이를

Optional<Quiz> quizOptional = quizRepository.findFirstByMemberId(member.getId());

이와 같은 방식으로 가장 먼저 찾을 수 있는 값(=> 가장 먼저 찾을 수 있는 단일 값 하나를 잡아줌)으로 변경을 통해 해결하였다.