# 어제 무엇을 했나요?
- 1. github webhook 연결
- 2. 각자의 역할에 맞는 api 모델 마이그레이션
- 3. 리뷰 등록 api까지는 완료 (테스트 미완)
# 오늘은 무엇을 할 것인가요?
- 1. exception_handler 작성
- 2. 현재 구현한 리뷰 등록api 다듬기
- 2-1. 서비스에서 url파라미터를 검증하는데 이 위치가 맞는지 애매함
- 2-2. 시리얼라이저에서 작성이 아닌 보이기만 하는 필드도 추가해야하는지 고민
# 진행하는데 어려운 부분(도움이 필요한 부분)이 있나요?
- 1. 저번에 exception_handler을 작성해봤는데 그 방식이 맞는지 확답이 필요할 것 같음
오늘 학습 내용 ✅
class Review(TimeStampedModel):
game = models.ForeignKey(
...
)
user = models.ForeignKey(
...
)
content = models.TextField(verbose_name="리뷰 내용")
rating = models.PositiveSmallIntegerField(
verbose_name="별점",
validators=[MinValueValidator(1), MaxValueValidator(5)],
help_text="1~5 사이의 정수",
)
view_count = models.BigIntegerField(default=0, verbose_name="조회수")
like_count = models.BigIntegerField(default=0, verbose_name="좋아요 합계")
is_deleted = models.BooleanField(default=False, verbose_name="삭제 여부")
cost
service
- 의문: "URL 파라미터(game_id)가 잘못되었을 때 1, 2번 과정이 낭비가 아닌가?"
- cost관점: DB 조회가 더 비쌈
- serializer 검증은 매우 cost기준 저렴함
- URL 파라미터를 검증하게 되면 DB를 조회해야하는데 상대적으로 cost가 비쌈
- 현재 최종
- URL 라우팅
- urls.py의 <int:game_id>가 1차적으로 숫자 형식이 아닌 요청을 거름
- Serializer
- 값의 유효성(rating 범위 등)을 검증하여, 이상한 데이터가 DB 로직까지 들어가지 않게 막음
- Service
- 검증된 데이터를 가지고 실제 DB 작업을 수행하며, 이때 게임 존재 여부를 확인(get_object_or_404)
class GameReviewView(APIView):
permission_classes = [IsAuthenticated]
def post(self, request, game_id):
serializer = ReviewCreateSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = cast(User, request.user)
review = create_review(
author=user,
game_id=game_id,
validated_data=serializer.validated_data,
)
return Response(
{"id": review.id, "message": "리뷰가 등록되었습니다."},
status=status.HTTP_201_CREATED,
)
@transaction.atomic
def create_review(
*, author: User, game_id: int, validated_data: dict[str, Any]
) -> Review:
"""
리뷰 생성 비즈니스 로직
"""
game = get_object_or_404(Game, pk=game_id)
review = Review.objects.create(
user=author,
game=game,
content=validated_data["content"],
rating=validated_data["rating"],
)
return review
새롭게 알게된 내용 ✅
DB 초기화(도커)
docker compose down -v
docker compose up -d
python manage.py migrate
오늘 발생한 문제(발생 했다면) ✅