📝Django ORM과 클래스 상속 원리
📌 1. Python에서 클래스 상속이란?
✅ 자식 클래스가 부모 클래스를 상속받으면 부모 클래스의 속성과 메서드를 자동으로 물려받는다. ✅ Python은 MRO (Method Resolution Order) 를 사용하여 메서드를 찾는 순서를 결정한다. ✅ 자식 클래스에서 부모 클래스의 메서드를 오버라이딩하면, 부모 클래스의 메서드는 실행되지 않는다. ✅ super()를 사용하면 부모 클래스의 메서드를 명시적으로 호출할 수 있다.
🔹 기본적인 클래스 상속 예제
class Parent:
def greet(self):
return "안녕하세요! (부모)"
class Child(Parent):
pass # 부모 클래스를 그대로 상속
child = Child()
print(child.greet()) # 안녕하세요! (부모)
✅ Child 클래스에는 greet() 메서드가 없지만, Parent에서 상속받았기 때문에 사용 가능하다.
🔹 자식 클래스에서 부모 메서드를 오버라이딩
class Child(Parent):
def greet(self): # 부모의 메서드를 덮어씀
return "안녕하세요! (자식)"
child = Child()
print(child.greet()) # 안녕하세요! (자식)
✅ Child 클래스에서 greet()을 재정의(오버라이딩)하면, 부모 클래스의 greet()는 실행되지 않는다.
🔹 super()를 사용해서 부모 클래스의 메서드 호출하기
class Child(Parent):
def greet(self):
return super().greet() + " 그리고 안녕하세요! (자식)"
child = Child()
print(child.greet()) # 안녕하세요! (부모) 그리고 안녕하세요! (자식)
✅ super().greet()을 호출하면 부모 클래스의 greet() 메서드도 함께 실행된다.
📌 2. Django에서 models.Model을 상속받으면?
✅ Django에서 models.Model을 상속받으면 Django ORM 기능을 자동으로 사용할 수 있다. ✅ 내부적으로 Django ORM이 objects와 같은 클래스 변수를 자동으로 추가한다. ✅ Django ORM의 상속 구조를 확인하면 models.Model을 거쳐 object까지 연결되어 있다.
🔹 Django ORM의 클래스 상속 구조 확인
from django.db import models
class Post(models.Model): # Django ORM 모델
title = models.CharField(max_length=200)
content = models.TextField()
print(Post.__mro__)
✅ 출력 결과:
(<class '__main__.Post'>, <class 'django.db.models.Model'>, <class 'django.db.models.base.ModelBase'>, <class 'object'>)
✅ 즉, Post → Model → ModelBase → object 순서로 메서드를 찾는다. ✅ 그래서 Post.objects.all() 같은 ORM 기능이 자동으로 동작한다.
📌 3. Django ORM이 자동으로 추가하는 클래스 변수
Django는 models.Model을 상속받으면 다음과 같은 클래스 변수를 자동으로 추가한다.
클래스 변수 역할
| objects | 기본 매니저 (데이터를 조회, 저장, 삭제할 수 있음) |
| _meta | 모델의 메타 정보 (테이블 이름, 필드 정보 등) |
| DoesNotExist | get()을 사용할 때 데이터가 존재하지 않으면 발생하는 예외 |
| MultipleObjectsReturned | get()을 사용할 때 여러 개의 데이터가 반환되면 발생하는 예외 |
| id (기본 키) | Django가 자동으로 추가하는 기본 키 (Primary Key) |
🔹 objects는 어떻게 생성될까?
✅ objects는 Django ORM이 자동으로 추가하는 클래스 변수이며, 기본적으로 BaseManager의 인스턴스이다. ✅ Django 내부에서 models.Model을 정의할 때, BaseManager를 상속하여 objects가 자동으로 추가된다.
class Model:
objects = BaseManager() # Django가 자동으로 추가하는 클래스 변수
✅ 따라서 Post.objects.all()을 실행하면, BaseManager의 all() 메서드를 호출하게 된다.
🔹 objects와 all()의 원리
✔️ Python에서 일반적인 클래스 메서드 예제
class Manager:
def all(self):
return "나는 all() 메서드야!"
class Post:
objects = Manager() # 클래스 변수로 Manager 객체 추가
# 클래스 변수인 objects를 통해 all() 메서드 호출
print(Post.objects.all()) # 나는 all() 메서드야!
📌 즉, objects는 Manager 객체를 가지고 있고, all()은 그 Manager 객체의 메서드야! 🚀
✔️ Django ORM에서 all()의 실제 동작
all_posts = Post.objects.all() # 모든 데이터 가져오기
📌 이것은 내부적으로 SELECT * FROM Post;
=> SQL로 변환됨!
✔️ Django 내부에서 all() 메서드는 이렇게 정의됨
class Manager:
def all(self):
return "데이터베이스에서 모든 데이터를 가져옴"
# Django ORM에서 Post.objects.all()의 원리
print(Post.objects.all()) # 데이터베이스에서 모든 데이터를 가져옴
📌 즉, all()은 objects가 가진 메서드이고, Post.objects.all()처럼 사용할 수 있는 것.
다른 클래스 변수들도 이런 식으로 사용이 가능하고, 각 클래스내 정의된 메서드도 위와 같은 방식으로 사용가능.
📌 4. 최종 정리
✅ 클래스 상속의 원리
- 부모 클래스의 속성과 메서드를 자식 클래스가 자동으로 상속받는다.
- Python 내부적으로 MRO(Method Resolution Order)를 사용해 메서드 탐색 순서를 정한다.
- super()를 사용하면 부모 클래스의 메서드를 명시적으로 호출할 수 있다.
✅ Django에서 models.Model을 상속하면?
- Django ORM의 모든 기능(objects.all(), .save() 등)을 자동으로 사용할 수 있다.
- Django ORM은 내부적으로 _meta, objects, DoesNotExist 같은 클래스 변수를 자동으로 추가한다.
✅ Django ORM의 동작 방식
- models.Model을 상속하면 Django가 자동으로 ORM 기능을 추가함
- objects 매니저를 사용하여 데이터를 저장, 조회, 수정, 삭제할 수 있음
- _meta를 통해 모델의 테이블 정보 및 필드를 확인할 수 있음
즉, Python의 상속 개념을 확실히 이해하면 Django ORM뿐만 아니라 객체지향 프로그래밍(OOP)도 더 깊이 이해할 수 있다.
'Django' 카테고리의 다른 글
| Django코드 VS Python 코드 : 웹 개발 내 각각 역할 비교 및 분석 (0) | 2025.01.20 |
|---|---|
| Django의 아키텍쳐 설계 및 원칙 (0) | 2025.01.20 |
| Djagno - 프로젝트 내 url / app 내 url의 관계 및 역할 (0) | 2025.01.20 |
| Django 개발 WORKFLOW (1) | 2025.01.20 |