DJango 서버개발, 커스텀 유효성 검사기 작성하기

Django는 파이썬으로 만들어진 강력한 웹 프레임워크로, 웹 애플리케이션을 빠르고 쉽게 개발할 수 있는 다양한 기능을 제공합니다. 그중 하나가 데이터 유효성 검사기입니다. Django는 기본 제공 유효성 검사기를 통해 다양한 데이터 형식과 요구 사항을 처리할 수 있지만, 때로는 특정 비즈니스 로직이나 데이터 요구 사항에 맞게 커스텀 유효성 검사기를 작성해야 할 필요가 있습니다. 이 글에서는 Django에서 커스텀 유효성 검사기를 작성하는 방법을 상세히 알아보겠습니다.

1. 커스텀 유효성 검사기의 필요성

웹 애플리케이션에서는 입력 데이터가 유효한지 확인하는 것이 매우 중요합니다. 기본 제공되는 유효성 검사기들은 일반적인 경우에 잘 작동하지만, 특정 비즈니스 요구사항이나 데이터 구조에 따라서는 커스텀 유효성 검사기가 필요할 수 있습니다. 예를 들어, 다음과 같은 경우를 생각해 볼 수 있습니다.

  • 특정 형식의 문자열 검사
  • 이메일 주소의 도메인 확인
  • 비밀번호 강도 체크
  • 사용자의 고유한 필드 검사 (예: 사용자 이름의 유일성)

2. Django에 커스텀 유효성 검사기 작성하기

이제 Django에서 커스텀 유효성 검사기를 작성하는 방법을 살펴보겠습니다. 기본 구조는 아주 간단하며, 주로 validators.py 파일에 커스텀 유효성 검사기를 정의합니다.

2.1. 프로젝트 및 앱 설정하기

우선 Django 프로젝트와 앱을 설정해야 합니다. 다음과 같은 명령어로 새로운 프로젝트와 앱을 생성할 수 있습니다.

django-admin startproject myproject
cd myproject
python manage.py startapp myapp

그리고 settings.py 파일에 새로 만든 앱을 추가합니다:

INSTALLED_APPS = [
    ...
    'myapp',
]

2.2. 기본 유효성 검사기 작성하기

이제 myapp 디렉토리 내에 validators.py 파일을 생성하고 커스텀 유효성 검사기를 작성합니다. 예를 들어, 비밀번호 강도를 검사하는 유효성 검사기를 작성해보겠습니다.

from django.core.exceptions import ValidationError
import re

def validate_strong_password(value):
    if len(value) < 8:
        raise ValidationError(
            '비밀번호는 8자 이상이어야 합니다.'
        )
    if not re.search(r'\d', value):
        raise ValidationError(
            '비밀번호에는 숫자가 포함되어야 합니다.'
        )
    if not re.search(r'[A-Z]', value):
        raise ValidationError(
            '비밀번호에는 대문자가 포함되어야 합니다.'
        )
    if not re.search(r'[a-z]', value):
        raise ValidationError(
            '비밀번호에는 소문자가 포함되어야 합니다.'
        )
    if not re.search(r'[!@#$%^&*(),.?":{}|<>]', value):
        raise ValidationError(
            '비밀번호에는 특수문자가 포함되어야 합니다.'
        )

위의 코드에서 validate_strong_password 함수는 입력된 비밀번호가 특정 조건을 만족하는지 확인하고, 만족하지 않을 경우 ValidationError를 발생시킵니다.

2.3. 유효성 검사기 사용하기

커스텀 유효성 검사기를 정의한 후에는 모델의 필드에 적용할 수 있습니다. 예를 들어, 사용자가 등록할 때 비밀번호를 입력하는 필드에 해당 유효성 검사기를 적용해보겠습니다.

from django.db import models
from .validators import validate_strong_password

class User(models.Model):
    username = models.CharField(max_length=150, unique=True)
    password = models.CharField(max_length=128, validators=[validate_strong_password])

위의 코드에서 password 필드는 커스텀 유효성 검사기인 validate_strong_password를 사용하여 비밀번호의 유효성을 검사합니다.

3. 유효성 검사기 테스트하기

모델과 유효성 검사기를 작성한 후에는 이를 테스트하여 올바르게 작동하는지 확인해야 합니다. Django의 테스트 프레임워크를 사용하여 간단한 테스트 케이스를 작성해 보겠습니다.

from django.test import TestCase
from .models import User
from django.core.exceptions import ValidationError

class UserModelTest(TestCase):
    def test_strong_password(self):
        user = User(username='testuser')
        user.password = 'weak'
        with self.assertRaises(ValidationError):
            user.full_clean()

        user.password = 'StrongPass1!'
        try:
            user.full_clean()  # should not raise
        except ValidationError:
            self.fail('ValidationError raised unexpectedly!') 

위의 코드는 비밀번호가 유효하지 않을 경우 ValidationError가 발생하는지를 검증하는 테스트 케이스입니다. 약한 비밀번호를 입력하면 `full_clean()` 메서드는 예외를 발생시키고, 강력한 비밀번호를 입력하면 예외가 발생하지 않아야 합니다.

4. 여러 유효성 검사기 사용하기

하나의 필드에서 여러 개의 유효성 검사기를 사용할 수도 있습니다. 이 경우, validators 목록에 여러 유효성 검사기를 추가하면 됩니다.

from django.core.validators import RegexValidator

class User(models.Model):
    username = models.CharField(max_length=150, unique=True)
    password = models.CharField(
        max_length=128,
        validators=[
            validate_strong_password,
            RegexValidator(
                regex=r'^[a-zA-Z0-9!@#$%^&*()]+$',
                message='비밀번호에는 알파벳, 숫자 또는 특수문자만 포함되어야 합니다.',
            ),
        ]
    )

위의 코드는 비밀번호가 강력하면서도 특정 정규 표현식에 맞도록 요구하는 경우를 보여줍니다. 여러 유효성 검사기를 조합하여 더 정교한 검증 로직을 수행할 수 있습니다.

5. 관리자 페이지에서 유효성 검사기 사용하기

Django의 관리자 페이지에서도 커스텀 유효성 검사기를 적용할 수 있습니다. 관리자 페이지에서 사용자의 비밀번호를 입력할 때도 동일한 유효성 검사가 적용됩니다. 관리자 페이지의 모델 클래스를 등록하기 위해 admin.py 파일을 수정합니다.

from django.contrib import admin
from .models import User

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ('username',)
    search_fields = ('username',)

이제 Django의 관리자 페이지에서 사용자 등록 시 비밀번호 유효성 검사가 적용됩니다.

6. 결론

이번 글에서는 Django에서 커스텀 유효성 검사기를 작성하는 방법에 대해 알아보았습니다. 기본 제공 유효성 검사기로는 부족한 경우, 상황에 맞게 커스텀 유효성 검사기를 작성하여 데이터 유효성을 보장하고 사용자 경험을 향상시킬 수 있습니다. 이를 통해 더 안전하고 신뢰할 수 있는 웹 애플리케이션을 구축할 수 있습니다. Django의 강력한 기능을 활용하여 다양한 비즈니스 요구사항을 충족하는 유효성 검사기를 작성해보시기 바랍니다.

앞으로도 Django의 다양한 기능 소개와 실습을 통해 개발자로서의 역량을 키우실 수 있도록 다양한 주제를 다룰 예정입니다. 다음 강좌에서는 Django에서의 API 개발에 대해 깊이 있게 다룰 예정이니 많은 관심 부탁드립니다.