Django는 Python으로 작성된 웹 프레임워크로, 개발자들이 더 빠르고 효율적으로 웹 애플리케이션을 구축할 수 있도록 돕습니다. 특히 Django의 ORM(Object Relational Mapping)은 데이터베이스와 상호작용을 간단하고 직관적으로 처리할 수 있는 강력한 도구입니다. 하지만 프로젝트 규모가 커지고 복잡도가 높아질수록, 모델 관리를 효율적으로 구성하는 것이 더욱 중요해집니다.
이번 글에서는 Django 프로젝트에서 Base Model 활용, Soft Delete 구현, Manager 커스터마이징이라는 세 가지 핵심 방법을 통해 모델을 효율적으로 관리하는 팁을 알려드릴게요. 이를 통해 프로젝트를 더 깔끔하고 유지보수하기 쉽게 만들 수 있습니다. 🚀
Base Model은 여러 모델에서 공통으로 사용되는 필드와 로직을 하나의 **추상 모델(Abstract Model)**로 정의하는 방식입니다. 이를 활용하면 반복 코드를 줄이고 프로젝트의 일관성을 유지할 수 있습니다.
예를 들어, 많은 프로젝트에서 created_at
(생성 시간)과 updated_at
(수정 시간)을 포함하는 경우가 많습니다. 이를 Base Model로 정의해볼까요?
from django.db import models
class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
이제 다른 모델에서 BaseModel
을 상속받아 사용할 수 있습니다.
class Product(BaseModel):
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
created_at
과 updated_at
필드를 반복해서 정의할 필요가 없습니다.
Soft Delete는 데이터를 삭제할 때 실제로 데이터베이스에서 제거하지 않고, 삭제 상태를 나타내는 필드(예: is_deleted
)를 업데이트하는 방식입니다. 이렇게 하면 삭제된 데이터를 복구하거나 감사(Audit) 목적으로 보관할 수 있습니다.
is_deleted
필드 추가Soft Delete를 지원하는 추상 모델을 만들어봅시다.
class SoftDeleteModel(BaseModel):
is_deleted = models.BooleanField(default=False)
class Meta:
abstract = True
delete()
메서드 커스터마이징
데이터를 실제로 삭제하지 않고 is_deleted
값을 True
로 변경합니다.
class Product(SoftDeleteModel):
name = models.CharField(max_length=255)
def delete(self, using=None, keep_parents=False):
self.is_deleted = True
self.save()
Soft Delete를 구현할 때 Manager를 커스터마이징하면 더욱 효율적으로 데이터를 관리할 수 있습니다.
class SoftDeleteQuerySet(models.QuerySet):
def delete(self):
self.update(is_deleted=True)
class SoftDeleteManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_deleted=False)
class Product(SoftDeleteModel):
name = models.CharField(max_length=255)
objects = SoftDeleteManager.from_queryset(SoftDeleteQuerySet)()
Django의 Manager
는 데이터베이스 쿼리를 처리하는 인터페이스 역할을 합니다. 이를 커스터마이징하면 모델별로 데이터 접근 방식을 최적화할 수 있습니다.
is_active
필드와 available_at
필드를 기반으로, 활성화된 데이터만 조회하는 Manager를 만들어보겠습니다.
from django.utils import timezone
class ActiveManager(models.Manager):
def active(self):
return self.get_queryset().filter(is_active=True, available_at__lte=timezone.now())
class Product(BaseModel):
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)
available_at = models.DateTimeField()
objects = ActiveManager()
# 사용법
active_products = Product.objects.active()
Django에서 효율적인 모델 관리는 프로젝트의 성공과 유지보수성에 직결됩니다. 이번 글에서 소개한 Base Model 활용, Soft Delete 구현, Manager 커스터마이징 세 가지 방법은 프로젝트를 더 구조적이고 효율적으로 만드는 데 큰 도움이 됩니다.
이제 여러분의 Django 프로젝트에 위의 팁들을 적용해보세요! 코드는 더 깔끔해지고, 작업 속도도 한층 빨라질 것입니다. 🖥✨
Soft Delete는 데이터가 물리적으로 삭제되지 않기 때문에 테이블 크기가 커질 수 있습니다. 따라서 정기적으로 데이터 아카이빙(Archiving)이나 최적화 작업을 수행하는 것이 좋습니다.
필수는 아니지만, 데이터 접근 로직이 반복되거나 특정 조건이 항상 필요하다면 Manager를 커스터마이징하는 것이 효율적입니다.
Base Model은 abstract = True
로 설정된 추상 클래스이기 때문에 데이터베이스 테이블로 생성되지 않습니다. 반면 일반 모델은 테이블로 생성됩니다.
상담만 받아보셔도 좋습니다 긱다이브의 상담으로 업체 비교를 시작해보세요