쿠폰 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. 그러면 실제 흐름이 어떻게 되는데?

회원가입 웰컴 쿠폰

  1. 회원가입 트랜잭션 종료 이후 실행
    1. 쿠폰 발급 실패와 회원가입 성공/실패는 무관해야 하므로 다른 트랜잭션으로 묶여야 함
  2. 쿠폰 정책 테이블 조회하고 policy_rule에서 WELCOME인 정책 조회
  3. 해당 정책을 보고 쿠폰 테이블을 채워서 저장해주면 됨
    1. 이때, valid_days를 보고 쿠폰 테이블의 사용시작일, 만료일을 채워주면 됨

생일 쿠폰

  1. Spring Batch를 이용해서 매월 1일에 회원 테이블을 뒤져서 이번달이 생일인 회원들을 조회
  2. 쿠폰 정책 테이블 조회하고 policy_rule에서 BIRTHDAY인 정책 조회
  3. 쿠폰 발급
    1. 이때, fixed_start와 fixed_end 테이블을 보고 쿠폰테이블의 사용시작일, 만료일을 채워주면 됨

특정 도서 / 카테고리 쿠폰 사용가능한지 검증은 어떻게?

  1. 사용자가 도서를 구매할때 해당 도서에 대해 ‘사용할 수 있는 쿠폰 조회’ 버튼 같은걸 누름
  2. 사용자가 가지고 있는 쿠폰 테이블을 조회함
  3. 쿠폰 테이블과 쿠폰 정책 테이블을 조인해서 쿠폰 정책 테이블 ID 획득
  4. 특정 도서에 대해 조회했기 때문에 해당 도서의 카테고리 ID와 도서 ID를 획득
  5. 쿠폰 정책 테이블 ID와 카테고리 ID 또는 도서 ID로 특정 도서 쿠폰 정책과 카테고리 쿠폰 정책이 있는지 조회
  6. 있다면 일단 적용 “가능할 수” 있음
  7. 쿠폰 정책 테이블의 정책 사용여부는 당연히 확인해야하고 유효기간도 당연히 확인해야함
  8. 이 모든 것을 통과했다면 사용 가능

5. 추가 고려해야할 사항들

  • 뇌피셜 상상코딩으로 만들었기 때문에 실제 해보면 다를 수도 있음..
  • 적극적으로 소통하면서 싱크를 맞춰나가도록 해요