[트러블 슈팅] app_id 변경 시 관련 필드 동기화

2star_·2025년 1월 14일
0

최종 프로젝트

목록 보기
17/32

1. 문제 정의

Review 모델에서 app_id를 수정하면 game_nameheader_image는 자동으로 변경되었지만, categories 필드는 수정된 app_id에 연동되지 않고 기존 값이 그대로 유지되는 문제가 발생했습니다.


2. 원인 분석

  1. Review 모델의 @property를 사용하여 game_nameheader_image는 동적으로 Game 모델과 매핑되었으나, categories는 데이터베이스에 저장된 값이 그대로 유지됨.
  2. app_id 변경 시 categories를 자동으로 업데이트하는 로직이 없었음.

3. 해결 방법

Review 모델의 save 메서드에 app_id 변경 여부를 확인하는 로직을 추가하여, 변경된 경우 Game 모델의 genrescategories를 업데이트하도록 처리.

해결 코드

def save(self, *args, **kwargs):
    """저장 시 app_id가 변경되면 categories 업데이트"""
    original_app_id = None
    if self.pk:  # 기존에 저장된 객체일 경우
        original_app_id = Review.objects.get(pk=self.pk).app_id

    if original_app_id != self.app_id:  # app_id가 변경된 경우
        game = Game.objects.filter(appID=self.app_id).first()
        if game:
            self.categories = game.genres  # 새로운 app_id에 따른 categories 업데이트

    super().save(*args, **kwargs)

4. 적용 후 결과

수정 전 시나리오

  1. Review 생성:
    {
        "id": 1,
        "content": "Amazing RPG game!",
        "app_id": 101,
        "categories": ["RPG", "Adventure"]
    }
  2. app_id 수정 (101 → 102):
    {
        "id": 1,
        "content": "Amazing RPG game!",
        "app_id": 102,
        "categories": ["RPG", "Adventure"]  # 그대로 유지 (문제)
    }

수정 후 시나리오

  1. Review 생성:
    {
        "id": 1,
        "content": "Amazing RPG game!",
        "app_id": 101,
        "categories": ["RPG", "Adventure"]
    }
  2. app_id 수정 (101 → 102):
    {
        "id": 1,
        "content": "Amazing RPG game!",
        "app_id": 102,
        "categories": ["Action"]  # 자동 업데이트
    }

5. 의사결정 근거

  1. 자동 동기화:

    • app_id와 연동된 필드가 변경되지 않으면 데이터 일관성이 깨질 가능성이 있음.
    • 따라서 categories도 동기화되도록 처리하여 데이터 무결성을 유지.
  2. 코드 재사용성:

    • save 메서드에서 처리하여 API 로직과 분리, 다른 상황에서도 동일한 동작을 보장.
  3. 데이터 무결성:

    • app_idGame과 매핑되므로, 연관된 데이터(categories)도 항상 최신 상태로 유지.

6. 테스트

1) Postman 테스트

요청:

PUT http://127.0.0.1:8000/api/reviews/5/
{
    "content": "컨텐츠 수정 테스트 수정 되었습니다.",
    "app_id": 320150,
    "score": 5.0
}

응답:

{
    "id": 5,
    "user": 1,
    "nickname": "cgg",
    "content": "컨텐츠 수정 테스트 수정 되었습니다.",
    "app_id": 320150,
    "game_name": "Deadlings: Rotten Edition",
    "header_image": "https://cdn.akamai.steamstatic.com/steam/apps/320150/header.jpg?t=1447363358",
    "score": "5.0",
    "categories": [
        "Action",
        "Adventure",
        "Indie"
    ],
    "created_at": "2025-01-14T06:46:48.967737Z",
    "updated_at": "2025-01-14T07:46:21.890628Z",
    "comments": [
        {
            "id": 2,
            "review": 5,
            "user": 1,
            "nickname": "cgg",
            "content": "댓글 수정 테스트 입니다.",
            "created_at": "2025-01-14T07:05:48.369227Z",
            "updated_at": "2025-01-14T07:07:28.763864Z"
        }
    ]
}

7. 결과

  • app_id 변경 시 categories가 자동으로 업데이트됨.
  • 데이터 일관성과 무결성을 유지하면서 관련 필드가 동기화.

8. 결론

Review 모델의 save 메서드에서 app_id 변경 시 관련 필드(categories, game_name, header_image)를 동기화하도록 처리하여 문제를 해결했습니다. 이로써 데이터베이스의 무결성을 유지하며, 수정된 app_id에 맞게 연관 데이터가 항상 최신 상태를 반영합니다.

profile
안녕하세요.

0개의 댓글

관련 채용 정보