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)

위와 같은 방식으로 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
이와 같은 매니저를 활용하면, 사용자 생성 과정에서 발생할 수 있는 여러 상황에 맞게 유연하게 대응할 수 있다. AbstractUserManager
도 models.Manager
에서 확장된 것이므로, 기본적인 데이터베이스 쿼리 기능을 모두 포함하고 있다.
Django 모델 상속 구조의 이해
Django의 모델 상속 구조를 이해하면, 모델 설계와 구현을 더욱 효율적으로 할 수 있다. 이를 간단히 정리하면 다음과 같다:
models.Model
: 모든 Django 모델의 기반 클래스이며, 데이터베이스와 매핑되면서 ORM 기능을 제공한다.AbstractUser
:models.Model
을 상속받은 추상 클래스. 이를 상속하여CustomUser
를 만들면models.Model
의 기능을 포함한 커스텀 사용자 모델을 쉽게 정의할 수 있다.AbstractUserManager
:models.Manager
를 상속받은 사용자 생성에 특화된 매니저. 이를 통해 사용자 생성 로직을 간편하게 커스터마이징할 수 있다.
결론적으로, Django의 모델 구조는 매우 유연하면서도 강력하게 설계되어 있다. 사용자 모델을 확장해 커스텀 필드를 추가할 때도, AbstractUser
와 models.Model
이 제공하는 ORM 기능과 구조를 이해하고 활용하면 더욱 효율적이고 확장 가능한 데이터베이스 설계를 할 수 있다. Django의 이러한 모델 구조를 잘 활용하면, 개발자가 더 적은 노력으로 복잡한 데이터베이스 모델을 구축할 수 있다.
Add a New Comment