[트러블 슈팅] 친구 요청 및 친구 관리 기능 구현

2star_·2025년 1월 18일
0

최종 프로젝트

목록 보기
21/32

1. 문제: 친구 요청 상태 관리 방식의 혼란

  • 상황: 초기에는 type 필드를 활용하여 요청 상태를 0(대기), 1(수락), -1(거절)로 관리하려 했습니다. 그러나 데이터베이스에 거절된 요청을 계속 유지하는 방식은 복잡성을 증가시키고, 성능 저하 가능성이 있었습니다

  • 해결:

    1. 거절된 요청은 데이터베이스에서 삭제
    2. 요청 수락 시, 요청을 삭제하면서 Friend 모델에 친구 관계를 저장
  • 변경 후 코드:

    if new_type == 1:  # 수락
        Friend.objects.create(user_id=request.user, friend_id=friend_request.user_id)
        Friend.objects.create(user_id=friend_request.user_id, friend_id=request.user)
        friend_request.delete()  # 요청 삭제
    elif new_type == -1:  # 거절
        friend_request.delete()  # 요청 삭제

2. 문제: 중복 요청 처리의 혼란

  • 상황: 기존 요청이 거절(type=-1)된 상태에서 새로운 요청을 처리할 때, type 상태를 업데이트하는 방식이 프론트엔드와의 통신에 복잡함을 초래

  • 해결:

    1. 모든 요청은 수락 또는 거절 시 삭제
    2. 새로운 요청은 언제든지 새롭게 생성 가능하도록 설계
  • 변경 후 코드:

    def post(self, request):
        """친구 요청 생성"""
        friend_request, created = FriendRequest.objects.get_or_create(
            user_id=request.user, friend_id=friend,
            defaults={"type": 0}
        )
        if not created:
            return Response({"message": "이미 대기 중인 친구 요청이 있습니다."}, status=status.HTTP_400_BAD_REQUEST)

3. 문제: 요청 ID와 사용자 ID 혼동

  • 상황: 프론트엔드에서 친구 요청을 수락/거절할 때 friend_request_id가 아닌 요청 보낸 사람의 user_id를 보내 혼란 발생

  • 해결:

    1. friend_request_id를 요청 고유 식별자로 사용
    2. 프론트엔드가 GET 요청으로 받은 id를 그대로 PUT 요청에 사용하도록 설계
  • 변경 후 코드:

    def put(self, request):
        """친구 요청 상태 변경"""
        friend_request = get_object_or_404(FriendRequest, id=request.data.get("friend_request_id"), friend_id=request.user)
        # 수락 또는 거절 처리

4. 문제: 친구 요청과 친구 관리 로직의 혼합

  • 상황: 친구 요청(FriendRequest)과 실제 친구 관계(Friend) 로직이 혼재되어 있어 유지보수가 어려움

  • 해결

    1. FriendRequestAPIView는 요청 생성/조회/상태 변경만 처리
    2. FriendAPIView를 별도로 만들어 친구 목록 조회 및 삭제 관리
  • 변경 후 구조:

    class FriendRequestAPIView(APIView):
        # 친구 요청 생성, 조회, 수락/거절 처리
        ...
    
    class FriendAPIView(APIView):
        def get(self, request):
            """친구 목록 조회"""
            friends = Friend.objects.filter(user_id=request.user)
            ...
    
        def delete(self, request):
            """친구 삭제"""
            Friend.objects.filter(user_id=request.user, friend_id=request.data.get("friend_id")).delete()

최종 결과

  • 변경된 로직은 다음과 같은 특징을 가집니다:
    1. 친구 요청과 친구 관리의 명확한 분리:
      • FriendRequestAPIView: 요청 생성, 조회, 상태 변경
      • FriendAPIView: 친구 목록 조회, 친구 삭제
    2. 거절된 요청 삭제:
      • 데이터베이스가 깔끔하게 관리되며 성능 최적화

배운 점

  1. 데이터 설계는 유연하면서도 간단해야 함:
    • 복잡한 상태 관리(type=-1 유지)를 피하고 삭제를 통해 단순화.
  2. 클라이언트와의 통신은 명확해야 함:
    • 고유 ID(friend_request_id)를 활용하여 혼란 방지.
  3. 로직 분리는 유지보수의 핵심:
    • 친구 요청과 친구 관리를 명확히 분리하여 역할을 구체화.
profile
안녕하세요.

0개의 댓글

관련 채용 정보