📝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의 동작 방식

  1. models.Model을 상속하면 Django가 자동으로 ORM 기능을 추가함
  2. objects 매니저를 사용하여 데이터를 저장, 조회, 수정, 삭제할 수 있음
  3. _meta를 통해 모델의 테이블 정보 및 필드를 확인할 수 있음

즉, Python의 상속 개념을 확실히 이해하면 Django ORM뿐만 아니라 객체지향 프로그래밍(OOP)도 더 깊이 이해할 수 있다.

+ Recent posts