models.Model의 역할

먼저 Django에서 가장 기본적인 모델 클래스는 models.Model입니다. 모든 Django 모델은 models.Model을 상속받아 정의됩니다. 이 클래스는 내가 정의한 모델을 데이터베이스 테이블로 매핑해주는 역할을 합니다. 각 모델 클래스는 데이터베이스의 테이블이고, 그 안에 있는 필드들은 테이블의 열(columns)이 됩니다.

중요한 점은 models.Model을 상속받음으로써 기본적으로 사용할 수 있는 여러 유용한 메서드들이 제공된다는 것입니다:

  • save(): 데이터베이스에 객체를 저장하는 메서드
  • delete(): 객체를 삭제하는 메서드
  • objects.create(): 새로운 객체를 생성하고 저장하는 메서드
  • objects.filter(): 특정 조건을 만족하는 객체를 조회하는 메서드

이러한 기능 덕분에 models.Model을 상속받기만 하면 Django ORM의 강력한 기능을 손쉽게 사용할 수 있습니다.

AbstractUser와 CustomUser의 관계

Django에는 기본적으로 제공되는 auth.User라는 내장 사용자 모델이 있습니다. 이 모델을 기본적으로 사용할 수도 있지만, 대부분의 경우 사용자 모델을 커스터마이징하고 싶어 합니다. 예를 들어, 전화번호나 주소 같은 추가 필드를 넣고 싶을 때가 있습니다.

이때 사용하는 것이 바로 AbstractUser입니다. 이 클래스는 Django가 기본적으로 제공하는 사용자 모델(즉, auth.User)을 확장할 수 있도록 만들어진 추상 클래스입니다. AbstractUser 역시 models.Model을 상속받고 있으므로, 내가 AbstractUser를 상속받아 CustomUser를 정의하면 ORM의 모든 기능을 그대로 사용할 수 있습니다.

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)

이렇게 정의된 CustomUser 모델은 사용자 인증과 관련된 모든 기능을 제공하면서, 추가적인 필드를 자유롭게 정의할 수 있습니다.

models.Manager와 AbstractUserManager의 역할

Django 모델에서 models.Manager는 데이터베이스에 대한 쿼리를 처리하는 인터페이스 역할을 합니다. 기본적으로 제공되는 objects 매니저를 통해 데이터를 쉽게 조회하거나 조작할 수 있습니다. 예를 들어, filter(), get(), create() 같은 메서드들이 있습니다.

사용자 모델은 사용자 생성 로직이 필요할 때 AbstractUserManager를 활용할 수 있습니다. AbstractUserManagermodels.Manager를 상속받아 사용자 생성에 특화된 메서드(create_user(), create_superuser())를 제공합니다.

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

이렇게 사용자 생성 로직을 커스터마이징하여 CustomUserManager를 구현하면 더욱 유연하게 사용자 모델을 관리할 수 있습니다.

정리: 모델 클래스들 간의 관계

지금까지 Django의 모델 클래스들 간의 관계를 정리하면 다음과 같습니다:

  • models.Model: 모든 Django 모델의 기반 클래스. 이를 상속받아 데이터베이스와 매핑하며, ORM 기능을 제공.
  • AbstractUser: models.Model을 상속받은 추상 클래스. 이를 확장하여 CustomUser를 정의.
  • AbstractUserManager: models.Manager를 상속받아 사용자 생성 로직을 커스터마이징 가능.

이 구조를 이해하고 활용하면 Django의 모델 시스템을 더욱 효율적으로 설계할 수 있습니다.