Django 어플리케이션을 개발하면서 우리가 가장 먼저 접하는 것 중 하나가 바로 models.Model을 상속받는 기본적인 데이터베이스 모델이다. 많은 튜토리얼에서 단순히 따라해보며 익히긴 하지만, 그 구조와 원리를 조금 더 깊이 파고들면 Django ORM의 장점을 더욱 효과적으로 활용할 수 있다. 이 글에서는 Django 모델의 상속 구조와 커스텀 사용자 모델을 정의하는 방법을 중심으로 Django의 모델 시스템이 어떻게 구성되는지 자세히 살펴보려 한다.


models.Model: 모든 모델의 기반이 되는 클래스

Django에서 모든 모델 클래스는 models.Model을 상속받는다. 이 models.Model 클래스가 바로 데이터베이스 테이블과 매핑되는 역할을 한다. 각 모델은 데이터베이스 테이블이 되고, 모델의 필드는 테이블의 열이 된다. 이 기본 클래스가 제공하는 메서드들이 바로 Django ORM의 핵심 기능을 가능하게 하는 요소들이다.

  • save(): 객체를 데이터베이스에 저장
  • delete(): 객체 삭제
  • objects.create(): 객체 생성 후 저장
  • objects.filter(): 조건을 만족하는 객체 조회

models.Model을 상속받는 것만으로도 Django의 ORM 기능을 자유자재로 사용할 수 있는 것이다. 이는 Django ORM이 얼마나 강력하게 설계되었는지를 보여주는 예시 중 하나다.


AbstractUser와 CustomUser: 확장 가능한 사용자 모델

Django는 기본적으로 auth.User 모델을 제공하지만, 프로젝트마다 사용자 모델을 확장하고 커스터마이징하는 요구는 흔하다. AbstractUser는 이러한 확장성을 고려해 제공되는 Django의 추상 사용자 모델이다. 예를 들어, 이메일 필드를 추가하거나, 전화번호나 주소 같은 필드를 더하고 싶을 때 사용된다.

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

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=15, blank=True)
    address = models.CharField(max_length=255, blank=True)
Django model inheritance structure

위와 같은 방식으로 CustomUser를 정의하면, AbstractUser의 기능을 그대로 가져오면서도 커스텀 필드를 추가할 수 있다. AbstractUser 역시 models.Model을 상속받기 때문에, Django ORM의 기본 메서드들을 그대로 사용할 수 있다.


models.Manager와 AbstractUserManager: 데이터베이스 쿼리와 사용자 생성 로직

모델의 매니저 역할을 하는 models.Manager는 데이터베이스에 대한 쿼리를 처리하는 인터페이스로서, objects라는 기본 매니저를 통해 filter(), get(), create() 같은 메서드를 사용할 수 있게 해준다. CustomUser처럼 사용자 모델에 특화된 매니저가 필요한 경우, Django는 AbstractUserManager라는 매니저 클래스를 제공한다. 이 클래스를 통해 사용자 생성과 관련된 로직을 커스터마이징할 수 있다.

from django.contrib.auth.models import BaseUserManager

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        # 사용자 생성 로직
        pass

    def create_superuser(self, email, password=None, **extra_fields):
        # 슈퍼유저 생성 로직
        pass

이와 같은 매니저를 활용하면, 사용자 생성 과정에서 발생할 수 있는 여러 상황에 맞게 유연하게 대응할 수 있다. AbstractUserManagermodels.Manager에서 확장된 것이므로, 기본적인 데이터베이스 쿼리 기능을 모두 포함하고 있다.


Django 모델 상속 구조의 이해

Django의 모델 상속 구조를 이해하면, 모델 설계와 구현을 더욱 효율적으로 할 수 있다. 이를 간단히 정리하면 다음과 같다:

  1. models.Model: 모든 Django 모델의 기반 클래스이며, 데이터베이스와 매핑되면서 ORM 기능을 제공한다.
  2. AbstractUser: models.Model을 상속받은 추상 클래스. 이를 상속하여 CustomUser를 만들면 models.Model의 기능을 포함한 커스텀 사용자 모델을 쉽게 정의할 수 있다.
  3. AbstractUserManager: models.Manager를 상속받은 사용자 생성에 특화된 매니저. 이를 통해 사용자 생성 로직을 간편하게 커스터마이징할 수 있다.

결론적으로, Django의 모델 구조는 매우 유연하면서도 강력하게 설계되어 있다. 사용자 모델을 확장해 커스텀 필드를 추가할 때도, AbstractUsermodels.Model이 제공하는 ORM 기능과 구조를 이해하고 활용하면 더욱 효율적이고 확장 가능한 데이터베이스 설계를 할 수 있다. Django의 이러한 모델 구조를 잘 활용하면, 개발자가 더 적은 노력으로 복잡한 데이터베이스 모델을 구축할 수 있다.