카테고리 없음

Django_클래스 추상화

멍주다배 2025. 1. 13.

클래스 추상화

  • 여러 모델, 뷰 등에서 공통적으로 사용하는 코드를 부모 클래스로 분리해 재사용
    • 코드 중복 제거: 동일한 필드나 메서드를 여러 클래스에 반복해서 쓰지 않아도 됨
    • 쉬운 유지보수: 공통으로 관리하므로 기능 추가나 확장, 수정하기 쉬움
  • 추상화된 클래스는 데이터베이스에 테이블 생성이 안됨
    • 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