WeeteWeete 프로젝트를 진행하며 구현하는 기능 중에 상품의 구매와 결제가 있다. 구매를 위해 선택된 상품의 상태를 보여주기 위해
status
라는 Table을 만들었는데,status
를 Enum으로 관리하는게 좋다는 조언을 듣고 Enum을 적용해봤다.
기존 코드는 아래와 같이, 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=2
는 name=Completed
로 status
를 저장하여 상품의 구매 전 대기 상태와 구매 완료 상태를 우리가 알 수 있게 해준다.
내가 구현한 View는 사용자가 상품을 구매하기 위해 결제 페이지를 볼 경우, Order
Table에 등록된 Item
중 구매 대기 전 상태의 Item
만 불러와야 하기 때문에 status_id = 1
로 필터링 해줬다.
그런데 단순히 status_id = 1
로 작성할 경우, id = 1
이 무엇을 의미하는지는 작성한 사람만 알 수 있으며, 가독성이 좋지 않다. 이렇게 사용하는 값들이 제한적인 경우 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으로 상수를 설정해 가독성이 좋게 만들고, 값이 변경되거나 추가할 경우 관리가 용이하도록 했다. 또한 상수의 안정성이 보장될 뿐더러 구현 의도가 열거임을 분명히 할 수 있다.