[Django] Django Form 과 DRF 에서의 유효성 검사 : validators

msung99·2023년 9월 6일
0
post-thumbnail

Validator?

Validator는 한마디로 "유효성 검사기" 입니다. Validator는 "유효성 검사기"란 말그대로 field에 특정한 제약조건을 걸어두는 것입니다. 예로 회원가입시 이메일과 비밀번호, 마지막으로 전화번호를 입력할때 양식에 맞게 기입해야하는 Validator를 만들어 봤습니다.

validators.py

import re

from django.forms import ValidationError


REGEX_EMAIL        = '^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
REGEX_PASSWORD     = '^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$'
REGEX_PHONE_NUMBER = '\d{3}-\d{3,4}-\d{4}'

def email_validate(email):
    if not re.match(REGEX_EMAIL, email):
                raise ValidationError("이메일 형식이 아닙니다.")

def password_validate(password):
    if not re.match(REGEX_PASSWORD, password):
                raise ValidationError("비밀번호 양식이 맞지 않습니다.")

def phone_number_validate(phone_number):
    if not re.match(REGEX_PHONE_NUMBER, phone_number):
                raise ValidationError("전회번호 양식이 맞지 않습니다.")

validators.py 라는 파일을 생성후 Validator들을 만들어 주었다. 이메일, 비밀번호와 연락처의 정규표현식을 각각 REGEX_EMAIL, REGEX_PASSWORD, REGEX_PHONE_NUMBER 변수에 선언해줍니다.

그리고 각각의 validate 함수를 선언후, 변수에 저장해둔 정규표현식과 함수의 매개변수를 re.match를 통해 비교해줍니다. 만약 정규표현식과 맞지 않는다면 ValidationError에 전달해줄 메시지를 통해 에러처리를 해줍니다.


DRF 에서의 검증

그렇다면 DRF 에서의 검증은 어떻게 수행할까요? Django REST 프레임워크 직렬 변환기의 유효성 검사는 Django의 ModelForm 클래스에서 유효성 검사가 작동하는 방식과 약간 다르게 처리됩니다.

ModelForm 에서 검증은 부분적으로 form에서 그리고 부분적으로 모델 인스턴스에서 수행됩니다. 반면 ModelSerializer 를 사용하면 이 모든 것이 자동으로 처리됩니다. 대신 Serializer 클래스를 사용하도록 드롭다운하려면 유효성 검사 규칙을 명시적으로 정의해야 합니다.

예시

아래와 같은 간단한 모델을 정의했다고 해봅시다.

class MyModel(models.Model):
    time_raised = models.DateTimeField(default=timezone.now, editable=False)
    reference = models.CharField(unique=True, max_length=20)
    description = models.TextField()

다음은 MyModel 의 인스턴스를 생성하거나 업데이트하는 데 사용할 수 있는 기본 ModelSerializer 입니다.

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomerReportRecord

Django 셸을 열면 이제 아래와 같은 결과를 얻을 수 있습니다.

MyModelSerializer():
    id = IntegerField(label='ID', read_only=True)
    time_raised = DateTimeField(read_only=True)
    reference = CharField(max_length=20, validators=[<UniqueValidator(queryset=CustomerReportRecord.objects.all())>])
    description = CharField(style={'type': 'textarea'})

생각 정리

Validator 는 매우 편리한 기능입니다. 우선 데이터의 일관성 유지 가 가능하겠죠. Validator를 사용함으로써 데이터의 품질과 일관성을 유지할 수 있습니다. 예를 들어, 이메일 필드에는 실제 이메일 형식이 들어가야 하며, 나이 필드에는 0보다 큰 정수값이 들어가야 한다는 등의 규칙을 적용할 수 있습니다.

또한 재사용성 도 높아질 겁니다. Validator는 재사용 가능하며 여러 곳에서 동일한 검증 로직을 적용할 수 있기 때문이죠!


참고

profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글