ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Inheritance(상속)를 이용한 공통 속성 및 기능 정의
    컴퓨터 공부 ver 0.1/Django 2019. 2. 8. 14:15
    반응형

    BaseModel을 구현한 이유

    Django ORM의 매력에 빠지고 model을 설계하다보면, 공통으로 쓰면 참 좋겠다 싶은 속성이나, 기능들이 생깁니다. 
    혹은 재정의하고 싶은 것들도 생기고요.

    그래서 inheritance(여담이지만 예전에 대학교에서 수업들을 때, 교수님이 가장 좋아하는 단어라 했습니다. 그 때는 웃어 넘겼는데, 이제는 이해가...)를 이용해서 공통으로 사용되는 속성과 기능들을 정의한 후 이 class를 상속받아 사용하면 참 좋습니다.


    BaseModel

    class BaseModel(models.Model):
    is_deleted = models.BooleanField(default=False)

    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)
    deleted_at = models.DateTimeField(null=True)

    objects = BaseCommonManager()

    class Meta:
    abstract = True

    def delete(self, using=None, keep_parents=False):
    self.is_deleted = True
    self.deleted_at = datetime.now()
    self.save()

    위와 같이 우리의 친구 models.Model을 상속받은 BaseModel을 작성합니다.
    BaseModel 클래스의 코드들을 하나하나 설명 드릴게요.


    BaseModel 코드 설명

    1. is_deleted, updated_at, created_at, deleted_at

    is_deleted: 서버 개발을 막 시작할 때쯤, "DB에 저장된 내용은 가능하면 지우지 않고 남겨 놓는 것이 좋다"라는 얘기를 들었습니다. 사용자 액션에서는 지운거지만 실제로 is_deleted값만 True로 변경합니다. 그리고 나중에 정보를 가져올 때 이 값으로 filter해서 실제 사용자에게 보여져야 하는 데이터만 전달합니다.
    1. 사용자가 데이터 삭제 요청
    2. is_deleted=True, deleted_at에 삭제 요청 받은 시간을 저장
    3. 사용자가 해당 테이블의 데이터 요청시, is_deleted=False의 데이터만 전달
    updated_at, created_at, deleted_at: 데이터의 생성, 업데이트, 삭제 시간 기록용입니다.

    2. objects = BaseCommonManager()

    이건 다른 글에서 설명 드릴게요.

    3. class Meta: abstract = True

    abstract = True 로 설정해주어야 다른 클래스들이 이 BaseModel을 상속 받고 싶을 겁니다. 그리고 이렇게 해야 실제 DB에 BaseModel 테이블이 안만들어진답니다.

    4. def delete(self, using=None, keep_parents=False)

    models.Model이 가지고 있던 delete를 재정의 했답니다. 개발자가 ModelClass.delete() 를 호출했을 때, 이 delete(self, using=None, keep_parents=False)에 재정의된 대로 실행해달라고 했습니다.
    코드 내용은,
    1. is_deleted=True로 하고
    2. 현재 시간(사용자가 삭제 요청한 시간)을 deleted_at에 저장
    3. 그리고 저장된 정보를 DB에 저장
    실제 DB에 삭제해달라는 코드가 없기에 삭제가 되지 않습니다.


    Product class

    BaseModel을 상속한 Product class를 생성했습니다.

    from project_common.models import BaseModel

    class Product(BaseModel):
    name = models.CharField(max_length=100, help_text='상품 이름')
    provider = models.CharField(
    max_length=100, db_index=True,
    help_text='입점사(상품 등록자) 이름',
    )
    price = models.IntegerField(default=0, help_text='상품 가격')

    아래와 같이 Product를 불러오면, 자동완성 항목에서 상속받은 BaseModel의 속성과 재정의된 함수를 볼 수 있습니다.


    정리

    반복적으로 사용되는 속성이나 공통의 기능은 이렇게 Inheritance를 이용해서 사용하면 굉장히 편하답니다.

    그래도 걱정되는 점들

    • 공통적으로 사용된 class를 만들어놨으나..나만 쓴다면?
      -> 그래서 코드 리뷰가 필요한가봅니다.
    • 공통 class에 재정의한 함수를 나만 안다면? 위험해집니다. 특히 django에서 기본으로 제공해주는 class의 함수들을 재정의한다면!!
      -> 이것도 코드 리뷰를 통해 동료분들과 공유하세요
    • 항상 예외사항은 있더랍니다. 또 다른 공통 클래스를 만들어야 할까요? 나중에는 너무 많아진 공통 클래스?
      -> 동료분과 상담 후 결정하는 것도


    반응형

    댓글

Designed by Tistory.