지금 어려운 점은, 이와 같은 관계를 정립할때, 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을 사용하는 경우에
맞춰져 있으며, 실제 사용 시에는 트랜잭션 관리와 예외 처리를 고려해야 합니다.