본문 바로가기

웹 개발

[프로젝트] 유저 정보 PUT 메소드 요청시 검증 로직

오늘은 문서 작업과 코드 병합 과정에 있어서 많은 기능에 손을 대지는 못했다.

그 중에서 회원 정보 기능에 넣었던 validate 로직에 대한 내용을 써보려고 한다.

 

class UserAPIView(APIView):
    permission_classes = [IsAuthenticated]

    def get_user_object(self, username):
        return get_object_or_404(User, username=username)

    def put(self, request, username):
        user = self.get_user_object(username)
        if user == request.user:
            is_valid, error_message = validator_update_user(request.data, user)
            if not is_valid:
                return Response({"error": error_message}, status=status.HTTP_400_BAD_REQUEST)
            serializer = UserSerializer(user, data=request.data, partial=True)
            if serializer.is_valid():
                serializer.save()
            return Response(serializer.data)

        else:
            return Response({"message": "수정 권한이 없습니다."}, status=status.HTTP_403_FORBIDDEN)

회원 정보 수정만 가져온 부분이다.

로그인한 유저만 자신의 정보를 수정해야 하니 IsAuthenticated와 로그인한 유저가 url의 요청 주소로 불러온 유저와 같은지 확인하는 부분을 먼저 작성하고 받아온 데이터 검증을 위해서 validator_update_user 함수를 직접 만들었다.

 

def validator_update_user(update_data, user_data):
    err_msg = []

    name = update_data.get("name", user_data.name)
    if name =="":
        err_msg.append({"name": "이름을 입력해야 합니다."})
    elif len(name) > 20:
        err_msg.append({"name": "이름은 20자 이하여야 합니다."})

    email = update_data.get("email", user_data.email)  
    if email == "": 
        err_msg.append({"email": "이메일을 입력해야 합니다."})
    elif User.objects.filter(email=email).exclude(pk=user_data.pk).exists(): 
        err_msg.append({"email": "이미 존재하는 이메일입니다."})
    else: 
        try: 
            validate_email(email)
        except: 
         err_msg.append({"email": "이메일 형식이 올바르지 않습니다."})


    address = update_data.get("address", user_data.address)
    if address == "":
        err_msg.append({"address": "주소를 입력해야 합니다."})

    return not bool(err_msg), err_msg

validator_update_user의 기능은 그렇게 많지 않다.

회원가입시 검증하는 로직이랑 비슷한데 다른점은 유저의 정보도 같이 가져와 부분만 수정할 수 있게 구현하려고 했다.

request.data 안에 알맞은 key값이 value를 가지고 있지 않다면 원래 유저의 데이터를 채워서 수정하게끔 했다.

이렇게 구현하면서 느낀점은 프론트로 확인할 수 없으니 검증에 불편함이 있지 않을까라는 걱정이 있었다.

postman으로 확인하고 있지만 역시 요청을 할 수 있는 간단한 form을 먼저 만들어서 코드에 대한 실행을 해야할 것 같다.