멘토링
멘토링 Django ORM심화 (8회차 정리 250527)
Chansman
2025. 5. 27. 23:03
📌 장고 ORM에서 역참조란 무엇인가?
역참조는 ForeignKey를 가지고 있지 않은 모델에서 ForeignKey를 가진 모델을 참조하는 것을 의미하며, _set 또는 related_name을 사용하여 접근할 수 있습니다.
💡 역참조 시 related_name을 사용하는 이유는?
_set 대신 더 의미 있는 이름으로 변경하여 가독성을 높이기 위해 사용합니다.
🎥 이 멘토링 세션에서는 Django ORM을 활용한 모델 생성, 정참조/역참조, 필터링, 최적화 기법까지 전반적인 흐름을 실습 중심으로 다룹니다.
- 🤖 DRF와 백엔드 지식의 한계
- DRF는 깊이 있는 전달은 어렵지만, 실습 수준에서는 지원 가능함.
- 대신 Django 기반의 백엔드 지식은 대부분 설명할 수 있으며, 가능한 한 도움을 줄 예정임.
- 📚 가상 환경과 앱 개발의 이해
- 프로젝트마다 Python 버전과 라이브러리가 달라질 수 있으므로, 가상환경 사용이 필수적임.
- conda, poetry, PyCharm 등 자신에게 익숙한 도구 중 하나를 잘 사용하는 것이 중요함.
- 앱 생성 후 가장 먼저 해야 할 일은 settings.py에 앱을 등록하는 것임.
- 🍵 카테고리/서브카테고리 모델 설정 및 on_delete 옵션
- on_delete=models.CASCADE: 부모 객체가 삭제되면 자식 객체도 자동으로 삭제됨.
- on_delete=models.SET_NULL: 부모 객체가 삭제될 경우 자식 객체의 ForeignKey 값을 null로 설정함.
- models.ForeignKey를 사용해 관계 설정 후 마이그레이션 진행함.
- ☕ 정참조 vs 역참조 개념
4.1. 정참조
- Coffee → SubCategory: ForeignKey 필드를 통해 직접 참조함.
- .sub_category.name처럼 점 접근 방식으로 사용할 수 있음.
4.2. 역참조
- SubCategory → Coffee: 어떤 Coffee 인스턴스들이 자신을 참조하고 있는지 알 수 없음.
- 기본 접근 방식: sub_category.coffee_set.all()
- related_name='coffees' 설정 시 → sub_category.coffees.all() 사용 가능
4.3. related_name의 장점
- _set 대신 더 직관적인 이름으로 지정 가능함.
- 여러 모델에서 같은 이름이 중복되는 것을 방지할 수 있음.
4.4. 관계 필터링 (__)
- 예: 카테고리 ID가 1인 커피 검색
Coffee.objects.filter(sub_category__category__id=1)
- __(더블 언더스코어)를 이용해 관계를 타고 들어가며 필터링할 수 있음.
- 🔍 필터링, 슬라이싱, 컨테인, 정렬
5.1. 가격 필터링
Coffee.objects.filter(price__gt=5000) # 5000보다 큰 가격
Coffee.objects.filter(price__lte=3000) # 3000 이하 가격
5.2. 문자열 포함 검색
Coffee.objects.filter(description__icontains="계란") # 대소문자 무시
Coffee.objects.filter(description__contains="계란") # 대소문자 구분
5.3. 슬라이싱 (오프셋/리미트)
Coffee.objects.all()[1:3] # 인덱스 1부터 2까지 (3은 미포함)
5.4. 정렬
Coffee.objects.order_by("price") # 낮은 가격부터 정렬
Coffee.objects.order_by("-price") # 높은 가격부터 정렬
- 📊 ORM 최적화 기법
6.1. select_related (정참조 최적화)
Coffee.objects.select_related("sub_category").all()
- 정참조 관계인 ForeignKey를 한 번의 쿼리로 미리 불러올 수 있음
6.2. prefetch_related (역참조 최적화)
SubCategory.objects.prefetch_related("coffees").all()
- 역참조 또는 ManyToMany 관계는 별도 쿼리로 가져와 메모리에서 조합함
6.3. 반복 쿼리 줄이기
- .all() 이후 .name처럼 접근 시, 매번 DB 쿼리가 발생할 수 있음
- select_related 또는 prefetch_related를 통해 성능을 최적화할 수 있음
- 🛠️ 타입 힌트 및 테스트 코드 활용
- Python은 타입 선언이 강제되지 않지만, 타입 힌트는 가독성과 유지보수에 도움을 줌
def get_price(item: Coffee) -> int:
return item.price
- TypeScript나 Java는 타입 지정이 필수이며, 테스트 코드 작성이 일반적임
- Python에서도 습관적으로 타입을 명시하는 것이 좋은 코드 작성에 도움이 됨
✅ 마무리 요약
- 역참조는 ForeignKey의 반대 방향 참조이며 _set 또는 related_name으로 접근
- __ 연산자와 필드명을 활용해 관계 필터링 가능
- select_related / prefetch_related를 통해 성능을 개선할 수 있음
- 타입 힌트를 적극 활용하면 코드 품질과 협업 효율성이 향상됨