개발 문서/Django

Django 기본 유저 모델과 Custom 유저 모델의 차이점 완벽 정리

copg 2025. 3. 15. 02:06
728x90
반응형

Django 프로젝트를 시작할 때 개발자들이 흔히 고민하는 부분 중 하나는 바로 사용자(User) 모델입니다. Django는 기본적으로 사용자 모델을 제공하지만, 특정 프로젝트에서는 기본 모델로는 부족한 경우가 있습니다. 이번 포스팅에서는 Django 기본 유저 모델과 Custom 유저 모델의 차이점을 상세하게 살펴보겠습니다.

1. Django 기본 유저 모델이란?

Django는 인증(Authentication)과 권한 관리 시스템을 내장하고 있으며, 이 시스템의 핵심은 바로 기본 User 모델입니다.

기본 유저 모델의 특징

  • 기본 필드: username, first_name, last_name, email, password
  • 손쉬운 구현: 프로젝트 설정 즉시 사용 가능
  • 내장 관리(admin) 페이지와 완벽 호환

언제 사용해야 할까?

  • 간단한 웹사이트 또는 프로토타입
  • 별도의 추가 필드가 필요 없는 프로젝트

2. Custom 유저 모델이란?

Custom 유저 모델은 Django의 기본 유저 모델을 확장하거나 완전히 재정의하여 프로젝트의 요구사항에 맞는 사용자 정의 필드를 추가할 수 있습니다.

Custom 유저 모델의 특징

  • 추가 필드 설정 가능 (전화번호, 생년월일 등)
  • 이메일 기반 로그인 구현 가능
  • 비즈니스 로직에 맞는 사용자 관리 가능

Custom 유저 모델을 사용하는 상황

  • 유저 식별을 이메일로 하고 싶을 때
  • 회원가입 시 더 많은 개인 정보가 필요할 때
  • 복잡한 권한 관리나 사용자 관련 로직이 있을 때

3. Django 기본 유저 모델과 Custom 유저 모델의 주요 차이점

구분 Django 기본 User 모델 Custom User 모델

확장성 제한적 매우 높음
구현 난이도 쉬움 다소 복잡함
로그인 방식 username 기반 이메일 기반으로 설정 가능
유지보수 용이 주의 필요 (초기 설정 주의)

4. Custom 유저 모델 구현 방법 간단 요약

Custom 유저 모델 구현은 크게 두 가지 방법이 있습니다.

AbstractUser 상속 방식

  • Django 기본 User의 모든 필드를 포함
  • 기존 필드를 그대로 사용하면서 추가 필드를 확장할 때 사용
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=20)

AbstractBaseUser 상속 방식

  • 완전히 새로운 User 모델 정의 가능
  • 이메일 등 특정 필드를 username 대신 기본 식별자로 설정할 때 유리
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from django.contrib.auth.base_user import BaseUserManager

class UserManager(BaseUserManager):
    def create_user(self, email, password, **extra_fields):
        user = self.model(email=self.normalize_email(email), **extra_fields)
        user.set_password(password)
        user.save()
        return user

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=30)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']

    objects = UserManager()