2026/01/13 합동프로젝트 - 5

김기훈·2026년 1월 13일

TIL

목록 보기
110/191
# 어제 무엇을 했나요?
- 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)],  # 1~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)
# view
class GameReviewView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request, game_id):
        # 1. 입력 데이터 검증
        serializer = ReviewCreateSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        # 2. 유저 타입 캐스팅 (Type Hinting)
        user = cast(User, request.user)

        # 3. 서비스 레이어 호출
        review = create_review(
            author=user,
            game_id=game_id,
            validated_data=serializer.validated_data,
        )

        # 4. 응답 반환
        return Response(
            {"id": review.id, "message": "리뷰가 등록되었습니다."},
            status=status.HTTP_201_CREATED,
        )

# service
@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(  # type: ignore
        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

오늘 발생한 문제(발생 했다면) ✅

profile
안녕하세요.

0개의 댓글