[트러블슈팅] Review 생성 API 개발 과정

2star_·2025년 1월 14일
0

최종 프로젝트

목록 보기
16/32

1. 문제 정의

사용자가 리뷰를 작성할 때:

  • app_id를 통해 Game 모델과 매핑하여 관련 데이터를 활용해야 함.
  • 리뷰의 categories 필드를 Game 모델의 genres로 자동 설정.
  • 추가적으로 응답 데이터에 Game 모델의 nameheader_image를 포함.
  • 사용자 입력의 불필요한 복잡성을 줄이고 데이터 무결성을 유지.

2. 해결 과정


문제 1: app_id를 통해 Game 모델을 찾는 로직

기존 코드

ReviewSerializer에서 game(ForeignKey)을 사용하려 했지만, Game 모델의 기본 키(ID) 대신 appID를 입력받아야 하는 요구사항과 맞지 않음.

해결 코드
app_id = serializer.validated_data.get('app_id')
game = Game.objects.filter(appID=app_id).first()

if not game:
    return Response({"app_id": "유효하지 않은 app_id 입니다."}, status=status.HTTP_400_BAD_REQUEST)
의사결정
  • Game 모델의 appID를 활용하여 객체를 검색하도록 구현.
  • filter(...).first()를 사용해 객체가 없을 때도 안전하게 처리.
  • 또는 Game.objects.get(appID=app_id)를 사용해 명확히 예외 처리 가능.

문제 2: categories 필드 값 설정

기존 코드

사용자에게 categories를 입력받도록 요구했으나, 이는 불필요한 중복 데이터 입력을 유발.

해결 코드
review.categories = game.genres  # Game의 genres를 categories로 설정
review.save()
의사결정
  • Game 모델의 genres를 자동으로 categories에 저장하도록 설정.
  • 사용자 입력을 제거해 API 사용성을 개선하고, 데이터 일관성을 유지.

문제 3: 응답 데이터에 추가 정보 포함

기존 코드

ReviewSerializergame_nameheader_image를 동적으로 추가하려 했으나, 직렬화 로직과 응답 데이터를 불필요하게 복잡하게 만듦.

해결 코드
response_data = serializer.data.copy()
response_data['game_name'] = game.name
response_data['header_image'] = game.header_image
의사결정
  • 응답 데이터에 serializer.data를 기반으로 game_nameheader_image를 동적으로 추가.
  • 직렬화된 기본 데이터와 추가 정보를 명확히 구분.

문제 4: 유효하지 않은 app_id 처리

기존 코드

filter(...).first()에서 객체가 없을 경우 예외가 아닌 None을 반환.

해결 코드
if not game:
    return Response({"app_id": "유효하지 않은 app_id 입니다."}, status=status.HTTP_400_BAD_REQUEST)
의사결정
  • 명확히 예외를 반환해 클라이언트가 잘못된 요청을 즉시 알 수 있도록 처리.
  • try-except 구문으로 get을 사용하여 더욱 엄격한 에러 핸들링 가능.

3. 최종 코드

def post(self, request):
    """새 리뷰 생성"""
    serializer = ReviewSerializer(data=request.data)
    if serializer.is_valid():
        # app_id로 Game 객체 찾기
        app_id = serializer.validated_data.get('app_id')
        game = Game.objects.filter(appID=app_id).first()

        if not game:
            return Response({"app_id": "유효하지 않은 app_id 입니다."}, status=status.HTTP_400_BAD_REQUEST)

        # 리뷰 생성
        review = serializer.save()

        # Game의 genres를 categories로 저장
        review.categories = game.genres
        review.save()

        # 응답용 데이터 생성
        response_data = serializer.data.copy()
        response_data['game_name'] = game.name
        response_data['header_image'] = game.header_image

        return Response(response_data, status=status.HTTP_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

4. 최종 의사결정

  • app_idGame 모델을 찾는 방식은 유효성 검사와 오류 처리가 간결하고 명확해야 한다.
  • categories는 클라이언트 입력 없이 Gamegenres로 자동 설정하여 중복 입력을 방지.
  • 응답 데이터에는 필요시 동적으로 추가 정보를 포함하되, 불필요한 직렬화 로직은 최소화.
  • 클라이언트 요청에서 에러가 발생하면 즉시 피드백을 제공.

5. 결과

  • API가 간결하고 직관적으로 동작하며, 불필요한 입력값 제거로 사용성을 개선.
  • 데이터베이스의 무결성과 클라이언트 응답의 유연성을 동시에 만족.
  • 문제 해결 과정에서 반복된 테스트와 검증을 통해 코드 안정성 확보.
profile
안녕하세요.

0개의 댓글

관련 채용 정보