User, AbstractUser, AbstractBaseUser 모델 설명
기본 적으로 Django에서는 User
모델을 제공합니다. 이 모델은 사용자 정보를 저장하고 인증을 처리하는 기능을 제공합니다. 하지만, 프로젝트에 따라 사용자 모델을 커스터마이징해야 하는 경우가 있습니다.
이번 시간에는 Django에서 제공하는 User
모델을 커스터마이징하는 방법에 대해 알아보겠습니다.
이를 활용하여 도서관 관리 시스템(Library Management System, LMS)의 사용자 모델을 손쉽게 커스터마이징할 수 있습니다.
1. models.Model vs AbstractUser vs AbstractBaseUser
Django에서 사용자 모델을 커스터마이징하는 방법은 크게 세 가지가 있습니다.
-
models.Model
을 상속받아 새로운 사용자 모델을 정의하는 방법 -
AbstractUser
를 상속받아 새로운 사용자 모델을 정의하는 방법 -
AbstractBaseUser
를 상속받아 새로운 사용자 모델을 정의하는 방법
2. User 모델
Django 에서 기본적으로 제공하는 User
모델은 django.contrib.auth.models
모듈에 정의되어 있습니다.
즉, 이 모델은 models.Model을 상속받아 정의된 모델이며, 만약, 이 모델을 커스터마이징하고 싶다면, AbstractUser
또는 AbstractBaseUser
를 상속받아 새로운 사용자 모델을 정의해야 합니다.
models.Model
을 상속받아 새로운 사용자 모델을 정의하는 방법은 권장되지 않습니다. 왜냐하면, 이 방법은 Django의 기본 사용자 모델을 사용하는 것과 큰 차이가 없기 때문입니다.
3. AbstractBaseUser 모델
AbstractBaseUser
모델은 Django에서 제공하는 사용자 모델 중 가장 기본적인 모델입니다. 이 모델은 가장 기본적인 인증 기능만 제공하며, 사용자 이름, 이메일, 비밀번호 등의 필드만을 가지고 있습니다.
이 모델을 상속받아 새로운 사용자 모델을 정의하면, 사용자 모델을 완전히 커스터마이징할 수 있습니다.
하지만, 이 모델은 인증 기능만을 제공하므로, 사용자 모델을 커스터마이징할 때, 추가적인 기능을 구현해야 합니다.
아울러, AbstractBaseUser
모델을 사용할 때에는 AbstractBaseUser
모델을 상속받아 새로운 사용자 모델을 정의하고, BaseUserManager
클래스를 사용하여 사용자를 생성하고 관리해야 합니다.
여기서 BaseUserManager
클래스는 사용자를 생성하고 관리하는 기능을 제공하는 클래스입니다.
결과적으로, AbstractBaseUser
모델을 사용할 때에는 사용자 모델을 완전히 커스터마이징할 수 있지만, 추가적인 기능을 구현해야 하며, BaseUserManager
클래스를 사용하여 사용자를 생성하고 관리해야 합니다.
class CustomMinimalUser(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=100, unique=True)
is_active = models.BooleanField(default=True)
USERNAME_FIELD = 'email' # 로그인에 사용할 필드
objects = CustomUserManager() # 커스텀 매니저 필요
class CustomMinimalUser(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=100, unique=True)
is_active = models.BooleanField(default=True)
USERNAME_FIELD = 'email' # 로그인에 사용할 필드
objects = CustomUserManager() # 커스텀 매니저 필요
4. AbstractUser 모델
AbstractUser
모델은 AbstractBaseUser
모델을 상속받아 사용자 모델을 정의한 모델입니다. 이 모델은 AbstractBaseUser
모델에 추가적인 필드와 메서드를 제공합니다.
AbstractUser
모델을 사용하면, 사용자 모델을 커스터마이징할 때, 추가적인 필드와 메서드를 쉽게 추가할 수 있습니다.
이 모델은 AbstractBaseUser
모델과 달리, 사용자 이름, 이메일, 비밀번호 등의 필드를 기본적으로 제공하므로, 추가적인 필드와 메서드를 정의할 때, AbstractBaseUser
모델보다 쉽게 구현할 수 있습니다.
결과적으로, AbstractUser
모델을 사용할 때에는 사용자 모델을 커스터마이징할 때, 추가적인 필드와 메서드를 쉽게 추가할 수 있으며, AbstractBaseUser
모델보다 쉽게 구현할 수 있습니다.
class CustomFullUser(AbstractUser):
role = models.CharField(max_length=10, choices=[
('ADMIN', '관리자'),
('USER', '사용자')
])
phone = models.CharField(max_length=11)
# username, email 등 기본 필드 자동 포함
class CustomFullUser(AbstractUser):
role = models.CharField(max_length=10, choices=[
('ADMIN', '관리자'),
('USER', '사용자')
])
phone = models.CharField(max_length=11)
# username, email 등 기본 필드 자동 포함
# 1. AbstractUser 사용 (권장)
from django.contrib.auth.models import AbstractUser
class LibraryUser(AbstractUser):
ROLE_CHOICES = [
('LIBRARIAN', '사서'),
('MEMBER', '회원')
]
role = models.CharField(max_length=10, choices=ROLE_CHOICES)
phone = models.CharField(max_length=11, blank=True)
# 2. AbstractBaseUser 사용 (완전 커스텀 필요시)
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, email, password=None):
user = self.model(email=self.normalize_email(email))
user.set_password(password)
user.save()
return user
class MinimalUser(AbstractBaseUser):
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
objects = UserManager()
USERNAME_FIELD = 'email'
# 3. models.Model 사용 (비권장)
class CustomUser(models.Model):
email = models.EmailField(unique=True)
username = models.CharField(max_length=100, unique=True)
is_active = models.BooleanField(default=True)
# 1. AbstractUser 사용 (권장)
from django.contrib.auth.models import AbstractUser
class LibraryUser(AbstractUser):
ROLE_CHOICES = [
('LIBRARIAN', '사서'),
('MEMBER', '회원')
]
role = models.CharField(max_length=10, choices=ROLE_CHOICES)
phone = models.CharField(max_length=11, blank=True)
# 2. AbstractBaseUser 사용 (완전 커스텀 필요시)
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, email, password=None):
user = self.model(email=self.normalize_email(email))
user.set_password(password)
user.save()
return user
class MinimalUser(AbstractBaseUser):
email = models.EmailField(unique=True)
is_active = models.BooleanField(default=True)
objects = UserManager()
USERNAME_FIELD = 'email'
# 3. models.Model 사용 (비권장)
class CustomUser(models.Model):
email = models.EmailField(unique=True)
username = models.CharField(max_length=100, unique=True)
is_active = models.BooleanField(default=True)
5. 주의 사항
- AbstractUser 모델을 등록하려면 앱 폴더에 있는 admin.py 파일에 등록해야 합니다.
# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
"""
사용자 모델: AbstractUser를 상속받아 기본 인증 시스템 활용
기본 필드: username, password, email, first_name, last_name, is_staff, is_active, date_joined
"""
# ... 추가 필드 및 메서드 정의
# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
"""
사용자 모델: AbstractUser를 상속받아 기본 인증 시스템 활용
기본 필드: username, password, email, first_name, last_name, is_staff, is_active, date_joined
"""
# ... 추가 필드 및 메서드 정의
# accounts/admin.py
from django.contrib import admin
from .models import User
admin.site.register(User)
# accounts/admin.py
from django.contrib import admin
from .models import User
admin.site.register(User)
- AbstractUser 모델을 상속받아 클래스를 만들었을 경우 Django Settings에
AUTH_USER_MODEL
을 설정해주어야 합니다.
# settings.py
AUTH_USER_MODEL = 'accounts.User'
# settings.py
AUTH_USER_MODEL = 'accounts.User'
# 다른 앱의 모델에서 사용
# books/models.py
from django.conf import settings
class Book(models.Model):
title = models.CharField(max_length=200)
owner = models.ForeignKey(
settings.AUTH_USER_MODEL, # settings.py에 설정된 사용자 모델
on_delete=models.CASCADE
)
# 다른 앱의 모델에서 사용
# books/models.py
from django.conf import settings
class Book(models.Model):
title = models.CharField(max_length=200)
owner = models.ForeignKey(
settings.AUTH_USER_MODEL, # settings.py에 설정된 사용자 모델
on_delete=models.CASCADE
)
- 아울러 마이그레이션 순서도 주의해야 합니다. 사용자 모델을 변경할 때, 마이그레이션 순서를 잘 지켜야 합니다.
# 프로젝트 시작할 때 바로 설정해야 함
# 이미 migrate를 한 후에는 변경이 매우 복잡함
# settings.py
AUTH_USER_MODEL = 'accounts.User'
# 프로젝트 시작할 때 바로 설정해야 함
# 이미 migrate를 한 후에는 변경이 매우 복잡함
# settings.py
AUTH_USER_MODEL = 'accounts.User'
python manage.py makemigrations accounts # Custom User 모델이 있는 앱 먼저
python manage.py makemigrations # 나머지 앱들
python manage.py migrate
python manage.py makemigrations accounts # Custom User 모델이 있는 앱 먼저
python manage.py makemigrations # 나머지 앱들
python manage.py migrate
6. 정리

models.Model
을 상속받아 새로운 사용자 모델을 정의하는 방법은 권장되지 않습니다.AbstractBaseUser
모델을 상속받아 새로운 사용자 모델을 정의하면, 사용자 모델을 완전히 커스터마이징할 수 있습니다.AbstractUser
모델을 상속받아 새로운 사용자 모델을 정의하면, 사용자 모델을 커스터마이징할 때, 추가적인 필드와 메서드를 쉽게 추가할 수 있습니다.AbstractUser
모델은AbstractBaseUser
모델에 추가적인 필드와 메서드를 제공합니다.AbstractBaseUser
모델을 사용할 때에는AbstractBaseUser
모델을 상속받아 새로운 사용자 모델을 정의하고,BaseUserManager
클래스를 사용하여 사용자를 생성하고 관리해야 합니다.BaseUserManager
클래스는 사용자를 생성하고 관리하는 기능을 제공하는 클래스입니다.AbstractUser
모델을 사용할 때에는 사용자 모델을 커스터마이징할 때, 추가적인 필드와 메서드를 쉽게 추가할 수 있으며,AbstractBaseUser
모델보다 쉽게 구현할 수 있습니다.AbstractUser
모델을 사용할 때에는 Django Settings에AUTH_USER_MODEL
을 설정해주어야 합니다.AbstractUser
모델은AbstractBaseUser
모델과 달리, 사용자 이름, 이메일, 비밀번호 등의 필드를 기본적으로 제공하므로, 추가적인 필드와 메서드를 정의할 때,AbstractBaseUser
모델보다 쉽게 구현할 수 있습니다.