상황: 초기에는 type
필드를 활용하여 요청 상태를 0
(대기), 1
(수락), -1
(거절)로 관리하려 했습니다. 그러나 데이터베이스에 거절된 요청을 계속 유지하는 방식은 복잡성을 증가시키고, 성능 저하 가능성이 있었습니다
해결:
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() # 요청 삭제
상황: 기존 요청이 거절(type=-1
)된 상태에서 새로운 요청을 처리할 때, type
상태를 업데이트하는 방식이 프론트엔드와의 통신에 복잡함을 초래
해결:
변경 후 코드:
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)
상황: 프론트엔드에서 친구 요청을 수락/거절할 때 friend_request_id
가 아닌 요청 보낸 사람의 user_id
를 보내 혼란 발생
해결:
friend_request_id
를 요청 고유 식별자로 사용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)
# 수락 또는 거절 처리
상황: 친구 요청(FriendRequest
)과 실제 친구 관계(Friend
) 로직이 혼재되어 있어 유지보수가 어려움
해결
FriendRequestAPIView
는 요청 생성/조회/상태 변경만 처리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()
FriendRequestAPIView
: 요청 생성, 조회, 상태 변경FriendAPIView
: 친구 목록 조회, 친구 삭제type=-1
유지)를 피하고 삭제를 통해 단순화.friend_request_id
)를 활용하여 혼란 방지.