TIL 42 | Enum ?

임종성·2021년 8월 11일
0

TIL

목록 보기
14/22
post-thumbnail

WeeteWeete 프로젝트를 진행하며 구현하는 기능 중에 상품의 구매와 결제가 있다. 구매를 위해 선택된 상품의 상태를 보여주기 위해 status라는 Table을 만들었는데, status를 Enum으로 관리하는게 좋다는 조언을 듣고 Enum을 적용해봤다.

View Logic

기존 코드는 아래와 같이, Order Table에서 사용자가 포함되고 status_id=1인 QuerySet을 불러오는 것이었다.

Order.objects.filter(member_id = request.user.id, status_id = 1).exists()

여기서 status는 Order의 상태를 설정해주는 것이며, id=1인 경우 name=Waiting, id=2name=Completedstatus를 저장하여 상품의 구매 전 대기 상태와 구매 완료 상태를 우리가 알 수 있게 해준다.

내가 구현한 View는 사용자가 상품을 구매하기 위해 결제 페이지를 볼 경우, Order Table에 등록된 Item중 구매 대기 전 상태의 Item만 불러와야 하기 때문에 status_id = 1로 필터링 해줬다.

Problem

그런데 단순히 status_id = 1로 작성할 경우, id = 1이 무엇을 의미하는지는 작성한 사람만 알 수 있으며, 가독성이 좋지 않다. 이렇게 사용하는 값들이 제한적인 경우 Enum을 사용해 보완해주는 것이 좋다!

Use Enum

# 기존의 Status Model와 status_id 표현
class Status(models.Model):
    name = models.CharField(max_length=100)
    
> status_id = 1

# 변경 후 Status Model
class OrderStatus(models.Model):
    class Status(models.IntegerChoices):
        WAITING   = 1
        COMPLETED = 2

> status_id = OrderStatus.Status.Waiting.Value

이렇게 Enum으로 상수를 설정해 가독성이 좋게 만들고, 값이 변경되거나 추가할 경우 관리가 용이하도록 했다. 또한 상수의 안정성이 보장될 뿐더러 구현 의도가 열거임을 분명히 할 수 있다.

profile
어디를 가든 마음을 다해 가자

0개의 댓글