지금 어려운 점은, 이와 같은 관계를 정립할때, QuestionLog를 추가하려면 RoundLog가 필요하고, RoundLog를 추가하려면 QuestionLog가 필요한 것이다.
List<QuestionLog> 가 매핑되어있다.List<RoundLog> 객체가 매핑되어있다.그럼으로, 일단 CategoryLog 부터 채워넣고, RoundLog, QuestionLog를 순서대로 채워넣는 작업을 해야할듯하다.
작업 흐름도는 다음과 같다.
size = 0 : CategoryLog를 추가한다.size = 0 : RoundLog의 새로운 객체를 선언한다.이 코드에서 Question, QuestionLog, RoundLog, 그리고 CategoryLog 엔티티들 간의 관계를 기반으로 하여 Question이 해결될 때 데이터베이스에 어떻게 정보를 저장해야 할지 고려해야 합니다. 여기서 몇 가지 주요 시나리오를 고려할 수 있습니다:
RoundLog와 CategoryLog가 이미 존재하는 경우:
QuestionLog를 생성하고 저장합니다.RoundLog의 wrongNumber, correctNumber, wrongCorrectNumber 및 roundProgressPercent를 업데이트합니다.RoundLog가 속한 CategoryLog의 categoryProgressPercent를 업데이트합니다.RoundLog는 존재하지만 CategoryLog가 존재하지 않는 경우:
QuestionLog와 CategoryLog를 생성합니다.RoundLog를 업데이트하고, 새로운 CategoryLog와 연결합니다.CategoryLog에 대한 진행도를 계산하고 저장합니다.RoundLog와 CategoryLog가 모두 존재하지 않는 경우:
QuestionLog, RoundLog, 그리고 CategoryLog를 생성합니다.각 경우에 대한 구체적인 구현은 다음과 같습니다:
RoundLog와 CategoryLog가 이미 존재하는 경우:
// QuestionLog 생성
QuestionLog questionLog = new QuestionLog(member, question, roundLog, questionLogType, choseMultipleChoiceAnswers, choseOxAnswer, choseSubjectiveAnswer);
questionLogRepository.save(questionLog);
// RoundLog 업데이트
updateRoundLog(roundLog, questionLog);
// CategoryLog 업데이트
updateCategoryLog(roundLog.getCategoryLog());
RoundLog는 존재하지만 CategoryLog가 존재하지 않는 경우:
// QuestionLog 및 CategoryLog 생성
QuestionLog questionLog = new QuestionLog(member, question, roundLog, questionLogType, choseMultipleChoiceAnswers, choseOxAnswer, choseSubjectiveAnswer);
CategoryLog categoryLog = new CategoryLog();
categoryLog.setMember(member);
categoryLog.setCategory(question.getCategory());
// RoundLog 및 CategoryLog 저장 및 연결
roundLog.setCategoryLog(categoryLog);
questionLogRepository.save(questionLog);
categoryLogRepository.save(categoryLog);
// RoundLog 및 CategoryLog 업데이트
updateRoundLog(roundLog, questionLog);
updateCategoryLog(categoryLog);
RoundLog와 CategoryLog가 모두 존재하지 않는 경우:
// 모든 로그 생성
QuestionLog questionLog = new QuestionLog(member, question, null, questionLogType, choseMultipleChoiceAnswers, choseOxAnswer, choseSubjectiveAnswer);
RoundLog roundLog = new RoundLog();
CategoryLog categoryLog = new CategoryLog();
// 관계 설정
roundLog.setMember(member);
roundLog.setRound(question.getRound());
categoryLog.setMember(member);
categoryLog.setCategory(question.getCategory());
roundLog.setCategoryLog(categoryLog);
questionLog.setRoundLog(roundLog);
// 저장
questionLogRepository.save(questionLog);
roundLogRepository.save(roundLog);
categoryLogRepository.save(categoryLog);
// 업데이트
updateRoundLog(roundLog, questionLog);
updateCategoryLog(categoryLog);
이러한 각 시나리오에 대한 구현은 QuestionLog, RoundLog, 및 CategoryLog 엔티티의 관계와 도메인의 비즈니스 로직에 따라 달라질 수 있습니다. 또한, updateRoundLog와 updateCategoryLog 메서드는 각 로그의 진행도를 계산하고 업데이트하는 로직을 포함해야 합니다.
이러한 구현은 JPA와 같은 ORM을 사용하는 경우에
맞춰져 있으며, 실제 사용 시에는 트랜잭션 관리와 예외 처리를 고려해야 합니다.