본문 바로가기

졸업 프로젝트

유저 수정 기능 + API 명세서 작성

# 유저 정보 수정 기능 추가

 

저번에 까먹고 안만든 유저 수정 기능을 할 차례이다.

비밀번호는 따로 암호화를 해줘야하기에 비밀번호 빼고 다른 정보들만 수정 가능하게 만들었다.

# serializers.py

class UserSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = User
        fields=['id', 'username','nickname', 'email', 'gender', 'age']

    gender_list = (
        ('남', '남'),
        ('여', '여')
    )

    username = serializers.CharField(max_length=20) # 아이디
    email = serializers.EmailField()
    nickname = serializers.CharField(max_length=20) # 이름
    gender = serializers.ChoiceField(
        choices=gender_list
    )
    age = serializers.IntegerField()
# views.py

class UserUpdateView(UpdateAPIView):

    def get(self, request, format=None):
        if request.user.is_authenticated:
            serializer = UserSerializer(request.user)
            return Response(serializer.data)
        return Response({'message': '로그인 후 이용 가능합니다.'}, status=status.HTTP_400_BAD_REQUEST)

    def patch(self, request, format=None):
        serializer = UserSerializer(request.user, data=request.data, partial=True)
        
        if serializer.is_valid():
            serializer.save()
            return Response({'message': '유저 변경 성공.', 'data': serializer.validated_data}, status=status.HTTP_200_OK)
        return Response({'message': '유저 변경 실패.', 'data': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)

 만들고 생각났는데 get 메서드는 로그인 함수 만들때 만들어줘서 필요없다...

그래도 만든건 지우지 않았다.

 

patch() 메소드를 사용하고, partial=True를 이용하여 data가 다 들어오지 않아도 되도록 만들었다.

이 함수를 웹브라우저에서 사용하면 'anonymoususer' object has no attribute ~ 이런 오류가 뜰 수 있다. 장고는 로그인하지 않으면 anonymoususer라고 처리를 해버리기 때문에...

근데 따로 로그인하기도 어려움. 그냥 플랫폼을 이용하면 잘된다.

변경~


# 비밀번호 수정 기능

비밀번호는

  1. 현재 로그인된 상태(토큰 받기)
  2. 현재비밀번호와 새로운 비밀번호 모두 받기
  3. 현재비밀번호가 틀릴 경우 error

를 바탕으로 제작했다.

# serializers.py

class PasswordUpdateSerializer(serializers.Serializer):
    current_password = serializers.CharField(max_length=128, write_only=True)
    new_password = serializers.CharField(max_length=128, write_only=True)

 

# views.py

class PasswordUpdateView(APIView):
    serializer_class = PasswordUpdateSerializer

    def patch(self, request, format=None):
        serializer = PasswordUpdateSerializer(data=request.data)
        
        if serializer.is_valid():
            user = request.user
            current_password = serializer.validated_data['current_password']
            new_password = serializer.validated_data['new_password']

            # 현재 비밀번호 확인
            if not user.check_password(current_password):
                return Response({'message': '현재 비밀번호가 옳지 않습니다.'}, status=HTTP_400_BAD_REQUEST)

            # 새로운 비밀번호 설정
            user.set_password(new_password)
            user.save()

            return Response({'message': '비밀번호가 성공적으로 변경되었습니다.'}, status=status.HTTP_200_OK)
        else:
            return Response({'message': '올바르지 않은 데이터입니다.'}, status=status.HTTP_400_BAD_REQUEST)

check_password() 메서드를 이용하면 알아서 입력받은 비밀번호를 암호화해서 비교하고 T/F를 return한다.

비밀번호가 맞다면 set_password()로 설정 후 return


# API명세서 작성

 

postman

API명세서 작성...플랫폼에 익숙해지면 편하다.

나는 postman을 작성하는데, 각 API별로 여러 return과 error 상황을 정리할 수 있다.

또, 매번 귀찮게 입력데이터를 입력해주지 않아도 이전에 사용한 것을 정리할 수 있다.(+토큰까지)

저렇게 만들어진 API명세서는 share가 가능하므로 팀원들에게 전달하면 된다.

 

익숙하지 않다면 Notion에 작성하기.

난 postman을 자주 사용하지만 팀원들이 익숙하지 않은 경우가 있고 한번에 확인하려면 Notion에다가 작성하는 것이 편하긴 하다.

메소드 페이지를 열어서 성공/실패 예시와 데이터 타입 및 예시, 조건 등을 적어준다.

 

 


# 회고

 

만드는 것에서 끝나지 않아...API명세서가 더 힘든 것 같음