diff --git a/src/main/java/com/_1/spring_rest_api/entity/CustomQuiz.java b/src/main/java/com/_1/spring_rest_api/entity/CustomQuiz.java index 5702dea..8c4060b 100644 --- a/src/main/java/com/_1/spring_rest_api/entity/CustomQuiz.java +++ b/src/main/java/com/_1/spring_rest_api/entity/CustomQuiz.java @@ -90,8 +90,14 @@ public void addQuestion(Question question) { return; // 이미 추가된 질문이면 무시 } - // 정적 팩토리 메서드를 통해 매핑 생성 및 양방향 연관관계 설정 - QuizQuestionMapping.create(this, question); + // 매핑 생성 및 양방향 연관관계 설정 + QuizQuestionMapping mapping = QuizQuestionMapping.builder() + .quiz(this) + .question(question) + .build(); + + this.quizQuestionMappings.add(mapping); + question.getQuizQuestionMappings().add(mapping); // 질문 수 증가 this.updateTotalQuestions(this.totalQuestions + 1); diff --git a/src/main/java/com/_1/spring_rest_api/entity/QuizQuestionMapping.java b/src/main/java/com/_1/spring_rest_api/entity/QuizQuestionMapping.java index eb2af5a..e0ad3f7 100644 --- a/src/main/java/com/_1/spring_rest_api/entity/QuizQuestionMapping.java +++ b/src/main/java/com/_1/spring_rest_api/entity/QuizQuestionMapping.java @@ -27,11 +27,4 @@ public class QuizQuestionMapping extends BaseTimeEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "question_id") private Question question; - - public static QuizQuestionMapping create(CustomQuiz quiz, Question question) { - return QuizQuestionMapping.builder() - .quiz(quiz) - .question(question) - .build(); - } } \ No newline at end of file diff --git a/src/main/java/com/_1/spring_rest_api/service/QuizCommandServiceImpl.java b/src/main/java/com/_1/spring_rest_api/service/QuizCommandServiceImpl.java index e7a37f0..9c1e1b8 100644 --- a/src/main/java/com/_1/spring_rest_api/service/QuizCommandServiceImpl.java +++ b/src/main/java/com/_1/spring_rest_api/service/QuizCommandServiceImpl.java @@ -9,6 +9,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.*; +import java.util.stream.Collectors; @Service @Transactional @@ -42,7 +43,7 @@ public Long createQuiz(CreateQuizRequest request) { connectWeeksToQuiz(request.getWeekIds(), savedQuiz); // 질문 처리 - processQuestions(request, savedQuiz); + processQuestionsWithFreshEntities(request, savedQuiz); return savedQuiz.getId(); } @@ -98,43 +99,33 @@ private void connectWeeksToQuiz(List weekIds, CustomQuiz quiz) { } // 질문 처리 로직 - private void processQuestions(CreateQuizRequest request, CustomQuiz quiz) { - Set questions = new HashSet<>(); - - // 주차 기반 질문 선택 - if (request.getWeekIds() != null && !request.getWeekIds().isEmpty()) { - // 선택된 모든 주차의 질문 가져오기 - List weekQuestions = getQuestionList(request); - - // 질문 수 제한이 있는 경우 랜덤 선택 - weekQuestions = getRandomQuestionsIfHasLimit(request, weekQuestions); - - questions.addAll(weekQuestions); + private void processQuestionsWithFreshEntities(CreateQuizRequest request, CustomQuiz quiz) { + if (request.getWeekIds() == null || request.getWeekIds().isEmpty()) { + return; } - // 질문 중복 제거 및 퀴즈에 추가 - for (Question question : questions) { - quiz.addQuestion(question); + // 👇 week별로 질문 ID만 수집 + List questionIds = new ArrayList<>(); + for (Long weekId : request.getWeekIds()) { + List weekQuestionIds = questionRepository.findAllByWeekId(weekId) + .stream() + .map(Question::getId) + .toList(); + questionIds.addAll(weekQuestionIds); } - customQuizRepository.save(quiz); - } - - private static List getRandomQuestionsIfHasLimit(CreateQuizRequest request, List weekQuestions) { + // 랜덤 선택 if (request.getQuestionCount() != null && request.getQuestionCount() > 0 && - request.getQuestionCount() < weekQuestions.size()) { - // 무작위 선택 - Collections.shuffle(weekQuestions); - weekQuestions = weekQuestions.subList(0, request.getQuestionCount()); + request.getQuestionCount() < questionIds.size()) { + Collections.shuffle(questionIds); + questionIds = questionIds.subList(0, request.getQuestionCount()); } - return weekQuestions; - } - private List getQuestionList(CreateQuizRequest request) { - List weekQuestions = new ArrayList<>(); - for (Long weekId : request.getWeekIds()) { - weekQuestions.addAll(questionRepository.findAllByWeekId(weekId)); + List freshQuestions = questionRepository.findAllById(questionIds); + + for (Question question : freshQuestions) { + quiz.addQuestion(question); } - return weekQuestions; } + }