SQL/ERD

[ERD] 쿠팡이츠 ERD 클론코딩 (1차)

Zaein 2024. 1. 23. 16:58

쿠팡이츠 클론코딩을 해보았다

 

원래는 API 까지 모두 완성되면 블로그에 포스팅하려고 했지만

시간 날 때마다 조금씩 하던거라 진행이 더뎌서

우선 ERD 1차 완성품을 냅다 올리기로 했다

 

 

ERD 클론코딩은 처음해봐서 이게 나한테 도움이 될지 살짝 의문이었는데

의외로 찾아보고 공부할 것도 꽤 많았고,

다른 회사의 ui와 서비스 구성을 분석하며 하나씩 풀어가는 과정이 너무 재미있었다!!

 

 

 

 

 

** 

아직 완벽하지 않은 상태여서 그런지

글을 작성함과 동시에 떠오르는 피드백과 성찰이 난무하다 ...^^ㅎ

이번에 느낀 부족함을 꼼꼼히 채워서 2차 포스팅에는 조금 더 완성된 느낌으로 작성하고싶다

 

그리고 아무래도 고객유저는 장바구니에 담고 구매만 하는 역할이다보니

쿠팡이츠 어플에서 체험(?)해 볼 수 있는 기능이 한정적이라 조금 아쉬웠다.

가게 사장님들이 사용하는 어플에서 request나 response의 구성을 더 자세히 살펴볼 수 있으면

ERD 작성에 조금 더 도움이 되지 않았을까 하는 아쉬움이 있다..

 

당근마켓은 한 어플에서 구매자와 판매자의 역할을 모두 체험할 수 있어서

클론코딩에는 당근마켓이 비교적 조금 더 수월할 수도 있을 것 같다!!

 

 

화이팅!!

 

 

 

 

 

 

 

1. 회원가입

User -

회원가입시 필수 기입사항인 email, password, name, phone 과 와우회원임을 판단하는 IsWow 필드로 구성

 

UserAddress -

User 테이블에 같이 넣을까 하다가 주소를 여러개 저장할 수 있게 되어있길래 address 테이블을 따로 뺐다.

userId, categoryId, 메인주소, 상세주소 필드로 구성

 

UserAddressCategory -

배달시 주소 선택 목록을 보면 [집], [회사] 등등 카테고리를 정할 수 있길래 카테고리 테이블도 따로 뺐음

 

UserTermsOfService -

이것 역시 User 테이블에 같이 넣을까 하다가 이용약관의 갯수가 변경될 상황을 대비해 테이블을 따로 뺐다

근데 이용약관의 순서나 추가/제거 되는 상황을 완벽하게 대응하려면 약관 내용을 담고있는 테이블을 따로 또 빼서 약관 id로 받아 넣는게 더 좋을듯!

더 진행해보고 상황에 맞춰 추후 변경 예정!

 

 

 

 

 

2. 가게 목록

RestaurantCategory -

분식, 한식, 치킨 등 카테고리의 종류를 담고있는 테이블

 

Restaurant -

가게 이름, 브랜드(쿠폰 사용시 특정 브랜드만 사용할 수 있게 해보고싶어서 추가), 카테고리, 메인 이미지

+ 가게의 상태를 표시할 수 있는 isActive 컬럼도 추가해서 배달 잠시 닫아놓거나 일찍 마감했을때 사용할 수 있도록 해야겠다!!

 

RestaurantDeliveryService -

restaurantId, TypeCode(한집배달, 세이브배달 별로 가격이 다를테니 테이블 분리.. 아직 이 부분은 어떻게 해야할지 모르겠어서 아마 조금 더 진행되면 테이블 구성 변경될 듯!!), 배달비, eta

 

 

 

 

3. 메인 메뉴, 사이드 메뉴

RestaurantMenuCategory -

추천메뉴, 세트메뉴, 피자단품, 사이드 등 가게 내에서 메뉴 카테고리를 담고있는 테이블

 

RestaurantMenu -

메뉴카테고리 하위에 들어갈 음식 종류를 담고있는 테이블

restaurantId, categoryId, 음식 이름, 음식 이미지, 음식 설명, 음식 가격 컬럼으로 구성됨

+ 할인 관련 컬럼도 추가하면 좋을 것 같다

 

RestaurantSideMenu -

음식을 눌렀을때 추가로 선택할 수 있는 사이드 메뉴들을 담고있는 테이블

생성할 수 있는 사이드 메뉴의 갯수가 딱히 정해져있지 않은 것 같아서 1:n 으로 메인메뉴와 엮어주기

restaurantMenuId, 사이드 메뉴 이름, 사이드 메뉴 가격 컬럼으로 구성됨

지금 생각해보니 맵기 조절과 같은 옵션을 선택할 수 있는 테이블도 따로 있으면 좋을 것 같다!!

+ 할인 관련 컬럼도

 

 

 

4. 매장 정보

RestaurantDetail -

Restaurant 테이블에 같이 넣을까 하다가 너무 길어질 것 같아서 따로 뺐다.

restaurantId, 전화번호, 대표자명, 사업자등록번호, 상호명, 매장소개, 공지 (이미지에는 없지만 다른 가게는 공지도 있길래 추가), 원산지 정보 컬럼을 담고있다.

name 컬럼은 제거했는데 반영이 안된채로 캡쳐됐음

 

RestaurantAddress -

가게 주소 역시 길어질것 같아서 따로 뺌

restaurantDetailId, 위도, 경도 (위도, 경도도 사용하지 않으면 제거 예정), 주소, 매장찾기 팁

+ 여기도 상세주소 컬럼을 넣어야겠다!!

 

RestaurantBusinessHours -

이 가게는 월요일~일요일 을 하나로 작성했지만

다른 가게들은 월요일부터 일요일을 하나씩 작성한 곳도 있고, 운영시간이 같은 요일끼리 묶어서 작성한 곳도 있어서 테이블 따로 생성!!

24시간 체계를 사용하지 않는걸 보니 시간은 text로 받아야 할 듯... dateTime으로 받아서 변환하던가....

근데 브레이크 타임도 이 테이블에 작성해야할까??

그렇다면 dayOfWeek 컬럼명을 그냥 name 으로 변경하고 요일 / 브레이크타임 을 둘 다 받으면 되려나

type 카테고리 테이블도 하나 더 만들어서 운영시간 / 미운영시간 을 나눠야할까????? 이건 좀 더 찾아서 고민해보자.

 

 

 

5. 리뷰

UserRestaurantReview -

userId, orderId, 별점, 내용, 이미지

Order 테이블과는 1:1 관계를 설정해서 한 주문에 한개의 리뷰만 달 수 있게 하면 되려나

 

 

 

6. 주문

Order -

주문번호, userId, userAddressId, restaurantDeliveryServiceId (한집배달인지 세이브배달인지), restaurantId, 총 금액, userDiscountCouponeId 컬럼으로 구성

+ paymentIsDeleted 컬럼은 사실 뭐가 복붙하다가 합쳐진 것 같은데 원래 뭐였는지 잘 기억이 안난다..

아마 결제 상태 (완료, 취소, 실패) 를 나타내고 싶었던 것 같은데 컬럼명을 paymentStatus 로 변경하고 타입은 enum으로 받는것으로 수정해야겠다

 

OrderMenu -

어떤 음식과 사이드메뉴를 담았는지를 저장하는 테이블

orderId, restaurantMenuId, restaurentSideManuId, 수량 컬럼으로 구성됨

 

OrderRequest -

주문 요청사항도 따로 테이블을 빼봤다.

가게 사장님께 요청사항, 일회용 숟가락 요청여부, deliveryServiceRequestId 컬럼으로 구성됨

+ orderId 컬럼도 추가해야할듯!!

 

DeliveryServiceRequest -

배달기사님께 요청사항은 선택할 수 있는 텍스트가 몇개 정해져있어서

테이블을 따로 만들었다.

+ 근데 직접 입력하는 선택지도 있어서

OrderRequest 테이블에 deliveryServiceRequest 컬럼을 text/null 타입으로 받고

deliveryServiceRequestId가 직접 입력하는 선택지의 id일 때 deliveryServiceRequest 데이터를 함께 받는 식으로 수정하면 좋을 것 같다~!

 

 

 

7. 할인쿠폰

DiscountCoupon -

brandId와 resturantCategoryId는 굽네치킨 할인쿠폰, 삼겹살 할인쿠폰 처럼 특정 브랜드나 특정 음식 종류에서만 사용할 수 있는 쿠폰을 만들기위해 추가해보았다.

그런데 특정 브랜드의 특정 메뉴에서만 사용할 수 있는 쿠폰을 만들으려면 어떻게 해야할까???

예를들면 bhc 뿌링클 할인 쿠폰 처럼...

전 지점의 OrderMenu 마다 식별코드를 동일하게 부여해주어야 할까??? 이 부분은 조금 더 찾아보고 적용하려고 한다.

 

RestaurantBrand -

브랜드명을 담고있는 테이블

 

UserDiscountCoupon -

유저에게 부여된 discountCouponId와 사용한일자, 사용여부 를 담고있는 테이블

 

 


 

 

전체 ERD