클래스 추상화
- 여러 모델, 뷰 등에서 공통적으로 사용하는 코드를 부모 클래스로 분리해 재사용
- 코드 중복 제거: 동일한 필드나 메서드를 여러 클래스에 반복해서 쓰지 않아도 됨
- 쉬운 유지보수: 공통으로 관리하므로 기능 추가나 확장, 수정하기 쉬움
- 추상화된 클래스는 데이터베이스에 테이블 생성이 안됨
- Meta 클래스의 `abstract = True`로 지정하면 추상 클래스로 설정되어 테이블로 생성되지 않음
- 자식 클래스만 테이블 생성됨
- 주로 모델 클래스에 적용
- 뷰에서도 공통 로직(템플릿 등)을 모아 부모 클래스로 작성한 후 상속받아 사용할 수 있음
- 모델 파일 사용 예시) blog/models.py
- 기존 Post, Tag 클래스는 model.Model을 상속받기 때문에 중복 코드들을 한 클래스(TimestampedModel)에 넣고, 그 클래스를 상속 받으면 중복 코드를 줄일 수 있음
- TimestampedModel은 공통 타임스탬프 필드를 관리하는 클래스로, 모든 테이블에서 생성 및 수정 시각 설정 필드를 반복해 사용하면 추상 클래스로 정의 가능
- StatusModel은 공통 권한 필드를 관리하는 클래스로, is_active, is_verified 같은 상태 필드가 필요하다면 추상 클래스로 분리
# 부모 클래스
class TimestampedModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True) # 생성 시각 자동 설정
updated_at = models.DateTimeField(auto_now=True) # 수정 시각 자동 설정
class Meta:
abstract = True # 추상 클래스로 설정 -> 데이터베이스에 테이블 생성 안됨
# 추상 클래스를 상속받는 자식 클래스
class Post(TimestampedModel):
title = models.CharField(max_length=100)
content = models.TextField()
class Tag(TimestampedModel):
name = models.CharField(max_length=40)
def __str__(self):
return self.name
- 다중 상속 가능
- 여러 공통 속성을 포함하는 추상 모델을 상속 받을 수 있음
- 상속 순서와 중복된 필드 처리 주의
class TimeStampedModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class StatusModel(models.Model):
is_active = models.BooleanField(default=True)
class Meta:
abstract = True
# 다중 상속 사용
class Product(TimeStampedModel, StatusModel):
name = models.CharField(max_length=100)
# 자동으로 created_at, updated_at, is_active 필드 가짐
파이썬 클래스 추상화
더보기
abc 모듈을 사용해 추상 클래스를 정의하고 이를 상속받는 클래스에서 반드시 구현해야 할 메서드를 지정하는 방식
- 공통 인터페이스 정의 용도로 사용됨
- 추상 클래스는 직접 인스턴스화할 수 없음
- 자식 클래스는 반드시 추상 메서드를 구현해야 함
from abc import ABC, abstractmethod
# 추상 클래스 정의
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
# 자식 클래스에서 추상 메서드 구현
class Dog(Animal):
def make_sound(self):
return "Bark!"
class Cat(Animal):
def make_sound(self):
return "Meow!"
# 확인
dog = Dog()
print(dog.make_sound())
# 결과
# Bark!
# Animal() # 오류: 추상 클래스는 인스턴스화 불가
장고와 파이썬의 클래스 추상화 비교
장고 추상 클래스 | 파이썬 추상 클래스 |
공통 인터페이스 정의 | 공통 필드와 메서드를 재사용 |
클래스와 메서드 | 모델 클래스와 필드, 메서드 |
자식 클래스에서 추상 메서드 반드시 구현 | 필수 구현 강제 없음 |
abc.ABC, @abstractmethod | Meta.abstract = True |