copg 2025. 3. 16. 18:35
728x90
반응형

Django의 가장 강력한 기능 중 하나는 바로 **ORM(Object Relational Mapper)**입니다. ORM은 개발자가 SQL을 직접 작성하지 않고도 데이터베이스를 관리할 수 있게 해줍니다. 이번 포스팅에서는 초보자도 쉽게 이해할 수 있도록 Django ORM에 대해 상세하게 설명하겠습니다.


🔍 Django ORM이란?

ORM(Object Relational Mapper)은 객체 지향 언어로 작성된 코드와 관계형 데이터베이스 사이를 자동으로 연결하여 관리해주는 기술입니다.

  • ORM의 역할: 객체와 데이터베이스 간의 변환을 처리하여 SQL 쿼리를 작성하지 않아도 데이터를 관리할 수 있도록 도와줍니다.

🛠️ Django 모델 정의하기

Django에서는 데이터베이스 테이블을 Python 클래스 형태로 정의합니다. 이를 '모델(Model)'이라고 부릅니다.

모델 예제

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.IntegerField(default=0)

    def __str__(self):
        return self.name

위의 코드로 Django는 자동으로 Product라는 데이터베이스 테이블을 생성합니다.


📌 CRUD 기본 사용법

Create (생성)

product = Product.objects.create(name="Laptop", price=1200.99, stock=10)

Read (조회)

  • 모든 데이터 조회
products = Product.objects.all()
  • 특정 조건 조회
laptop = Product.objects.get(name="Laptop")
  • 필터 조회
expensive_products = Product.objects.filter(price__gt=1000)

Update (수정)

product = Product.objects.get(id=1)
product.price = 1100.50
product.save()

Delete (삭제)

product = Product.objects.get(id=1)
product.delete()

🎯 Django ORM 고급 사용법

Foreign Key (관계)

class Category(models.Model):
    name = models.CharField(max_length=100)

class Product(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)

관계 데이터 접근법

category = Category.objects.get(name="Electronics")
products = category.product_set.all()

🚀 QuerySet 메서드 활용

  • exclude: 특정 조건 제외 조회
cheap_products = Product.objects.exclude(price__gte=500)
  • order_by: 정렬 조회
products = Product.objects.order_by('-price')
  • annotate: 집계 함수 추가
from django.db.models import Count
categories = Category.objects.annotate(product_count=Count('product'))

⚡ 성능 최적화

select_related & prefetch_related

  • 관계 데이터를 효율적으로 가져옵니다.
products = Product.objects.select_related('category').all()

인덱스 설정

인덱스를 설정하여 데이터 조회 속도를 개선할 수 있습니다.

class Product(models.Model):
    name = models.CharField(max_length=200, db_index=True)

🛡️ Django ORM 주의사항

  • N+1 쿼리 문제를 방지하기 위해 select_related, prefetch_related 사용
  • 데이터베이스 성능을 위해 쿼리 최적화를 항상 고려하세요.

🌟 결론

Django ORM을 잘 활용하면 데이터베이스 작업을 간편하게 처리하고, 생산성을 크게 향상시킬 수 있습니다.