모델 간소화
Quizbot 앱에서 퀴즈를 생성하고 그에 대한 정보를 저장하고, 사용자의 답을 제출하고 그에 대한 정보를 저장하고, 퀴즈 결과를 계산하고 그에 대한 정보를 계산하고, 불필요한 데이터는 delete 요청을 통해 삭제하게 하는 작업을 저번 주에 해놓았다.
팀 회의를 통해, 불필요하거나 겹치는 모델들이 많다고 판단하여, 모델을 간소화하는 작업을 진행하기로 했다. 모델은 처음 만들어두었던 Quiz, Question, Choice 모델만 놔두기로 했다. 이후에 새로 생성되는 데이터를 저장할 필드는 기본값을 설정하여 만들기로 했다. 작성한 모델은 아래와 같다.
from django.db import models
class Quiz(models.Model):
title = models.CharField(max_length=100) # 퀴즈 제목
description = models.TextField() # 퀴즈들에 대한 전체적인 설명
result = models.JSONField(default=dict) # 사용자가 답변 제출 시 퀴즈 결과 저장
class Question(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name="questions")
number = models.PositiveIntegerField() # 문제 번호
content = models.TextField() # 문제
answer_type = models.CharField(max_length=100) # 문제 형태(객관식, 단답형, ox)
user_answer = models.JSONField(default=dict) # 사용자 답변
class Choice(models.Model):
question = models.ForeignKey(
Question, on_delete=models.CASCADE, related_name="choices"
)
number = models.PositiveIntegerField() # 보기 번호
content = models.TextField() # 보기 내용
is_correct = models.BooleanField() # 정답 여부
Quiz 모델에 result, 즉 사용자가 퀴즈를 풀고 난 결과를 저장하는 필드를 추가했다. Question 모델에는 사용자가 선택한 답과 그와 관련된 문제, 보기, 정답 여부 등을 저장하기 위한 user_answer 필드를 추가했다. 각각 기본값을 딕셔너리로 설정해두었다.
모델을 수정했으니, views.py도 수정해야 했다. 기존에 QuizResult 모델과 QuizResultQuestion 모델을 사용하거나 참조하고 있던 부분들을 모두 Quiz, Question, Choice를 사용하거나 참조하도록 수정해야 했다. Response로 원하는 응답이 변하지 않도록 신경쓰면서, 이전의 응답과 같은 응답을 받도록 코드를 수정해나갔다.
원래는 delete 요청을 추가하여 기존의 quiz 관련 데이터들을 데이터베이스에서 삭제하고, 필요한 정보들을 다시 저장하는 로직으로 구성했었다. 이제는 delete 요청이 불필요하여 삭제하고, 새로 생성되는 퀴즈 결과와 사용자의 답변과 그와 관련된 내용들을 저장할 수 있게 다시 로직을 구성했다. 수정한 부분들 중 예시는 아래와 같다. QuizAPIView의 post 요청에서 Question 모델의 user_answer 필드에 내용을 업데이트하는 로직이다. 원래는 QuizResult 모델에 새로 데이터를 create 했었다.
# user_answer 필드 업데이트
question.user_answer = {
"selected_choice": {
"number": selected_choice.number,
"content": selected_choice.content,
"is_correct": selected_choice.is_correct
}
}
팀원과의 소통이 얼마나 중요한지에 대해 깨닫는 하루였다. 이번 작업은 다른 팀원분과 함께 작업하기도 했다. 두 사람의 머리를 맞대어서 작업했지만, 여전히 아쉬운 부분이 생겼다. 이를 다른 팀 회의를 통해 다른 팀원분들을 의견을 받을 수 있었다.
처음 작업할 때는, 데이터베이스에 너무 많은 양의 데이터가 저장되는 것 같다는 생각이 들었다. 모델에서 on_delete=models.CASCADE
옵션을 주었기 때문에, 한꺼번에 모든 데이터를 지울 수 있다는 것이 효율적이라는 생각이 들었다. 모든 데이터를 지우면 데이터베이스에는 부담이 하나도 남지 않게 되니까. 모든 데이터를 지우기 전에, 필요한 데이터만 따로 저장해두면 된다고 생각했었다. 그래서 QuizResult 모델과 QuizResultQuestion 모델도 추가로 만들고, 그에 따라 로직을 구성했던 것이다.
그러나, 팀 회의를 통해 이미 Quiz, Question, Choice에 저장돼있는 데이터들에, 필요한 데이터만 추가하자는 의견이 나왔다. 어짜피 필요한 데이터들은 정해져있고, 우리가 새로 만든 모델들과 중복되는 것은 당연한 것이었다. 하루종일 같은 작업만 하다 보니 생각이 갇혀버린 것 같았다. 팀 회의를 오전, 오후로 하루에 2번 하기로 한 것은 정말 잘한 결정이었다.