차단한 사용자의 리뷰 블러 처리 구현

2star_·2025년 1월 17일
0

최종 프로젝트

목록 보기
19/32

문제

우리 프로젝트의 주요 요구사항 중 하나는 사용자가 차단한 유저의 리뷰를 블러 처리하는 기능이었습니다. 이 기능은 사용자 경험을 개선하기 위한 중요한 요소로, 리뷰를 조회할 때 차단된 사용자의 리뷰를 숨기거나 대체 메시지로 표시해야 했습니다.

구현 목표

  1. 회원: 차단한 사용자의 리뷰를 블러 처리.
  2. 비회원: 모든 리뷰를 정상적으로 표시.
  3. 일관된 동작: 모든 리뷰 목록 조회 및 상세 조회 API에서 동일한 블러 처리 로직 적용.

구현 과정

1. 의사결정: Serializer 활용

리뷰를 블러 처리하기 위해 선택한 접근 방식은 Serializer를 활용하는 것이었습니다. 이 방법을 선택한 이유는 다음과 같습니다:

  • 재사용성: 여러 View에서 동일한 ReviewSerializer를 사용하여 로직의 일관성을 유지할 수 있습니다.
  • 간결성: Serializer는 데이터를 직렬화하는 과정에서 로직을 포함할 수 있으므로, 블러 처리 로직을 효율적으로 추가할 수 있습니다.

2. 블러 처리 로직 추가

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

3. View에서 context 전달

Serializer가 블러 처리 로직을 실행하려면, 차단된 사용자 목록(blocked_users)을 context로 전달해야 했습니다. 이를 위해 ReviewAPIViewReviewDetailAPIView에서 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)

트러블 슈팅

문제 1: 블러 처리가 작동하지 않음

증상: 차단된 사용자의 리뷰가 여전히 원본 내용으로 표시됨.
원인: SerializerMethodField를 누락하여 get_content 메서드가 호출되지 않음.
해결: content = serializers.SerializerMethodField()를 추가하여 get_content 메서드가 호출되도록 수정.


문제 2: 비회원의 경우 블러 처리 로직 동작

증상: 비회원 사용자가 조회했을 때도 블러 처리 로직이 작동.
원인: 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
    ...

최종 결과

  1. 블러 처리 성공: 차단된 사용자의 리뷰가 "이 사용자의 리뷰는 차단되어 표시되지 않습니다."로 표시됨.
  2. 비회원 접근 처리: 비회원은 모든 리뷰를 원본 그대로 확인 가능.
  3. 일관된 동작: 모든 View(API)에서 동일한 블러 처리 로직을 적용.
profile
안녕하세요.

0개의 댓글

관련 채용 정보