퀴즈 문제를 만들고 문제를 푸는 사이트를 만드는데 

퀴즈 상세조회를 클릭하면 답안이 계속 반복해서 저장되는 현상이 생겼다.

 

<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로 한번 저장 후 리셋 시켜주는 작업을 추가하였더니 해결되었다 ㅎㅎ

 

+ Recent posts