토이프로젝트/선착순 이벤트 쿠폰 시스템

1. 요구사항 분석 및 도메인 설계

feel2 2024. 4. 2. 20:19
반응형

선착순 쿠폰 발급 시스템이란?

한정된 수량의 쿠폰을 먼저 신청한 사용자에게 제공하는 시스템을 말합니다.

선착순 쿠폰 이벤트 요구사항

  • 특정 기간(ex) 2024-04-01 오후 3시 ~ 2024-04-07 오후 8시)에 발급해야 한다.
  • 한 유저당 한번의 쿠폰이 발급되어야 한다.
  • 선착순 쿠폰의 최대 발급 수량이 정해져 있다.

기능 정의서

  • 쿠폰 발급 기능
    • 쿠폰 발급 기간 검증
    • 쿠폰 발급 수량 검증
      • 쿠폰 전체 발급 수량
      • 중복 발급 요청 검증
    • 쿠폰 발급
      • 쿠폰 발급 수량 증가
      • 쿠폰 발급 기록 저장
        • coupon_id
        • user_id

구현 목표

  • 정확한 발급 수량을 제어합니다.(동시성 이슈 처리)
  • 많은 트레픽이 들어와도 안정적으로 높은 처리량

도메인

크게 2가지 도메인이 있다.

  • 쿠폰
  • 쿠폰 발행

로직에 집중하기 위해 핵심 도메인과 컬럼만으로 설계하였다.

craete_ddl

김영한님의 강의를 보면 create ddl의 경우에는 직접 쿼리를 작성하는 것이 좋다고 한다.

덤으로 첫 데이터 insert 문까지 넣어놨다.

CREATE TABLE `coupon`.`coupons`
(
    `id`                   BIGINT(20) NOT NULL AUTO_INCREMENT,
    `title`                VARCHAR(255) NOT NULL COMMENT '쿠폰명',
    `coupon_type`          VARCHAR(255) NOT NULL COMMENT '쿠폰 타입 (선착순 쿠폰, ..)',
    `total_quantity`       INT NULL COMMENT '쿠폰 발급 최대 수량',
    `issued_quantity`      INT          NOT NULL COMMENT '발급된 쿠폰 수량',
    `discount_amount`      INT          NOT NULL COMMENT '할인 금액',
    `min_available_amount` INT          NOT NULL COMMENT '최소 사용 금액',
    `date_issue_start`     datetime(6) NOT NULL COMMENT '발급 시작 일시',
    `date_issue_end`       datetime(6) NOT NULL COMMENT '발급 종료 일시',
    `date_created`         datetime(6) NOT NULL COMMENT '생성 일시',
    `date_updated`         datetime(6) NOT NULL COMMENT '수정 일시',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
    COMMENT '쿠폰 정책';

CREATE TABLE `coupon`.`coupon_issues`
(
    `id`           BIGINT(20) NOT NULL AUTO_INCREMENT,
    `coupon_id`    BIGINT(20) NOT NULL COMMENT '쿠폰 ID',
    `user_id`      BIGINT(20) NOT NULL COMMENT '유저 ID',
    `date_issued`  datetime(6) NOT NULL COMMENT '발급 일시',
    `date_used`    datetime(6) NULL COMMENT '사용 일시',
    `date_created` datetime(6) NOT NULL COMMENT '생성 일시',
    `date_updated` datetime(6) NOT NULL COMMENT '수정 일시',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4
    COMMENT '쿠폰 발급 내역';

insert into coupons (title, coupon_type, total_quantity, issued_quantity, discount_amount, min_available_amount,
                     date_issue_start, date_issue_end, date_created, date_updated)
values ('선착순 쿠폰 이벤트','FIRST_COME_FIRST_SERVED',500,0,100000,10000,now(),now(),now(),now());

참조

반응형