코딩 공부
미니프로젝트_트러블슈팅(답안 중복 나옴)
챠나
2023. 5. 7. 23:30
퀴즈 문제를 만들고 문제를 푸는 사이트를 만드는데
퀴즈 상세조회를 클릭하면 답안이 계속 반복해서 저장되는 현상이 생겼다.
<QuizService>
public List<String> answerList = new ArrayList<>();
// 퀴즈 등록
@Transactional
public BasicResponseDto<?> register(QuizRequestDto quizRequestDto, User user) {
quizRepository.save(new Quiz(quizRequestDto, user.getUserId()));
return BasicResponseDto.setSuccess("퀴즈 등록 성공!", null);
}
// 개별 퀴즈 조회
@Transactional(readOnly = true)
public SolvingQuizResponseDto findById(Long id, User user) {
Quiz quiz = quizRepository.findById(id).orElseThrow(()-> new IllegalArgumentException("해당 퀴즈가 없습니다."));
answerList.add(quiz.getCorrect());
if (quiz.getIncorrect1()!=null) {answerList.add(quiz.getIncorrect1());}
if (quiz.getIncorrect2()!=null) {answerList.add(quiz.getIncorrect2());}
if (quiz.getIncorrect3()!=null) {answerList.add(quiz.getIncorrect3());}
if(answerList.size() > 2) {
Collections.shuffle(answerList);
}
// SolvingQuizResponseDto solvingQuizResponseDto = new SolvingQuizResponseDto(id, quiz.getTitle(), quiz.getContent(), answerList, user.getUserId());
//
// return BasicResponseDto.setSuccess(null, solvingQuizResponseDto);
return new SolvingQuizResponseDto(id, quiz.getTitle(), quiz.getContent(), answerList, user.getUserId());
}
코드를 좀 더 깔끔하고 직관적이게 적고 싶어 계속해서 리펙토링을 하다 보니 어느 한 곳이 잘못된것같았다.
@Transactional(readOnly = true)
public SolvingQuizResponseDto findById(Long id, User user) {
Quiz quiz = quizRepository.findById(id).orElseThrow(()-> new IllegalArgumentException("해당 퀴즈가 없습니다."));
answerList.clear(); // 중복으로 저장되는 것 방지
answerList.add(quiz.getCorrect());
if (quiz.getIncorrect1()!=null) {answerList.add(quiz.getIncorrect1());}
if (quiz.getIncorrect2()!=null) {answerList.add(quiz.getIncorrect2());}
if (quiz.getIncorrect3()!=null) {answerList.add(quiz.getIncorrect3());}
if(answerList.size() > 2) {
Collections.shuffle(answerList);
}
answerList 를 저장은 계속하고 리셋이 되지 않은 문제였다.
그래서 clear로 한번 저장 후 리셋 시켜주는 작업을 추가하였더니 해결되었다 ㅎㅎ