-
Notifications
You must be signed in to change notification settings - Fork 4
Feature specification
worldii edited this page Aug 30, 2023
·
22 revisions
회원은 다음과 같은 정보를 갖는다.
-
이메일 (원시값 포장)
- 이메일 표준 양식을 지킨다.
- unique 값이어야 한다.
- 255자 이하여야 한다.
- null이거나 공백이 아니어야 한다.
-
비밀번호 (원시값 포장)
- 60자 이하여야 한다.
- null이거나 공백이 아니어야 한다.
-
이름 (원시값 포장)
- 13자 이하여야 한다.
- null이거나 공백이 아니어야 한다.
-
전화번호 (원시값 포장)
- 전화번호는 아래와 같은 양식을 따른다.
- 010-0000-0000
- null이거나 공백이 아니어야 한다.
- 전화번호는 아래와 같은 양식을 따른다.
-
마일리지 (원시값 포장)
- 오버플로우를 고려해야 한다.
- 0 이상의 정수만 저장할 수 있다.
- null이 아니어야 한다.
-
주소 (원시값 포장)
- 100자 이하여야 한다.
- null이거나 공백이 아니어야 한다.
-
역할
- 판매자, 구매자 중 하나여야 한다. (디뽈트는 구매자)
-
생성 시간
- 수정되면 안 된다.
- 연, 월, 일, 시, 분, 초를 기록한다.
-
수정 시간
- 멤버 정보가 수정될 때마다 갱신되어야 한다.
- 연, 월, 일, 시, 분, 초를 기록한다.
- 회원 정보를 입력하여 가입한다.
- 회원의 기본 역할은 구매자다.
- 생성 후 생성된 유저 정보에 접근할 수 있는 URL을 Location 헤더에 담는다.
- 이메일과 비밀번호를 사용하여 로그인할 수 있다.
- 이메일이 존재해야 한다.
- 이메일과 비밀번호는 매칭되어야 한다.
- 로그인 생성 시 JWT를 발급한다.
- JWT의 claim은 subject로 회원 id를 갖고, 추가 claim으로 role을 가진다.
- JWT access token 만료 시간은 1시간이다.
- JWT refresh token은 일주일이다.
- controller method 단위에서 인가 범위를 다룬다.
술은 다음과 같은 정보를 갖는다.
-
타입
- 소주, 증류주, 리큐르, 막걸리, 약주, 청주, 과실주, 기타주류 중 하나여야 한다.
-
지역
- 경기도, 강원도, 충청북도, 충청남도, 경상북도, 경상남도, 전라북도, 전라남도, 제주도 중 하나여야 한다.
-
판매 상태
- 판매중, 판매중지 중 하나여야 한다.
-
이름
- 30자 이하여야 한다.
- null이거나 공백이 아니어야 한다.
-
가격
- 오버플로우를 고려해야 한다.
- 0 이상의 정수만 저장할 수 있다.
- null이 아니어야 한다.
-
브랜드
- 20자 이하여야 한다.
- null이거나 공백이 아니어야 한다.
-
이미지 경로
- 255자 이하여야 한다.
- null이거나 공백이 아니어야 한다.
-
재고
- 0 이상의 정수만 저장할 수 있다.
- null이 아니어야 한다.
-
도수 (ALC)
- 0 이상의 실수만 저장할 수 있다.
- null이 아니어야 한다.
-
용량 (ML)
- 1 이상의 정수만 저장할 수 있다.
- null이 아니어야 한다.
-
유통 기한
- 생성 시간보다 이후여야 한다.
- 연, 월, 일, 시, 분, 초를 기록한다.
-
생성 시간
- 수정되면 안 된다.
- 연, 월, 일, 시, 분, 초를 기록한다.
-
수정 시간
- 술 정보가 수정될 때마다 갱신되어야 한다.
- 연, 월, 일, 시, 분, 초를 기록한다.
- 술 정보를 입력하여 등록한다.
- 생성 후 생성된 술에 접근할 수 있는 URL을 Location 헤더에 담는다.
- 기본값은 생성시간 내림차순으로 술을 조회한다.
- 페이징을 지원해야 한다.
- 페이지 기본값 : page = 0, size = 10
- 커서 방식을 이용한다.
- 판매 상태, 브랜드, 타입, 지역 조합으로 검색할 수 있다.
- 제공되는 술의 정보는 id, 이미지, 이름, 가격, 재고다.
- 술의 id를 기준으로 조회한다.
- 술의 정보를 모두 보여준다.
- 술의 연관상품을 같이 조회한다.
- 판매자만 삭제할 수 있다.
- 변경하려는 정보 외에도 술의 정보를 모두 포함해야 한다.
- 식별자는 바꿀 수 없다.
- 판매자만 삭제할 수 있다.
- 술의 id를 기준으로 삭제한다.
- 판매 중지된 술만 삭제할 수 있다.
- id
- 술 클릭률 id 정보를 갖는다.
- null이 아니어야 한다.
- 술 ID
- 술 id 정보를 갖는다.
- null이 아니어야 한다.
- 클릭 수
- null이 아니어야 한다.
- 노출 수
- null이 아니어야 한다.
- 술의 id를 기준으로 조회한다.
- 술의 클릭률을 보여준다.
- 클릭률은 술의 상세정보 조회 시마다 1씩 증가한다.
- 분산락을 이용하여 증가 시킨다.
- 클릭률 조회 endpoint 구현한다.
- 술의 id를 기준으로 조회한다.
- 술의 노출률을 보여준다.
- 노출률은 술의 목록 조회 시마다 1씩 증가한다.
- 술 ID
- 술 id 정보를 갖는다.
- null이 아니어야 한다.
- 재고
- null이 아니어야 한다.
- 유통 기한
- null이 아니어야 한다.
- 생성 일시
- 수정 일시
-
멤버
- 멤버 id 정보를 갖는다.
- null이 아니어야 한다.
-
술
- 술 정보를 갖는다.
- null이 아니어야 한다.
-
수량
- 1 이상의 정수여야 한다.
- null이 아니어야 한다.
-
생성 시간
- 수정되면 안 된다.
- 연, 월, 일, 시, 분, 초를 기록한다.
-
수정 시간
- 장바구니 상품 정보가 수정될 때마다 갱신되어야 한다.
- 연, 월, 일, 시, 분, 초를 기록한다.
-
멤버
- 멤버 id 정보를 갖는다.
- null이 아니어야 한다.
-
장바구니 상품 리스트
- 최대 길이는 100이다.
- 장바구니 상품의 멤버 id는 모두 같아야 한다.
- 장바구니 상품은 모두 id가 달라야 한다.
- 기존 장바구니에 판매 중지된 장바구니 상품을 넣을 수 없다.
- 장바구니 상품 id가 같은 술은 추가할 수 없다.
- 술의 품목이 100개일 때 술을 새로 추가할 수 없다.
- 한 종류의 술을 여러 병 추가할 수 있다.
- 판매중인 술만 등록할 수 있다.
- 기본값은 생성 시간 내림차순으로 조회한다.
- 제공되는 장바구니 상품의 정보는 id, 이름, 가격, 이미지, 재고다.
- 요청 회원 id 랑 장바구니 상품 소유자의 회원 id 를 비교한다.
- 장바구니에 장바구니 상품이 있는지 확인한다.
- 수량만 수정할 수 있다.
- 요청 회원 id 랑 장바구니 상품 소유자의 회원 id 를 비교한다.
- 장바구니에 장바구니 상품이 있는지 확인한다.
-
멤버 ID
-
주문서 상태 ID
- CANCELED ,EXPIRED, INPROGRESS, COMPLETED
-
총 주문 금액
-
마일리지 사용량 (마일리지 = 적립금, 충전 X)
- 마일리지는 총 주문금액의 10퍼센트 까지만 쓸 수 있다.
-
실 구매가 (= 총 주문 금액 - 마일리지 사용량)
-
총 수량
-
만료기한 만료는 주문서 생성 후 20분 후까지이다.
-
생성 일시
-
수정 일시
-
주문서 상품 리스트
- 주문서 ID
- 술 (술 ID, 종류, 지역, 상태, 이름, 정가, 실 구매가, 브랜드, 이미지, 도수, 용량, 수량, 유통기한)
- 수량
- 현재 로그인한 회원의 cartItem에 담겨있는 아이템을 기준으로 주문서를 생성한다.
- 주문서의 실 결제 금액은 마일리지 + PG결제 방식으로, 마일리지는 총 주문금액의 10퍼센트만 사용할 수 있다.
- 주문서가 생성될 때 주문서의 상태는 "INPROGRESS"이다.
- 현재 로그인한 유저가 실제로 존재하는지 확인한다.
- 주문서가 존재하는 지 확인한다.
- 주문서와 주문서 아이템을 조회한다.
- 주문서
- 주문서 아이템
- 현재 로그인한 유저가 실제로 존재하는지 확인한다.
- 주문서가 존재하는 지 확인한다.
- 주문서 상태를 수정한다. (CANCELED ,EXPIRED, INPROGRESS, COMPLETED)
- 주문서 발행 후, 5분이 지나면 주문서 상태를 "EXPIRED"로 변경한다.
- 주문서 ID
- 거래 ID
-
멤버 ID
- member_id 정보를 갖는다.
- null이 아니어야 한다.
-
주문서 ID
- receipt_id 정보를 갖는다.
- null이 아니어야 한다.
-
주문 상태 ID
- order_status_id 정보를 갖는다
- null이 아니어야 한다.
- 완료, 환불, 주문 취소 중 하나여야 한다.
- "COMPLETED" : 주문이 정상적으로 이뤄짐
- "REFUND" : 고객이 주문 결제 후, 환불을 요청한 경우
- "CANCELED" : 고객 요청으로 취소(배송지 오기입 등), 판매자가 불가피한 상황으로 주문을 취소한 경우 (ex. 실 재고 부족, 판매자 파산, 배송 불가 등)
-
생성 시간
- 수정되면 안 된다.
- 연, 월, 일, 시, 분, 초를 기록한다.
-
수정 시간
- 주문 정보가 수정될 때마다 갱신되어야 한다.
- 연, 월, 일, 시, 분, 초를 기록한다.
- 주문 ID
- 결제 수단
- 매입 카드사
- 카드 BIN
- 할부 개월 수
- 카드사 승인 번호
- 카드사 가맹점 번호
-
주문서를 받는다.
- 주문서 상태 확인
- 주문서 만료 기간 5분 이상 경과, 예외 발생 (receipts 상태는 "EXPIRED" 로 수정)
- 상품 재고 확인
- 재고 부족 시, 예외 발생
- 사용자 마일리지 잔액 확인
- 마일리지 부족 시, 예외 발생
- 주문서 상태 확인
-
PG에 결제 정보를 전달한다.
-
마일리지 차감, 재고 감소
-
PG로부터 결제 결과를 받는다.
- 정상적으로 결제 완료
- orders 생성 및 상태는 "COMPLETED"
- receipts 상태는 "COMPLETED"
- 사용자 결제 취소
- orders 생성 X
- receipts 상태는 "CANCELED"
- 그 외 결제 오류 (결제를 도중에 그만뒀을 경우, 통신 오류, 사용자 잔액 부족, 외부 결제 API 오류 등등)
- orders 생성 X
- receipts 상태는 "INPROGRESS" -> 다시 결제를 시도할 수 있도록 receipts 상태는 "INPROGRESS" 상태
- 정상적으로 결제 완료
- 요청한 유저의 결제 목록을 전체 조회한다.
- 기본값은 생성시간 내림차순으로 주문을 조회한다.
- 페이징을 지원해야 한다.
- 페이지 기본값 : page = 0, size = 10
- 제공되는 주문(결제) 내역 정보
- 주문(결제) id
- 주문(결제) 생성일시
- receipt_id (총 주문금액, 마일리지 사용량, 실 구매가, 총 수량)
- 주문(결제) 상품 목록 리스트
- 주문 id를 기준으로 조회한다.
- 주문 정보를 모두 보여준다.
- 요청 회원 id 랑 주문자의 회원 id 를 비교
- 주문(결제) 내역이 있는지 확인
- 주문(결제) 상태만 수정 가능
- 취소 (CANCELED) : 환불 완료, 고객, 판매자에 의한 결제 취소 (결제 취소 = 마일리지 및 결제 금액 환불)
- 년도
- 월
- 주
- 일
- 상품 아이디
- 지역
- 타입
- 하루 판매량
- 하루 판매액
- 하루 노출 수
- 하루 클릭 수
- 매일 00:00:00 하루 판매량, 판매 금액을 자동 통계 집계 쿼리 실행한다
- 매일 00:00:00 하루 클릭 수, 노출 수 통계 집계하는 쿼리를 실행한다.