본문 바로가기
Python/Django

Django 객체 추상화(모델 클래스 상속)

by 좌우지간에 2025. 1. 13.

 

 

객체 추상화: 모델 클래스 재사용의 핵심

Django 모델을 설계하다 보면 여러 모델에서 공통적으로 사용되는 속성(예: 생성 시간, 수정 시간 등)을 발견하게 됩니다. 이러한 공통 속성을 매번 각 모델에 반복해서 정의하는 것은 비효율적일 뿐만 아니라 코드의 유지보수성을 떨어뜨립니다. 이때 객체 지향 프로그래밍의 핵심 개념 중 하나인 추상화가 빛을 발합니다.

상속을 이용한 코드 재사용의 한계

모델 클래스를 만들 때, 공통 속성들을 별도의 클래스로 만들고 이를 다른 모델 클래스들이 상속받도록 하는 방법은 언뜻 보기에 좋은 아이디어처럼 보일 수 있습니다. 예를 들어, 다음과 같이 TimeStampModel이라는 클래스를 만들어 모든 모델에 시간 관련 속성을 추가할 수 있습니다.

#models.py

from django.db import models
from django.utils import timezone

class TimeStampModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    # ... 다른 공통 속성들 ...

class Post(TimeStampModel):
    title = models.CharField(max_length=200)
    content = models.TextField()

class Comment(TimeStampModel):
    text = models.TextField()

하지만 이 코드에는 치명적인 문제가 있습니다. TimeStampModel 클래스 자체가 models.Model을 상속받았기 때문에 Django는 이 클래스를 하나의 독립적인 모델로 인식하고 데이터베이스에 테이블을 생성하려고 시도합니다. 즉, TimeStampModel 테이블이 실제로 데이터베이스에 생성되어버리고, 이는 우리가 원하던 결과가 아닙니다. 우리는 단순히 코드 재사용을 원했을 뿐, 데이터베이스에 불필요한 테이블을 추가하고 싶지는 않았습니다.

추상화를 위해서 ,  abstract = TrueAbstractUser

이러한 문제를 해결하기 위해 Django는 모델 클래스에 Meta 클래스를 정의하고, 그 안에 abstract = True 설정을 추가하는 방법을 제공합니다. abstract = True로 설정된 클래스는 데이터베이스 테이블을 생성하지 않는 추상 클래스가 됩니다. 다시 말해, 데이터베이스에 직접적으로 영향을 주지 않으면서도 상속을 통해 공통 속성을 재사용할 수 있게 해줍니다.

#models.py

from django.db import models
from django.utils import timezone

class TimeStampModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Post(TimeStampModel):
    title = models.CharField(max_length=200)
    content = models.TextField()

class Comment(TimeStampModel):
    text = models.TextField()

위 코드에서 TimeStampModelMeta 클래스에 abstract = True를 추가함으로써, Django는 TimeStampModel에 대한 테이블을 생성하지 않습니다. 대신 Post 모델과 Comment 모델은 TimeStampModelcreated_atupdated_at 필드를 상속받아, 데이터베이스 테이블에 해당 필드를 추가하게 됩니다.

Django의 AbstractUser 클래스

이러한 추상 클래스의 개념은 Django의 커스텀 유저 모델을 만들 때도 동일하게 적용됩니다. Django는 기본 유저 모델을 제공하기 위해 django.contrib.auth.models 모듈에 AbstractUser 클래스를 제공합니다. AbstractUser 클래스 역시 abstract = True로 설정된 추상 클래스입니다. 따라서, 여러분이 AbstractUser를 상속받아 커스텀 유저 모델을 만들 때, AbstractUser 자체의 테이블이 생성되는 것이 아니라, 여러분이 만든 커스텀 유저 모델에 AbstractUser가 가진 모든 필드와 기능을 상속받는 것입니다.

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    # ... 추가 필드 정의 ...
    pass

추상화의 이점

  • 코드 중복 제거: 여러 모델에 반복되는 속성들을 한 곳에서 관리함으로써 코드 중복을 줄이고, 일관성을 유지할 수 있습니다.
  • 유지보수 용이성 향상: 공통 속성에 변경이 필요할 때, 추상 클래스만 수정하면 상속받은 모든 모델에 변경사항이 적용되므로 유지보수가 용이해집니다.
  • 데이터베이스 구조 단순화: 불필요한 테이블 생성을 방지하여 데이터베이스 구조를 간결하게 유지할 수 있습니다.
  • 모델 설계의 유연성: 추상 클래스를 통해 모델 설계의 유연성을 높이고, 다양한 조합의 모델을 쉽게 구성할 수 있습니다.
  • Django 내장 기능과의 조화: AbstractUser와 같이 Django에서 제공하는 기본 클래스들을 상속하여, Django의 내장 기능을 활용하면서도 유연하게 모델을 확장할 수 있습니다.

결론

abstract = True 설정을 통해 Django 모델에서 클래스를 추상화하는 것은 코드 재사용성을 높이고 데이터베이스 설계를 간결하게 유지하는 강력한 방법입니다. 특히 커스텀 유저 모델을 만들 때 Django의 AbstractUser 클래스처럼 이미 추상 클래스로 제공되는 모델을 활용하는 것이 효율적인 모델 설계의 핵심입니다. 

'Python > Django' 카테고리의 다른 글

DRF학습전 API, RESTful API 미리보기  (1) 2025.01.16
Django form활용 유효성검사  (1) 2025.01.14
Django RDBMS 코드예시  (0) 2025.01.10
관계형 데이터베이스 보충  (3) 2025.01.09
Django AUTH USER 사용자 모델  (2) 2025.01.08