멘토링

멘토링 Django ORM심화 (8회차 정리 250527)

Chansman 2025. 5. 27. 23:03

📌 장고 ORM에서 역참조란 무엇인가?

역참조는 ForeignKey를 가지고 있지 않은 모델에서 ForeignKey를 가진 모델을 참조하는 것을 의미하며, _set 또는 related_name을 사용하여 접근할 수 있습니다.


💡 역참조 시 related_name을 사용하는 이유는?

_set 대신 더 의미 있는 이름으로 변경하여 가독성을 높이기 위해 사용합니다.


🎥 이 멘토링 세션에서는 Django ORM을 활용한 모델 생성, 정참조/역참조, 필터링, 최적화 기법까지 전반적인 흐름을 실습 중심으로 다룹니다.


  1. 🤖 DRF와 백엔드 지식의 한계
  • DRF는 깊이 있는 전달은 어렵지만, 실습 수준에서는 지원 가능함.
  • 대신 Django 기반의 백엔드 지식은 대부분 설명할 수 있으며, 가능한 한 도움을 줄 예정임.
  1. 📚 가상 환경과 앱 개발의 이해
  • 프로젝트마다 Python 버전과 라이브러리가 달라질 수 있으므로, 가상환경 사용이 필수적임.
  • conda, poetry, PyCharm 등 자신에게 익숙한 도구 중 하나를 잘 사용하는 것이 중요함.
  • 앱 생성 후 가장 먼저 해야 할 일은 settings.py에 앱을 등록하는 것임.
  1. 🍵 카테고리/서브카테고리 모델 설정 및 on_delete 옵션
  • on_delete=models.CASCADE: 부모 객체가 삭제되면 자식 객체도 자동으로 삭제됨.
  • on_delete=models.SET_NULL: 부모 객체가 삭제될 경우 자식 객체의 ForeignKey 값을 null로 설정함.
  • models.ForeignKey를 사용해 관계 설정 후 마이그레이션 진행함.
  1. ☕ 정참조 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)
  • __(더블 언더스코어)를 이용해 관계를 타고 들어가며 필터링할 수 있음.
  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")     # 높은 가격부터 정렬
  1. 📊 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를 통해 성능을 최적화할 수 있음
  1. 🛠️ 타입 힌트 및 테스트 코드 활용
  • Python은 타입 선언이 강제되지 않지만, 타입 힌트는 가독성과 유지보수에 도움을 줌
def get_price(item: Coffee) -> int:
    return item.price
  • TypeScript나 Java는 타입 지정이 필수이며, 테스트 코드 작성이 일반적임
  • Python에서도 습관적으로 타입을 명시하는 것이 좋은 코드 작성에 도움이 됨

✅ 마무리 요약

  • 역참조는 ForeignKey의 반대 방향 참조이며 _set 또는 related_name으로 접근
  • __ 연산자와 필드명을 활용해 관계 필터링 가능
  • select_related / prefetch_related를 통해 성능을 개선할 수 있음
  • 타입 힌트를 적극 활용하면 코드 품질과 협업 효율성이 향상됨