[PROJECT] 술담화 프로젝트_1_ERD, modeling

초이지수·2022년 4월 26일
0

PROJECT

목록 보기
1/9
post-thumbnail
post-custom-banner

클론 프로젝트

국내 최초 전통주 술 정기 구독 서비스 쇼핑몰, 술담화를 클론하기로 하였다!
쇼핑몰은 로그인, 회원가입, 장바구니 등 기본적인 구현 사항들이 모두 충족되기에 첫 클론 프로젝트로 적합한 사이트라고 생각했다!
https://www.sooldamhwa.com/

첫번째 프로젝트인 만큼 기능에 욕심을 부리기보단, 기본에 충실한 사이트를 만들어 기본기를 단단하게 다지는 시간을 갖기로 하였다!!!!!!!!!


⚡️ 기본 구현사항

  1. 로그인, 회원가입
  2. 상품 상세페이지
  3. 상품 리스트
  4. 장바구니

⚡️ 추가 구현사항 (시간이 된다면,,?)

  1. 좋아요
  2. 결제
  3. 구매이력
  4. 구독서비스

☄️ 현재까지 프로젝트 진행 순서(Backend)

  1. Django 초기세팅
  2. ERD
  3. models.py 작성후 migration

🙋‍♀️ 첫번째 ERD

Products를 기준으로 잡고 테이블을 구상하였다.

  • categories
    술담화 사이트는 탁주 / 약.청주 / 과실주 / 증류주 총 4가지 카테고리로 분류하였지만,
    우리 팀은 편의상 소주 / 맥주 / 위스키 / 와인 / 막걸리 로 분류하기로 하였다!

  • taste, finger_food
    상세페이지에 핵심포인트로 나와있는 맛, 안주는 product가 아닌 categories 별로 분류하여
    ex ) 맥주 > 안주 : 치킨, 맛 : 탄산 8, 산미 6, 담백 4 이런식으로 그래프화하여 int로 넣어주기로 하였다.


🙋‍♀️ 두번째 ERD

제일 고민되었던 테이블은 price 였는데,
1. 가격별로 범위를 지정해서 (ex)0원 ~ 만원 / 만백원 ~ 이만원) 데이터베이스에 넣어주어야 할까?
2. price 테이블을 따로 빼서 products와 cart와 연결 해주어야 할까?
고민을 하다

products에 가격을 넣어주고 cart에서 받아주기로 했다.


🙋‍♀️ 세번째 ERD

  • categories, proof 와 taste
    MySQL에서 Queryset 형식으로 나온다고 생각했을 때
    taste의 맵고 고소하고 상큼하고 등등... 의 맛은 주류 하나에 모두 포함이 되기 때문에 row 값으로 나와야 한다. 따라서 분할 시켜서 table 만들어 줘야함!

🙈 추가로 공부해야할 것

⭐️🤔 1. DOUBLE, FLOAT의 precision 문제

(왜 돈 관련한 데이터는 DOUBLE, FLOAT를 쓰면 안 될까?)

  • 컴퓨터는 실수를 표현할 때 기본적으로 2진수를 사용한다.
    263 => 100000111
    0.3 => 0.01001100110011......(0011)의 무한 반복
    이처럼 2진수로 표현하지 못하는 소수가 발생하게 되고, 컴퓨터에는 표현할 수 있는 가장 근사치의 값이 저장된다.

☁️ 근사 값을 저장하는 방법은 총 두가지!

  1. 고정 소수점 : 정수를 표현하는 비트 수와 소수를 표현하는 비트 수를 미리 정해 놓고 해당 비트 만큼만 사용해서 숫자를 표현.
    소수점에 이용하는 범위를 딱 고정 해놓기 때문에 수의 표현 범위가 크지 않다.
  2. 부동 소수점 : 소수점을 이용하지 않으면 그만큼 다른 수를 표현할 수 있도록 더 넓은 표현 범위를 갖는다.

-> float와 double은 우리가 돈을 위해 사용하는 기본 10 배수를 정확하게 나타낼 수 없기 때문에 DecimalField를 사용해야한다!!!!!!!!!!!

☁️ DecimalField 속성

10 진수 표현으로, python에서 Decimal 인스턴스로 나타냄

  • max_digits : 숫자에 허용되는 최대 자릿수. None이거나 decimal_places보다 크거나 같은 정수여야 함!
  • decimal_places : 숫자와 함께 저장할 소수 자릿수
class Product(models.Model):
    size        = models.IntegerField(max_length=100)
    description = models.CharField(max_length=100)
    price       = models.DecimalField(max_digit=8, decimal_place=2)
    #최대 금액 100,000원 (6자리) / 소수점 둘째자리까지 구현

🤔 2. VARCHAR vs CHAR (가볍게)

  • VARCHAR : 가변형 문자열
    2byte의 문자를 넣으면 2byte만큼의 데이터만 잡는다.
  • CHAR : 고정형 문자열
    2byte의 문자를 넣어도 20byte만큼의 데이터만 잡는다.

🤔 3. DATETIME vs TIMESTAMP (가볍게)

  • DATETIME : 문자형. 8byte. 데이터 값을 입력해줘야 날짜가 입력된다.
  • TIMESTAMP : 숫자형. 4byte. UTC 형으로 TIME_ZONE을 가지고 있다. (데이터 값을 입력해주지 않고 저장시에 자동으로 현재 날짜가 입력된다.)
    일반적으로 타임스탬프(항목이 처음 작성된 시간)가 있는 경우 항목이 마지막으로 업데이트된 시간을 보여주는 업데이트된 필드가 필요합

🤔 4. ON DELETE 옵션 여러가지 (가볍게)

on_delete 옵션은 Django에서 모델을 구현할 때 데이터베이스 상에서 참조무결성을 유지하여 ForeignKeyField가 바라보는 값이 삭제될 때 해당 요소를 처리하는 방법을 지정

  • CASADE
  • PROTECT
  • SET_NULL
  • SET_DEFAULT
  • SET
  • DO_NOTHING

🙈 models.py 작성 후 수정사항

💥 CamelCase

class명은 컨벤션상 camelcase로 작성한다!
중요한 걸 대문자로!!

💥 model class 작성시 유의사항(?)

 user       = models.ForeignKey(User, on_delete=models.CASCADE)
 product    = models.ForeignKey('Product', on_delete=models.CASCADE)
  1. 지정해줄 클래스가 윗 부분에서 선언된 경우, 따옴표 없이 클래스로 잡아준다.
  2. 해당 클래스가 윗쪽에서 선언되지 않은 경우, 따옴표를 사용해 문자열로 잡는다.

💥 blank와 null의 차이점

null : DB와 관련된다! database column이 null 값을 허용하느냐 아니냐를 결정.
blank : Form에 대한 유효성과 관련! 반드시 입력해야하는지 아닌지를 결정.

💥 TimeStampModel

수정 전

updated_at

단순히 변수명만 변경해준 것이었다.
core app 생성 후 각 model에 있는 created_at과 updated_at을 삭제하면 된다!

수정후

class TimeStampModel(models.Model):
    created_at  = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)
    
    class Meta:
        abstract = True
profile
닫혀 있어서 벽인 줄 알고 있지만, 사실은 문이다.
post-custom-banner

0개의 댓글