프로젝트 시작부터 커스텀 유저 모델로 설계하는 이유와 방법

Django 프로젝트에서 기본 User 모델의 한계를 극복하고 확장성 있는 유저 시스템을 구축하기 위해 프로젝트 시작 시점에 커스텀 유저 모델을 설정하는 방법

기본 User 모델의 한계

필드 확장의 어려움

  • 기본 User 모델은 username, password, email 등 고정된 필드만 제공

  • 닉네임, 휴대폰 번호, 프로필 이미지 등 추가 필드 확장의 제약

인증 방식의 경직성

  • username을 주요 식별자로 사용하는 구조

  • 현대 웹 서비스에서 선호하는 이메일 기반 로그인 구현의 복잡성

마이그레이션 후 변경 불가능

  • 첫 migrate 실행 후 AUTH_USER_MODEL 변경 시 프로젝트 재시작 수준의 작업 필요

커스텀 유저 모델 설계 전략

AbstractUser 상속

  • 기본 User 모델의 모든 필드와 기능 상속

  • 추가 필드만 정의하면 되는 간단한 구조

  • 대부분의 프로젝트에서 권장되는 방식

AbstractBaseUser 상속

  • password 관리 등 최소한의 인증 기능만 상속

  • 로그인 ID 필드부터 완전히 새로운 설계 가능

  • 완벽한 커스터마이징이 필요한 경우에만 사용

실전 구현 방법

모델 작성

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
    nickname = models.CharField(max_length=30, unique=True, null=True, blank=True)
    phone_number = models.CharField(max_length=15, null=True, blank=True)

settings.py 설정

INSTALLED_APPS = [
    # 기본 앱들...
    'users',  # users 앱 추가
]

AUTH_USER_MODEL = 'users.User'  # 첫 migrate 전 필수 설정

사용 예시

from django.contrib.auth import get_user_model

User = get_user_model()

실무 활용 팁

유저 모델 참조 방법

  • 다른 앱에서 User 모델 직접 import 금지

  • settings.AUTH_USER_MODEL 또는 get_user_model() 함수 사용

  • 재사용 가능한 앱 구조 유지

이메일 기반 로그인

class User(AbstractUser):
    username = None
    email = models.EmailField(unique=True)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

Last updated