쿠팡이츠 클론코딩을 해보았다
원래는 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