쿠폰 ERD ‐ 왜 이렇게 설계했는가! - nhnacademy-be10-WannaB/wannab-wiki GitHub Wiki
0. 들어가며
- 쿠폰 테이블은 굉장히 반정규화가 많이 되어있음…
- 많이 고민했는데 별다른 수가 없어서 일단 이렇게 해놓고 만들면서 바꾸던지 해야할 것 같음
1. 쿠폰 테이블 - 회원과 1 : N 관계
- 쿠폰 테이블은 발급된 실물 쿠폰을 의미
- 1명의 회원이 N개의 쿠폰을 가질 수 있음 ⇒ 1 대 N 관계
- 이 쿠폰 테이블은 특정 주문의 도서에 사용되기 때문에, 주문내의 도서와 관계를 가져야함
- 1 대 1 관계
- 포링키는 쿠폰테이블에 두는 게 나음
- 아직은 연결안했는데 나중에 주문쪽 완성되면 연결해주세용
2. 쿠폰 정책 테이블 - 관리자가 생성, 관리하는 쿠폰 정책
- 관리자가 어떤 쿠폰에 대해 정책을 관리하고 싶을 수 있음
- 정책이라는 것은 복잡한 것은 아니고, 그냥 이 쿠폰이 얼마정도의 할인을 해줄 것인지, 어떤 도서를 대상으로 발급해줄것인지 등등 설정이라고 생각하면 됨.
- 정책에는 다양한 종류가 있을 수 있음.
- 고정 유효기간 시작일 & 종료일
- 생일과 같이 고정으로 유효기간이 정해지는 정책일때 해당 컬럼을 사용하여 정책일 나타낼 수 있음.
- 이 경우, 상대 유효기간 값은 NULL로 표현됨
- 상대 유효기간 시작일 & 종료일
- 웰컴 쿠폰 같은 경우에 회원가입 후 30일 동안 사용 가능
- 이 경우에는 상대 유효기간 값을 사용하고 고정 유효기간 값은 NULL로 표현됨
- 최대 할인 가격과 최소 주문 가격도 해당 쿠폰이 적용될 수 있는 하한선과 상한선을 정한다고 생각하면 됨
- 정책 사용 여부는 관리자가 해당 정책을 사용할수도, 사용하지 않을수도 있기 때문에 만들어 둠
- 쿠폰 할인 종류는 해당 쿠폰이 정해진 금액만큼 고정으로 할인해줄 것인지, 비율로 할인해줄 것인지를 나타냄
3. policy_target_book 테이블 policy_target_category 테이블
- 특정 책에만 적용할 수 있는 쿠폰과 특정 카테고리에만 적용할 수 있는 쿠폰을 대응하기 위해서 만듬
- 쿠폰 정책과 책은 다대다 관계가 됨
- 하나의 쿠폰 정책은 여러개의 책에 적용될 수 있고, 하나의 책 입장에서도 본인은 여러개의 쿠폰 정책에 속할 수 있기 때문임
- 카테고리도 같은 이유로 풀어주는 중간 테이블이 있어야겠다고 판단함
4. 그러면 실제 흐름이 어떻게 되는데?
회원가입 웰컴 쿠폰
- 회원가입 트랜잭션 종료 이후 실행
- 쿠폰 발급 실패와 회원가입 성공/실패는 무관해야 하므로 다른 트랜잭션으로 묶여야 함
- 쿠폰 정책 테이블 조회하고 policy_rule에서 WELCOME인 정책 조회
- 해당 정책을 보고 쿠폰 테이블을 채워서 저장해주면 됨
- 이때, valid_days를 보고 쿠폰 테이블의 사용시작일, 만료일을 채워주면 됨
생일 쿠폰
- Spring Batch를 이용해서 매월 1일에 회원 테이블을 뒤져서 이번달이 생일인 회원들을 조회
- 쿠폰 정책 테이블 조회하고 policy_rule에서 BIRTHDAY인 정책 조회
- 쿠폰 발급
- 이때, fixed_start와 fixed_end 테이블을 보고 쿠폰테이블의 사용시작일, 만료일을 채워주면 됨
특정 도서 / 카테고리 쿠폰 사용가능한지 검증은 어떻게?
- 사용자가 도서를 구매할때 해당 도서에 대해 ‘사용할 수 있는 쿠폰 조회’ 버튼 같은걸 누름
- 사용자가 가지고 있는 쿠폰 테이블을 조회함
- 쿠폰 테이블과 쿠폰 정책 테이블을 조인해서 쿠폰 정책 테이블 ID 획득
- 특정 도서에 대해 조회했기 때문에 해당 도서의 카테고리 ID와 도서 ID를 획득
- 쿠폰 정책 테이블 ID와 카테고리 ID 또는 도서 ID로 특정 도서 쿠폰 정책과 카테고리 쿠폰 정책이 있는지 조회
- 있다면 일단 적용 “가능할 수” 있음
- 쿠폰 정책 테이블의 정책 사용여부는 당연히 확인해야하고 유효기간도 당연히 확인해야함
- 이 모든 것을 통과했다면 사용 가능
5. 추가 고려해야할 사항들
- 뇌피셜 상상코딩으로 만들었기 때문에 실제 해보면 다를 수도 있음..
- 적극적으로 소통하면서 싱크를 맞춰나가도록 해요