안녕하세요. 오늘도 배트맨입니다.🦇
이번 글은 일상글이 아니라서 속상하신가요!
오늘은 Django 백엔드 개발 중 Auth 기능을 구현하면서 저를 힘들게 했던 내용에 대해서 기록용으로 포스팅하려고 합니다. 바쁘신 분들은 '절정-결말'만 읽어도 무방하나, 제 글은 결코 '서론-본론-결론'의 구조처럼 딱딱하지 않으니 좋은 말로 할때 읽어보세요^^

저는 사용자 경험을 중요하게 생각하는 편인데, 웹 애플리케이션을 개발하다 보면 사용자에게 제공되는 에러 메시지가 직관적이고 이해하기 쉬운지 고민할 때가 있습니다. 이번 포스팅에서는 Django의 Auth에서 제공하는 기본 문구가 어색하게 느껴져서 수정했던 과정을 단계별로 설명드리겠습니다.
우선 처음에는 에러 메시지들이 영어인게 불편했습니다.
"This password is too short. It must contain at least 8 characters."
"This password is too common."
이런 식으로 제공이 되었고, 이것을 우리말로 수정해야겠다고 생각했고, 시도했던 방법은!
1. settings 파일에서 언어 변경하기
프로젝트의 settings.py 파일에서 언어 설정을 변경할 수 있습니다. 프로젝트의 기본 언어를 한국어로 변경하려면 다음과 같이 설정합니다.
# settings.py
LANGUAGE_CODE = 'ko-kr'
이렇게 설정하면 Django가 제공하는 기본 메시지와 에러 메시지가 한국어로 표시됩니다.
에러메시지는 한글로 잘 출력이 되었지만, '하..이거 아닌데..' 싶었습니다.
기본 제공되는 한글 메시지가 너무 어색하게 느껴져서 사용자 경험에는 문제가 있다고 판단이 되었습니다.
"이 비밀번호는 너무 짧습니다. 최소 8자 이상이어야 합니다."
"이 비밀번호는 너무 흔합니다."
(누가봐도 구글 번역기 돌린 느낌이라서..)
그래서 제가 처음 선택한 방법은 !
2. forms 파일에서 error_messages 수정하기 (시행착오)
처음에는 Django의 폼 파일에서 직접 error_messages를 수정했습니다. 하지만, settings.py 파일의 AUTH_PASSWORD_VALIDATORS에 정의된 django 기본 Validator가 우선순위를 가지기 때문에 해당 방법이 적용이 되지 않아 실패했습니다.
# forms.py (시행착오 코드)
from django import forms
from django.contrib.auth.forms import UserCreationForm
class CustomUserCreationForm(UserCreationForm):
class Meta:
'''
생략
'''
error_messages = {
'username': {
'unique': '이미 사용 중인 사용자 이름입니다.',
},
'password1': {
'required': '비밀번호를 입력해 주세요.',
'min_length': '비밀번호는 최소 8자 이상이어야 합니다.',
'password_mismatch': '비밀번호가 일치하지 않습니다.',
'common_password': '비밀번호가 너무 흔합니다. 다른 비밀번호를 사용해주세요.',
'password_validation_failed': '비밀번호 검증에 실패했습니다. 유효한 비밀번호를 입력하세요.',
}
}
끝내 제가 마지막으로 시도한 방법은
3. Custom Validator 구현하기
Validator의 에러 메시지를 오버라이딩하는 커스텀 Validator를 만드는 방법입니다.
3-1. 우선 Auth 앱의 루트 디렉토리에 validators.py 파일을 생성해줍니다.
# validators.py
# 전체 코드
from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _
from django.contrib.auth.password_validation import (
UserAttributeSimilarityValidator as BaseUserAttributeSimilarityValidator,
MinimumLengthValidator as BaseMinimumLengthValidator,
CommonPasswordValidator as BaseCommonPasswordValidator,
NumericPasswordValidator as BaseNumericPasswordValidator,
)
class UserAttributeSimilarityValidator(BaseUserAttributeSimilarityValidator):
def __init__(self, user_attributes=None, max_similarity=0.7, message=None):
self.user_attributes = user_attributes or ['username', 'email', 'first_name', 'last_name']
self.max_similarity = max_similarity
self.message = message or _('비밀번호가 사용자 정보와 너무 유사합니다.')
def validate(self, password, user=None):
super().validate(password, user)
raise ValidationError(self.message, code='password_too_similar')
class MinimumLengthValidator(BaseMinimumLengthValidator):
def __init__(self, min_length=8, message=None):
self.min_length = min_length
self.message = message or _('비밀번호는 최소 %(min_length)d자 이상이어야 합니다.') % {'min_length': self.min_length}
def validate(self, password, user=None):
if len(password) < self.min_length:
raise ValidationError(self.message, code='password_too_short')
class CommonPasswordValidator(BaseCommonPasswordValidator):
def __init__(self, message=None):
self.message = message or _('비밀번호가 너무 흔합니다. 다른 비밀번호를 사용하세요.')
def validate(self, password, user=None):
super().validate(password, user)
raise ValidationError(self.message, code='password_too_common')
class NumericPasswordValidator(BaseNumericPasswordValidator):
def __init__(self, message=None):
self.message = message or _('비밀번호에 숫자 외에 문자를 포함해주세요.')
def validate(self, password, user=None):
super().validate(password, user)
raise ValidationError(self.message, code='password_entirely_numeric')
3-2. settings.py 파일에서 Custom Validator 등록하기
작성한 커스텀 Validator를 settings.py 파일의 AUTH_PASSWORD_VALIDATORS에 추가합니다.
# settings.py
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'auth.validators.UserAttributeSimilarityValidator',
},
# 나머지 Validator도 같은 방식으로
]
결과적으로 제가 원하는 에러 메시지를 출력할 수 있게 되었습니다.
요약
1. settings.py 에서 언어 설정을 변경했지만 기본 제공 메시지가 어색함
2. form 파일에서 error_messages를 수정하는 방법은 AUTH_PASSWORD_VALIDATORS의 우선순위 때문에 실패
3. Validator 커스터마이징으로 성공
커스텀 Validator 작성법 참고하셔서 더 나은 사용자 경험을 제공해보세요!
| [Django] 배포 후 Admin 페이지 CSS 깨짐 현상 (2) | 2025.07.24 |
|---|---|
| [Django-Model] Choices 필드 레이블 표시 방법 (0) | 2024.07.09 |
| [Django] 개발 환경 세팅 (0) | 2024.06.28 |
| [Python] 윈도우 cmd 에서 python 명령어 안 될 때 (0) | 2024.06.20 |
| [Django Error] 에러 getaddrinfo failed (0) | 2023.06.21 |
댓글 영역