✅ Django에서 사용자(User) 모델을 설정하는 3가지 방법과 사용법 정리
1️⃣ 기본 User 모델 사용 (권장 ❌)
from django.contrib.auth.models import User
- Django에서 기본 제공하는 User 모델 사용
- username, email, password 등 기본 필드만 사용 가능
- settings.py에서 따로 AUTH_USER_MODEL 설정 필요 없음
❌ 단점:
- 필드 추가 불가
- 실무에서 확장성 부족
- 추후 변경 불가능 (초기 마이그레이션 이후 커스텀 불가)
2️⃣ AbstractUser 상속 방식 (⭐ 가장 많이 쓰는 방식)
# user/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone = models.CharField(max_length=20, null=True, blank=True) # 예시: 사용자 전화번호
# settings.py
AUTH_USER_MODEL = "user.CustomUser"
- 기본 User 모델 구조를 유지하면서 필드만 추가 가능
- Django 인증 시스템 기능 (is_authenticated, login, admin, groups) 그대로 사용 가능
✅ 장점:
- 기본 기능 + 확장성 확보
- 실무에서 추천되는 안전한 방법
⚠️ 주의:
- 반드시 migrate 이전에 AUTH_USER_MODEL 설정해야 함
3️⃣ AbstractBaseUser 직접 구현 (고급)
# user/models.py
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError("Email is required")
user = self.model(email=self.normalize_email(email), **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
# settings.py
AUTH_USER_MODEL = "user.CustomUser"
✅ 장점:
- 인증 로직과 필드를 전부 내 입맛대로 커스터마이징 가능
❌ 단점:
- 구현이 복잡하고 에러 발생 가능성 높음
- UserAdmin 등도 따로 등록해야 함
🔧 AUTH_USER_MODEL 설정의 의미와 중요성
- Django 전체에서 사용할 사용자 모델을 지정하는 설정
- 기본값은 'auth.User', 커스터마이징할 경우 반드시 설정 필요
# settings.py
AUTH_USER_MODEL = 'user.CustomUser'
왜 필요할까?
- Django의 모든 인증 관련 기능 (get_user_model(), 로그인 폼, 관리자 등)이 이 설정을 기준으로 사용자 모델을 참조함
- 이 설정 없이 CustomUser를 정의하면 Django는 여전히 auth.User를 사용하려고 하며, 충돌 발생함
언제 설정해야 하나?
- 프로젝트 초기, 최초 마이그레이션 전
- makemigrations 이후에 바꾸면 기존 DB 구조와 충돌함 → 에러 발생
You cannot change AUTH_USER_MODEL after the first migration
✅ settings.py와 models.py 정리 예시
📁 user/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=20, null=True, blank=True)
📁 user/apps.py
from django.apps import AppConfig
class UserConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'user'
📄 settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user.apps.UserConfig',
# 기타 앱들...
]
AUTH_USER_MODEL = 'user.CustomUser'
🎯 요약 정리
방식 상속 대상 인증 기능 유지 필드 커스터마이징 실무 권장
기본 User | User | ✅ | ❌ | ❌ |
AbstractUser | AbstractUser | ✅ | ✅ | ⭐ 추천 |
AbstractBaseUser | AbstractBaseUser | ❌ (직접 구현) | ✅ | 고급용 |
실무에서는 AbstractUser 방식이 가장 안전하고 많이 사용됩니다.
'기술블로그-Django편' 카테고리의 다른 글
🔐 SHA-256 복호화? 가능한가요? (0) | 2025.05.12 |
---|---|
✅ Django 모델 필드 설정: null=True 와 blank=True 차이 완벽 정리 (0) | 2025.05.12 |
[Python 개발 필수 3대 도구 비교 정리: venv, pyenv, poetry] (0) | 2025.05.12 |
📌 IP 주소와 Port란? 인터넷 통신의 핵심 개념 시각화 정리 (0) | 2025.05.12 |
📌 Poetry vs pyenv 차이점 완전 정리 (0) | 2025.05.12 |