1차 프로젝트 회고 -Dr.Tart(1)-

초코바나나탕수육·2021년 12월 12일
0
post-thumbnail

파이썬 글만 있던 삭막한 내 벨로그에 느닷없이 등장한 프로젝트 회고.. 블로그를 작성하는데에 좀처럼 흥미가 붙지않던 나는.. 웬걸 일주일 가까이 잊고 지냈다. 그날 배운건 그날 작성한다면 더할나위없이 좋겠지만 오늘에서라도 작성하는게 맞다고 생각하여 프로젝트 처음부터 회고를 진행할 예정이다.

1. 프로젝트 기획

프로젝트 팀 발표 첫날. 무슨 사이트를 클론하게 될까 하는 걱정반 기대반에 나는 화장품 사이트인 Dr.jart 팀에 합류하게 되었다.

  • Frontend : 도연님, 상훈님, 유진님
  • Backend : 정현님, 주호님, 민혁님(나)

로 구성된 상상하지 못했던(?) 조합이었고(케미가 매우 좋았던건 안비밀) 자리를 옮긴 후에 바로 어떤식으로 프로젝트를 진행할지 기획을 시작했다. 지금까지 프로젝트를 진행했던 선배 기수들의 프로젝트 결과물을 보며 어떻게 기획하는지에 대해서는 몇번 생각을 해봤던지라 모인지 몇분 되지 않아서 Dr.jart에 j를 t로 바꾸어서 디저트를 판매하는 대망의 Dr.tart 프로젝트가 시작되었다..!!

일상에 지친 당신을 위해, Dr.tart가 디저트를 처방해드립니다.

를 슬로건으로 정하고 역할을 분배하기 시작했다.

2. 모델링

이제 프론트, 백으로 나뉘어서 진행방향을 설정하고, 프로젝트의 뼈대를 잡기 위한 모델링을 정현님 주호님과 시작했다. 모델링을 어떻게 진행하느냐에 따라서 프로젝트의 방향성이나 기능구현의 성패가 좌우되기에 정말 열심히 진행했다. (2-3일은 쏟아부은것 같다)

Dr.tart는디저트를 판매하는 커머스 사이트이고 그에 따른 모델링이 필요했다.
모델링에 있어서 아쉬웠던 점은 우리의 기반이 되는 Dr.jart 홈페이지를 많이 참고하지 못했다는 점이다. 커머스 사이트는 비슷비슷하겠지~ 했던 안일한 생각들이 프로젝트 중반부터 후반까지 한번씩 발목을 잡았다.. 우리는 기능구현을 목적으로 모델링을 시작했다.

  • 회원가입, 로그인
  • 전체 상품 페이지, 상세 상품 페이지
  • 장바구니
  • 결제창
  • 추가구현 (상품별 좋아요, 상품별 리뷰, 고객 마이페이지)

지금와서 드는 생각이지만 사이트의 전체 Flow를 이해하고 모델링했으면 좀 더 수월하게 했을 것 같다. (이번이 끝이 아니니까 다행이야!)

ERD 리뷰를 받으며 몇가지 피드백을 얻은게 있는데

  • 상품의 가격은 확장성(국제적으로)을 생각하여 소수점까지 표현이 가능한 decimal 필드를 사용
  • order 테이블에서의 제2정규화, 유효아이디 사용
  • transaction

정도였다. 모두 시도해보았으면 좋았겠지만 필수구현에도 많은 시간을 쏟았던터라
제2정규화나 유효아이디는 접해보지 못해서 아쉬움이 남는다. decimal 같은 경우에는 사용하는데에 어려움이 없었지만 transaction은 정말 중요한 개념이기에 다른 글에서 따로 정리를 하도록 하겠다 !

3. Models.py 작성

ERD 모델링을 토대로 models.py를 작성하기 시작했고 크게

  • user - 주호님
  • product - 정현님
  • order - 나

로 진행했다!

users/models.py

from django.db import models

class User(models.Model):
    name         = models.CharField(max_length=100)
    email        = models.CharField(max_length=250, unique=True)
    password     = models.CharField(max_length=300)
    address      = models.CharField(max_length=100)
    vegan_or_not = models.BooleanField(default=False)
    created_at   = models.DateTimeField(auto_now_add=True)
    updated_at   = models.DateTimeField(auto_now=True)
    class Meta:
        db_table = 'users'

products/models.py

from django.db import models

from users.models  import User

class Menu(models.Model):
    name = models.CharField(max_length=20)
    
    class Meta:
        db_table='menus'

class Category(models.Model):
    name = models.CharField(max_length=50)
    menu = models.ForeignKey(Menu, on_delete=models.CASCADE)
    
    class Meta:
        db_table='categories'

class Product(models.Model):
    korean_name         = models.CharField(max_length=20)
    english_name        = models.CharField(max_length=20)
    thumbnail_image_url = models.URLField(max_length=200)
    price               = models.DecimalField(max_digits=10, decimal_places=2)
    created_at          = models.DateTimeField(auto_now_add=True)
    updated_at          = models.DateTimeField(auto_now=True)
    vegan_or_not        = models.BooleanField(default=False, null=False)
    sugar_level         = models.IntegerField(default=1)
    category            = models.ForeignKey(Category, on_delete=models.CASCADE)
    description         = models.CharField(max_length=1000)
    
    class Meta:
        db_table='products'
    
class Image(models.Model):
    url       = models.URLField(max_length=300)
    product   = models.ForeignKey(Product, on_delete=models.CASCADE)
    
    class Meta:
        db_table='images'
    
class Review(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    product     = models.ForeignKey(Product, on_delete=models.CASCADE)
    content     = models.CharField(max_length=200, null=True)
    created_at  = models.DateTimeField(auto_now_add=True, null=True)
    updated_at  = models.DateTimeField(auto_now=True, null=True)
    
    class Meta:
        db_table='reviews'
    
class ReviewComment(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    review      = models.ForeignKey(Review, on_delete=models.CASCADE)
    content     = models.CharField(max_length=100, null=True)
    
    class Meta:
        db_table='review_comments'
    
class Like(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE)
    product     = models.ForeignKey(Product, on_delete=models.CASCADE)
    
    class Meta:
        db_table='likes'

orders/models.py

from django.db import models

class Cart(models.Model):
    product      = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    user         = models.ForeignKey('users.User', on_delete=models.CASCADE)
    quantity     = models.IntegerField(default=0)
    
    class Meta:
        db_table = 'carts'
        
class OrderStatus(models.Model):
    status = models.CharField(max_length=20)
    
    class Meta:
        db_table = 'order_status'
        
class Order(models.Model):
    user         = models.ForeignKey('users.User', on_delete=models.CASCADE)
    created_at   = models.DateTimeField(auto_now_add=True, null=True)
    updated_at   = models.DateTimeField(auto_now=True, null=True)
    address      = models.CharField(max_length=100)
    order_status = models.ForeignKey('OrderStatus', on_delete=models.CASCADE)
    
    class Meta:
        db_table = 'orders'
        
class OrderItem(models.Model):
    order        = models.ForeignKey('Order', on_delete=models.CASCADE)
    product      = models.ForeignKey('products.Product', on_delete=models.CASCADE)
    quantity     = models.IntegerField(default=1)
    created_at   = models.DateTimeField(auto_now_add=True, null=True)
    updated_at   = models.DateTimeField(auto_now=True, null=True)
    
    class Meta:
        db_table = 'order_items'

위와 같이 모델링 작업을 마쳤고 다음 글에선 이를 토대로 한 view 작성에 대해 얘기해보겠다 !!

0개의 댓글