이전 포스트에서 Django의 ORM을 통해 데이터를 다루는 방법, 즉 CRUD(Create, Read, Update, Delete) 작업에 대해 소개했습니다. 이번에는 그 예시에서 사용한 objects
관리자가 정확히 무엇인지, 그리고 어떻게 구성되어 있으며 무엇을 할 수 있는지를 좀 더 깊이 있게 분석해 보려고 합니다. objects
는 Django ORM을 제대로 이해하기 위해 반드시 알아야 하는 중요한 개념입니다.
1. objects
관리자란 무엇인가?
Django 모델의 기본 구조에서 가장 자주 등장하는 것이 바로 objects
라는 매니저입니다. objects
는 Django의 모델 관리자(Manager)라고 불리며, 데이터베이스 레코드를 조회하거나 조작하는 역할을 담당합니다. 쉽게 말해, objects
관리자는 모델 클래스와 데이터베이스 간의 다리 역할을 합니다.

모델 클래스의 기본 속성인 objects
는 Django에서 제공하는 Manager 클래스의 인스턴스입니다. 이 인스턴스를 통해 데이터베이스와 소통하며 데이터를 생성, 검색, 수정, 삭제 등의 작업을 수행하게 됩니다. 예를 들어, Post.objects.all()
이나 Post.objects.create()
와 같은 메서드를 사용하여 데이터에 접근할 수 있습니다.
2. Manager 클래스의 역할
Manager 클래스는 Django 모델에 기본적으로 부여되는 데이터베이스와의 인터페이스입니다. 이를 통해 여러 가지 쿼리를 수행할 수 있습니다. 기본적으로 Django는 각 모델에 대해 자동으로 objects
라는 이름의 Manager
를 생성해주며, 이 Manager
를 사용하여 대부분의 CRUD 작업을 처리합니다.
CRUD가 어떻게 objects
를 통해 구현되는지는 이미 어느 정도 알고 계시거나 경험이 있으실 것입니다. 예시 코드는 이전 편에서 다루었으므로 여기서는 생략하겠습니다.
3. 커스텀 Manager 만들기
기본 제공되는 objects
관리자는 매우 유용하지만, 때로는 특정한 쿼리 로직을 재사용하거나 더 복잡한 조회를 해야 할 필요가 있습니다. 이런 경우에는 커스텀 매니저를 만들어서 원하는 기능을 추가할 수 있습니다.
3.1 커스텀 Manager 클래스 정의하기
예를 들어, 게시물이 공개된 것만 필터링하는 커스텀 매니저를 만들어 보겠습니다.
from django.db import models
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='published')
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
status = models.CharField(max_length=10, choices=[('draft', 'Draft'), ('published', 'Published')])
publish_date = models.DateTimeField(auto_now_add=True)
# 기본 objects 매니저 외에 커스텀 매니저 추가
published = PublishedManager()
위 예제에서 PublishedManager
라는 커스텀 매니저를 정의하고, 이를 Post
모델에 추가하였습니다. 이 PublishedManager
는 게시물의 상태가 'published'
인 것만 필터링하여 반환합니다. 이제 Post.published.all()
을 호출하면 공개된 게시물만 가져올 수 있습니다.
3.2 커스텀 매니저의 활용
- 중복 코드 감소: 매번 필터링 조건을 추가하는 대신, 커스텀 매니저를 사용하면 코드의 중복을 줄일 수 있습니다.
- 특화된 쿼리 로직 캡슐화: 특정 비즈니스 로직에 맞게 쿼리 로직을 커스터마이징하여 모델 내에서 깔끔하게 관리할 수 있습니다.
4. objects
매니저로 할 수 있는 다양한 작업
Django의 objects
매니저는 기본적으로 제공되는 CRUD 기능 외에도 더 다양한 데이터베이스 작업을 지원합니다.
4.1 데이터 필터링
filter()
: 조건에 맞는 여러 개의 객체를 조회합니다.published_posts = Post.objects.filter(status='published')
exclude()
: 특정 조건에 맞지 않는 객체를 조회합니다.draft_posts = Post.objects.exclude(status='published')
4.2 정렬 및 슬라이싱
- 정렬:
order_by()
메서드를 사용해 데이터를 정렬할 수 있습니다.recent_posts = Post.objects.all().order_by('-publish_date')
- 슬라이싱: Python의 리스트 슬라이싱처럼, 쿼리셋에서도 슬라이싱을 통해 특정 범위의 데이터를 가져올 수 있습니다.
first_three_posts = Post.objects.all()[:3]
4.3 집계 함수 사용하기
objects
매니저는 집계 함수도 제공합니다. 예를 들어 게시물의 개수를 알고 싶다면 count()
메서드를 사용할 수 있습니다.
post_count = Post.objects.count()
또한 aggregate()
메서드를 사용하여 평균, 합계 등의 집계 연산을 수행할 수도 있습니다.
from django.db.models import Avg
average_length = Post.objects.aggregate(Avg('content_length'))
5. objects
매니저의 동작 원리
objects
매니저는 내부적으로 쿼리셋(QuerySet)이라는 객체를 생성합니다. 쿼리셋은 데이터베이스로부터 데이터를 가져오기 위한 질의의 모음입니다. objects.all()
이나 objects.filter()
와 같은 메서드가 호출될 때마다 Django는 쿼리셋을 생성하고, 필요할 때 해당 쿼리를 데이터베이스에 전달하여 결과를 가져옵니다.
쿼리셋은 지연 평가(lazy evaluation)를 사용합니다. 이는 쿼리셋을 생성할 때 실제로 데이터베이스에 접근하는 것이 아니라, 데이터를 필요로 하는 시점에 데이터베이스 쿼리를 실행하는 방식입니다. 이를 통해 불필요한 쿼리 실행을 방지하고, 효율적인 데이터 처리를 할 수 있게 됩니다.
이번 편을 마치며
Django의 objects
관리자는 데이터베이스와의 상호작용을 단순화하고, 더 쉽게 데이터를 다룰 수 있도록 도와주는 강력한 도구입니다. 기본 제공되는 CRUD 기능 외에도, 커스텀 매니저를 정의하여 특정 쿼리 로직을 재사용하거나 더 복잡한 작업을 간단히 처리할 수 있습니다. 또한, 쿼리셋의 지연 평가와 같은 특성 덕분에 효율적인 데이터 처리도 가능합니다.
Django ORM의 objects
매니저에 대해 깊이 이해하면, 데이터베이스를 더 효율적으로 다루고, 코드의 중복을 줄이면서 깔끔하게 작성할 수 있습니다. 앞으로 모델 관리자의 활용도를 더욱 높이고, 필요할 때마다 커스텀 매니저를 도입해 보세요. 이는 웹 애플리케이션의 복잡한 데이터 처리를 훨씬 더 쉽고 유연하게 해 줄 것입니다.
다음 편에서는 쿼리셋(QuerySet)과 데이터 조회에 대해 자세히 다뤄보겠습니다. ORM의 장점 중 하나가 "SQL을 몰라도 된다"는 점인데, 이러한 장점을 제대로 활용하려면 다음 편의 내용이 굉장히 중요할 것입니다. 다음 편도 기대해 주세요.
Add a New Comment