터칭 데이터

장고(Django) Serializer를 사용하여 User 생성하기 본문

장고 (Django)

장고(Django) Serializer를 사용하여 User 생성하기

터칭 데이터 2023. 11. 5. 13:07

 

 

 

 

 

Serializer로 회원가입 기능 만들기

 

 

바로 이전 시간에서는 rest_framework의 도움 없이 장고만의 기능인 UserCreationForm으로 회원가입 기능을 구현해봤습니다.

 

이번 시간에는 Django Rest Framework의 Serializer기능을 사용해 사용자의 회원가입 기능을 구현해보겠습니다.

 

 

 

 

 

 

 

회원가입 Serializer 만들기

 

우리는 DRF를 이용한 Serializer는 polls_api/serializers.py에서 구현해왔습니다.

 

polls_api/serializers.py

 

RegisterSerializer 클래스를 구현했는데요. 모델은 당연히 User입니다. 그런데 Meta 클래스에서 extra_kwargs가 생소하실 겁니다. 비밀번호인 password를 읽을 수 있으면 안되겠죠? 그래서 password 필드를 쓰기만 가능하도록 write_only를 True로 준 것입니다.

 

 

`extra_kwargs`는 Django REST framework의 Model Serializer 클래스에서 사용할 수 있는 옵션 중 하나로, Serializer 필드에 대한 추가적인 설정을 제공합니다. 이 옵션은 Serializer 클래스의 `Meta` 클래스 내에서 정의되며, 필드에 대한 추가 설정을 할 때 유용합니다.

보통, `extra_kwargs`는 다음과 같은 작업에 사용됩니다:

1. **필드 레이블 변경**: Serializer의 필드 레이블을 변경할 수 있습니다. 이것은 API에서 반환되는 데이터의 필드명을 변경하는 데 유용합니다.

2. **필드 도움말 변경**: 필드에 대한 도움말 텍스트를 변경할 수 있습니다. 이것은 API 문서 생성 시 도움말 텍스트를 커스터마이즷하는 데 사용됩니다.

3. **필드 속성 변경**: 필드의 속성을 변경할 수 있습니다. 예를 들어, 필드를 읽기 전용으로 만들거나 필드의 `required` 속성을 조정할 수 있습니다. 우리가 이번에 사용한 기능입니다!

예를 들어, 아래의 코드는 `extra_kwargs`를 사용하여 필드 레이블 및 도움말을 변경하는 방법을 보여줍니다:

from rest_framework import serializers

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ('field1', 'field2')
        extra_kwargs = {
            'field1': {'label': 'Custom Field Label', 'help_text': 'Custom help text for Field1'},
            'field2': {'label': 'Another Label'},
        }



위의 코드에서 `extra_kwargs`를 사용하여 `field1`과 `field2` 필드의 레이블 및 도움말을 변경했습니다. 이러한 설정은 API 문서 생성 및 사용자 친화적인 응답을 생성하는 데 도움이 됩니다.

 

 

 

 

 

 

 

 

 

뷰(Views) 만들기

 

Serializer를 만들었으니 뷰를 만들겠습니다.

 

polls_api/views.py

 

방금 미리 만들어둔 RegisterSerializer를 import해 generics의 도움으로 손쉽게 작성했습니다.

 

 

 

 

 

 

URL 설정하기

 

polls_api/urls.py

 

 

URL 작업도 끝냈습니다.

 

 

 

 

 

 

 

 

브라우저에서 확인하기

 

이름이 user2인 사용자를 패스워드까지 입력해 POST를 누르면 HTTP 201 Created라고 뜨며 회원가입이 되었다고 뜹니다.

 

그런데 한가지 문제가 있습니다. 중복된 이름으로 회원가입을 진행하면 404 Bad Request가 뜨며 진행을 막아주지만 너무 간단한 비밀번호를 입력하면 경고없이 바로 회원가입이 진행됩니다. 장고의 UserCreationForm과 달리 Serializer 회원가입은 간단한 비밀번호의 입력을 막는 기능을 따로 구현해야 합니다.

 

 

 

 

 

 

 

Serializer에 간단한 패스워드 회원가입을 막는 기능 추가

 

polls/serializers.py

# (..생략..)
from django.contrib.auth.password_validation import validate_password

# (..생략..)

class RegisterSerializer(serializers.ModelSerializer):
    password = serializers.CharField(write_only=True, required=True, validators=[validate_password])
    class Meta:
        model = User
        fields = ['username', 'password']
        # extra_kwargs = {'password': {'write_only': True}}

 

비밀번호의 유효성 검사를 위해 validate_password를 import했습니다. 이를 User 모델의 필드인 password에 적용하려면 password를 따로 Meta class 밖에서 정의해줍니다.

 

write_only는 보안을 위해 쓰기만 가능하도록 합니다.

required는 필수 필드인지를 나타냅니다. 요청 데이터에서 이 필드가 반드시 제공되어야 한다는 뜻입니다.

validators는 해당 필드에 대한 사용자 정의 유효성 검사 함수를 지정하는데 사용합니다. 이 속성을 이용해 해당 필드의 값이 특정 규칙을 준수해야하는지 검사할 수 있습니다.

 

이렇게 정의해주면 주석표시 되어있는 extra_kwargs 코드는 삭제해줘도 좋습니다.

 

 

 

 

브라우저에서 확인해보면

 

1234라는 비밀번호로 가입을 시도하니 이를 막아주는 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

회원가입시 비밀번호를 한번 더 확인하도록 하는 기능 만들기

 

보통 우리가 회원가입을 할 때는 비밀번호를 똑같이 2번 입력하도록 합니다.

 

이 때 2번에 걸쳐 입력한 비밀번호가 서로 다르면 회원가입이 되지 않습니다.

 

그 기능을 구현하겠습니다.

 

 

polls_api/serializers.py

 

password2는 비밀번호 2차 입력 필드입니다.

 

왜 필드로 선언했는지를 create 메서드와 엮어 설명하겠습니다.

지금까지의 Model에는 password라는 필드만 있었지 password2라는 필드는 없었습니다. 때문에 validate 메서드에서 1차 입력 password와 2차 입력 password2가 정상적으로 똑같이 입력되어 통과했다 한들 그다음에 회원가입을 진행하면 password2를 User 모델에 넣지 못해 에러가 발생합니다. 그래서 password2를 필드로 선언하고 create 메서드를 작성한 것입니다.

 

그리고 validate에 그리고 atrrs에 대해 설명하면

 

`validate` 메서드의 인자 `attrs`는 Django REST framework에서 Serializer의 유효성 검사를 수행할 때 사용되는 데이터 딕셔너리입니다. 이 데이터 딕셔너리는 클라이언트로부터 제출된 요청 데이터를 나타내며, Serializer 필드의 값들이 이 딕셔너리에 포함됩니다.

`attrs` 딕셔너리는 다음과 같은 구조를 가집니다:

- 각 키(key)는 Serializer에서 정의한 필드의 이름에 해당합니다.
- 각 값(value)은 클라이언트로부터 제출된 데이터에서 해당 필드의 값을 나타냅니다.

`validate` 메서드는 이 `attrs` 딕셔너리를 받아서 해당 데이터에 대한 추가적인 유효성 검사를 수행할 수 있습니다. 예를 들어, 위의 코드에서 `validate` 메서드는 `password` 필드와 `password2` 필드의 값이 일치하는지 확인하고, 일치하지 않으면 `serializers.ValidationError` 예외를 발생시켜 유효성 검사 오류를 처리합니다.

이렇게 `validate` 메서드를 사용하면 클라이언트로부터 제출된 데이터의 유효성을 검사하고, 필드 간의 관계를 확인하는 등의 추가적인 유효성 검사를 수행할 수 있습니다.

 

 

 

 

 

 

브라우저에서 확인하기

 

 

user3를 비밀번호를 2번에 걸쳐 똑같이 입력하니 회원가입이 정상적으로 진행되었습니다.

 

(위의 이미지에서는 비밀번호 입력란들이 비어져 있는데 블로그 개시를 위해 일부러 지운 것입니다.)