diff --git a/src/main/java/com/_1/spring_rest_api/entity/QuizSession.java b/src/main/java/com/_1/spring_rest_api/entity/QuizSession.java index 1883e72..773a4d9 100644 --- a/src/main/java/com/_1/spring_rest_api/entity/QuizSession.java +++ b/src/main/java/com/_1/spring_rest_api/entity/QuizSession.java @@ -4,11 +4,14 @@ import com._1.spring_rest_api.entity.base.BaseTimeEntity; import jakarta.persistence.*; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @Entity @Table(name = "QUIZ_SESSION") @@ -31,6 +34,10 @@ public class QuizSession extends BaseTimeEntity { @JoinColumn(name = "quiz_id") private CustomQuiz quiz; + @OneToMany(mappedBy = "quizSession", cascade = CascadeType.ALL) + @Builder.Default + private List userAnswers = new ArrayList<>(); + private Integer currentQuestionIndex; private Boolean completed; @@ -53,6 +60,20 @@ public void changeQuiz(CustomQuiz quiz) { } } + public void addUserAnswer(UserAnswer userAnswer) { + this.userAnswers.add(userAnswer); + if (userAnswer.getQuizSession() != this) { + userAnswer.changeQuizSession(this); + } + } + + public void removeUserAnswer(UserAnswer userAnswer) { + this.userAnswers.remove(userAnswer); + if (userAnswer.getQuizSession() == this) { + userAnswer.changeQuizSession(null); + } + } + public static QuizSession create(User user, CustomQuiz quiz) { if (user == null) { throw new IllegalArgumentException("사용자는 null이 될 수 없습니다"); @@ -80,12 +101,14 @@ public UserAnswer createAnswer(String userAnswerText) { UserAnswer userAnswer = UserAnswer.builder() .user(this.user) .question(currentQuestion) + .quizSession(this) .userAnswer(userAnswerText) .isCorrect(isCorrect) .attemptCount(1) .answeredAt(LocalDateTime.now()) .build(); + this.addUserAnswer(userAnswer); currentQuestion.addUserAnswer(userAnswer); this.user.addUserAnswer(userAnswer); diff --git a/src/main/java/com/_1/spring_rest_api/entity/UserAnswer.java b/src/main/java/com/_1/spring_rest_api/entity/UserAnswer.java index d3de980..c6539f9 100644 --- a/src/main/java/com/_1/spring_rest_api/entity/UserAnswer.java +++ b/src/main/java/com/_1/spring_rest_api/entity/UserAnswer.java @@ -31,6 +31,10 @@ public class UserAnswer extends BaseTimeEntity { @JoinColumn(name = "user_id") private User user; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "quiz_session_id") + private QuizSession quizSession; // 추가 + @Column(name = "user_answer", columnDefinition = "TEXT") private String userAnswer; @@ -58,4 +62,11 @@ public void changeQuestion(Question question) { question.getUserAnswers().add(this); } } + + public void changeQuizSession(QuizSession quizSession) { + this.quizSession = quizSession; + if (quizSession != null && !quizSession.getUserAnswers().contains(this)) { + quizSession.getUserAnswers().add(this); + } + } } \ No newline at end of file diff --git a/src/main/java/com/_1/spring_rest_api/repository/UserAnswerRepository.java b/src/main/java/com/_1/spring_rest_api/repository/UserAnswerRepository.java index 6733bb7..d2ad425 100644 --- a/src/main/java/com/_1/spring_rest_api/repository/UserAnswerRepository.java +++ b/src/main/java/com/_1/spring_rest_api/repository/UserAnswerRepository.java @@ -12,18 +12,6 @@ @Repository public interface UserAnswerRepository extends JpaRepository { - /** - * 특정 사용자의 모든 답변을 조회합니다. - * - * @param userId 사용자 ID - * @return 사용자 답변 목록 - */ - @Query("SELECT a FROM UserAnswer a WHERE a.user.id = :userId ORDER BY a.answeredAt DESC") - List findAllByUserId(@Param("userId") Long userId); - - - @Query("SELECT ua FROM UserAnswer ua WHERE ua.user.id = :userId AND ua.question.id IN :questionIds") - List findByUserIdAndQuestionIdIn( - @Param("userId") Long userId, - @Param("questionIds") Collection questionIds); + @Query("SELECT ua FROM UserAnswer ua WHERE ua.quizSession.id = :sessionId ORDER BY ua.answeredAt ASC") + List findByQuizSessionIdOrderByAnsweredAt(@Param("sessionId") Long sessionId); } \ No newline at end of file diff --git a/src/main/java/com/_1/spring_rest_api/service/QuizSessionQueryServiceImpl.java b/src/main/java/com/_1/spring_rest_api/service/QuizSessionQueryServiceImpl.java index c84ebb8..0e78be5 100644 --- a/src/main/java/com/_1/spring_rest_api/service/QuizSessionQueryServiceImpl.java +++ b/src/main/java/com/_1/spring_rest_api/service/QuizSessionQueryServiceImpl.java @@ -45,30 +45,17 @@ public QuizSessionDetailResponse getSessionDetail(Long sessionId) { QuizSession session = quizSessionRepository.findById(sessionId) .orElseThrow(() -> new EntityNotFoundException("Session not found with id: " + sessionId)); - List userAnswerResponses = getUserAnswersForSession(session); + List userAnswerResponses = getUserAnswersForSession(sessionId); return quizSessionDetailConverter.toDto(session, userAnswerResponses); } - private List getUserAnswersForSession(QuizSession session) { - CustomQuiz quiz = session.getQuiz(); - Long userId = session.getUser().getId(); - - // 퀴즈에 포함된 질문 ID 집합 추출 - Set quizQuestionIds = getQuizQuestionIds(quiz); - - List userAnswers = userAnswerRepository.findByUserIdAndQuestionIdIn( - userId, quizQuestionIds); + private List getUserAnswersForSession(Long sessionId) { + List userAnswers = userAnswerRepository.findByQuizSessionIdOrderByAnsweredAt(sessionId); // DTO로 변환 return userAnswers.stream() .map(userAnswerConverter::toDto) .collect(Collectors.toList()); } - - private Set getQuizQuestionIds(CustomQuiz quiz) { - return quiz.getQuizQuestionMappings().stream() - .map(mapping -> mapping.getQuestion().getId()) - .collect(Collectors.toSet()); - } }