개발 문서/Django
Django ORM
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을 잘 활용하면 데이터베이스 작업을 간편하게 처리하고, 생산성을 크게 향상시킬 수 있습니다.