[1차 프로젝트]3-댓글 기능 구현하기

이태연·2021년 12월 12일
0

댓글/좋아요/구독기능의 경우 필수기능구현을 다 마치고 시간이 된다면 구현하기로 한 추가기능이였습니다. 하지만 다른팀들과 달리 저희가 맡은 사이트는 커머스 사이트가 아니였기 때문에 추가기능을 꼭 해보고 싶었습니다.

다행히 프로젝트 마감일 전에 필수기능구현을 끝냈고 추가기능을 할 수 있는 시간이 주어져서 저는 댓글기능을 구현하기로 하였습니다.

* 댓글 작성하기 기능

class CommentView(View):
    @login_decorator
    def post(self, request ,posting_id):
        try:
            data    = json.loads(request.body)

            posting = Posting.objects.get(id=posting_id)
            reply   = data['reply'] 
            user    = request.user
            
            Comment.objects.create( 
                reply   = reply,
                user    = user,
                posting = posting
            )

            return JsonResponse({"message" : "SUCCESS"}, status=201)

        except KeyError:
             return JsonResponse({"message" : "KEY_ERROR"}, status=401)

        except Posting.DoesNotExist:
            return JsonResponse({"message": "INVALID_POSTING"}, status=400) 

댓글 작성하기 기능은 위와 같이 작성하였습니다.
댓글을 작성할 때 어떤 정보가 필요한지 고민하다가 1.유저가 로그인을 했는가? 2.어떤 포스팅에 댓글을 남겼는가? 3.댓글의 내용은 어떤 것인가?
이 세가지가 필요하다는 생각이 들어서 해당 부분을 염두에 두고 코드를 작성하였습니다.

먼저 login decorator를 통해 로그인 한 유저만 댓글 작성이 가능하도록 하였습니다. (user = request.user)
그리고 get메소드를 통해 포스팅 id를 가져와서 어떤 포스팅에서 댓글을 작성했는지 알 수 있도록 하였습니다.

try, except문을 통해 해당 포스팅이 존재하지 않을 경우 INVALID_POSTING이라는 메세지가 나오도록 작성하였습니다.

* 댓글 정보 불러오기

def get(self, request, posting_id):
        try:
        
            comments = Posting.objects.get(id=posting_id).comment_set.values('reply','user__name')
            
            results= [comment for comment in comments]

            return JsonResponse({"message":"SUCCESS", "results" : results}, status=201)
        
        except Posting.DoesNotExist:
            return JsonResponse({"message": "INVALID_COMMENT"}, status=401)

댓글 정보 불러오기 기능의 경우 posting이 comment를 역참조 하고 있기 때문에 comment_set.values('reply, 'user__name)을 통해 댓글의 내용과 댓글을 작성한 유저의 이름을 확인할 수 있도록 작성하였습니다.

* 댓글 삭제하기

@login_decorator
    def delete(self,request,comment_id):
        try:
            comment = Comment.objects.get(id=comment_id)
            if request.user.id == comment.user.id:
            	comment.delete()
        
        except Comment.DoesNotExist:
            return JsonResponse({"message" : "INVALID_COMMENT"}, status=401)

제가 작성한 코드는 위와 같습니다.
먼저 댓글의 id를 가져와서 그 댓글을 작성한 유저의 아이디와 현재 로그인한 유저의 아이디가 같을 경우 댓글을 삭제하는 방식의 코드였습니다.

코드리뷰 후 변경된 코드는 다음과 같습니다.

@login_decorator
    def delete(self,request,comment_id):
        
        try:
            Comment.objects.get(id=comment_id, user=request.user.id).delete()
            return JsonResponse({"message" : "COMMENT_DELETE"}, status=201) 
        
        except Comment.DoesNotExist:
            return JsonResponse({"message" : "INVALID_COMMENT"}, status=401)

제가 세줄로 작성한 코드가 한 줄로 깔끔하게 변경되었습니다.

Comment.objects.get(id=comment_id, user=request.user.id).delete()

get메소드를 위와 같이 활용하여 comment_id를 가져와서 그 comment를 현재 로그인 한 유저가 작성했을 경우 삭제가 가능하도록 하였습니다.

profile
주니어 백엔드 웹 개발자입니다.

0개의 댓글