우리 프로젝트의 주요 요구사항 중 하나는 사용자가 차단한 유저의 리뷰를 블러 처리하는 기능이었습니다. 이 기능은 사용자 경험을 개선하기 위한 중요한 요소로, 리뷰를 조회할 때 차단된 사용자의 리뷰를 숨기거나 대체 메시지로 표시해야 했습니다.
리뷰를 블러 처리하기 위해 선택한 접근 방식은 Serializer를 활용하는 것이었습니다. 이 방법을 선택한 이유는 다음과 같습니다:
ReviewSerializer
를 사용하여 로직의 일관성을 유지할 수 있습니다.ReviewSerializer
에 다음과 같은 로직을 추가했습니다:
SerializerMethodField
:content
필드를 오버라이드하여 블러 처리 여부를 결정.get_content
메서드:"이 사용자의 리뷰는 차단되어 표시되지 않습니다."
메시지를 반환.ReviewSerializer
코드class ReviewSerializer(serializers.ModelSerializer):
content = serializers.SerializerMethodField() # 블러 처리된 콘텐츠 반환
nickname = serializers.SerializerMethodField() # 사용자 닉네임 반환
def get_content(self, obj):
blocked_users = self.context.get('blocked_users', [])
if obj.user and obj.user.id in blocked_users:
return "이 사용자의 리뷰는 차단되어 표시되지 않습니다."
return obj.content
context
전달Serializer가 블러 처리 로직을 실행하려면, 차단된 사용자 목록(blocked_users
)을 context
로 전달해야 했습니다. 이를 위해 ReviewAPIView
와 ReviewDetailAPIView
에서 context
를 설정했습니다.
ReviewAPIView
수정class ReviewAPIView(APIView):
def get(self, request):
blocked_users = Block.objects.filter(blocker=request.user).values_list('blocked_user', flat=True) if request.user.is_authenticated else []
reviews = Review.objects.all()
serializer = ReviewSerializer(reviews, many=True, context={'request': request, 'blocked_users': list(blocked_users)})
return Response(serializer.data, status=status.HTTP_200_OK)
증상: 차단된 사용자의 리뷰가 여전히 원본 내용으로 표시됨.
원인: SerializerMethodField
를 누락하여 get_content
메서드가 호출되지 않음.
해결: content = serializers.SerializerMethodField()
를 추가하여 get_content
메서드가 호출되도록 수정.
증상: 비회원 사용자가 조회했을 때도 블러 처리 로직이 작동.
원인: request.user.is_authenticated
검사를 누락.
해결: request.user.is_authenticated
를 조건으로 추가하여 비회원 사용자는 블러 처리 로직을 무시하도록 수정.
def get_content(self, obj):
if not self.context.get('request').user.is_authenticated:
return obj.content
...
"이 사용자의 리뷰는 차단되어 표시되지 않습니다."
로 표시됨.