2023-01-09 cbthub

gosu·2024년 1월 9일
0
post-thumbnail
post-custom-banner

논리 정리

  • 현재 Member 가 Question을 풀었을 때 QuestionLog, RoundLog, CategoryLog 가 동시에 추가되어야하는 도메인 로직을 추가해야한다.

지금 어려운 점은, 이와 같은 관계를 정립할때, QuestionLog를 추가하려면 RoundLog가 필요하고, RoundLog를 추가하려면 QuestionLog가 필요한 것이다.

  1. QuestionLog : RoundLog 객체가 매핑되어있다.
  2. RoundLog : List<QuestionLog> 가 매핑되어있다.
  3. RoundLog : CategoryLog 객체가 매핑되어있다.
  4. CategoryLog : List<RoundLog> 객체가 매핑되어있다.

그럼으로, 일단 CategoryLog 부터 채워넣고, RoundLog, QuestionLog를 순서대로 채워넣는 작업을 해야할듯하다.

작업 흐름도는 다음과 같다.

  1. 일단 해당 Category를 Member가 풀었던 적이 있는지 체크한다.
  • CategoryLog Repository에서 Member의 username으로 검색하는 알고리즘을 만든다.
  • 검색 결과 : size = 0 : CategoryLog를 추가한다.
  1. 그 후 해당 Round를 Member가 풀었던 적이 있는지 체크한다
  • RoundLog Repository에서 Member의 username으로 검색하는 알고리즘을 만든다.
  • 검색 결과 : size = 0 : RoundLog의 새로운 객체를 선언한다.
  1. QuestionLog 객체를 선언한다.

gpt 답변

이 코드에서 Question, QuestionLog, RoundLog, 그리고 CategoryLog 엔티티들 간의 관계를 기반으로 하여 Question이 해결될 때 데이터베이스에 어떻게 정보를 저장해야 할지 고려해야 합니다. 여기서 몇 가지 주요 시나리오를 고려할 수 있습니다:

  1. RoundLog와 CategoryLog가 이미 존재하는 경우:

    • 새로운 QuestionLog를 생성하고 저장합니다.
    • 연관된 RoundLogwrongNumber, correctNumber, wrongCorrectNumberroundProgressPercent를 업데이트합니다.
    • RoundLog가 속한 CategoryLogcategoryProgressPercent를 업데이트합니다.
  2. RoundLog는 존재하지만 CategoryLog가 존재하지 않는 경우:

    • 새로운 QuestionLogCategoryLog를 생성합니다.
    • RoundLog를 업데이트하고, 새로운 CategoryLog와 연결합니다.
    • CategoryLog에 대한 진행도를 계산하고 저장합니다.
  3. RoundLog와 CategoryLog가 모두 존재하지 않는 경우:

    • 새로운 QuestionLog, RoundLog, 그리고 CategoryLog를 생성합니다.
    • 이들 간의 관계를 설정하고, 각 로그의 진행도를 계산하여 저장합니다.

각 경우에 대한 구체적인 구현은 다음과 같습니다:

  1. 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());
  2. 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);
  3. 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 엔티티의 관계와 도메인의 비즈니스 로직에 따라 달라질 수 있습니다. 또한, updateRoundLogupdateCategoryLog 메서드는 각 로그의 진행도를 계산하고 업데이트하는 로직을 포함해야 합니다.

이러한 구현은 JPA와 같은 ORM을 사용하는 경우에

맞춰져 있으며, 실제 사용 시에는 트랜잭션 관리와 예외 처리를 고려해야 합니다.

profile
개발자 블로그 ^0^
post-custom-banner

0개의 댓글