Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions src/main/java/com/_1/spring_rest_api/entity/CustomQuiz.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

@Service
@Transactional
Expand Down Expand Up @@ -42,7 +43,7 @@ public Long createQuiz(CreateQuizRequest request) {
connectWeeksToQuiz(request.getWeekIds(), savedQuiz);

// 질문 처리
processQuestions(request, savedQuiz);
processQuestionsWithFreshEntities(request, savedQuiz);

return savedQuiz.getId();
}
Expand Down Expand Up @@ -98,43 +99,33 @@ private void connectWeeksToQuiz(List<Long> weekIds, CustomQuiz quiz) {
}

// 질문 처리 로직
private void processQuestions(CreateQuizRequest request, CustomQuiz quiz) {
Set<Question> questions = new HashSet<>();

// 주차 기반 질문 선택
if (request.getWeekIds() != null && !request.getWeekIds().isEmpty()) {
// 선택된 모든 주차의 질문 가져오기
List<Question> 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<Long> questionIds = new ArrayList<>();
for (Long weekId : request.getWeekIds()) {
List<Long> weekQuestionIds = questionRepository.findAllByWeekId(weekId)
.stream()
.map(Question::getId)
.toList();
questionIds.addAll(weekQuestionIds);
}

customQuizRepository.save(quiz);
}

private static List<Question> getRandomQuestionsIfHasLimit(CreateQuizRequest request, List<Question> 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<Question> getQuestionList(CreateQuizRequest request) {
List<Question> weekQuestions = new ArrayList<>();
for (Long weekId : request.getWeekIds()) {
weekQuestions.addAll(questionRepository.findAllByWeekId(weekId));
List<Question> freshQuestions = questionRepository.findAllById(questionIds);

for (Question question : freshQuestions) {
quiz.addQuestion(question);
}
return weekQuestions;
}

}