코딩관계론

타임딜 서비스 개발기 본문

개발

타임딜 서비스 개발기

개발자_티모 2024. 7. 25. 14:55
반응형

모름지기 잘 된 서비스들은 할인 이벤트를 만들어 사용자들의 접속을 유도한다. 여담으로 배민에서는 빼배로데이와 치킨데이가 있는데 이 때 참가하는 접속자가 많아서 치킨 디도스라고 불린다. 나의 서비스에도 이런 기능이 있으면 사용자들의 접속을 유도할 수 있겠다 싶어서 만들어야 겠다는 생각이 들었고, 아래의 글을 읽어봤는데 꽤나 재밌게 보였다.
https://techblog.woowahan.com/2514/

 

누군가에게는 빼빼로데이. 누군가에게는? | 우아한형제들 기술블로그

호기심 가득 11월 11일 빼빼로데이. 많은 인터넷 서비스 회사들이 빼빼로데이를 맞이하여 여러 이벤트를 준비한 것처럼, 배민 또한 이벤트를 준비했습니다. 아침 11시부터 선착순 1,111명에게 11,000

techblog.woowahan.com

 먼저 비지니스 규칙은 다음과 같다.

  1.  사용자는 이벤트 당 한번만 쿠폰을 발급 받을 수 있다.
  2. 이벤트 상태가 오픈 중이 아니라면 이벤트에 참여할 수 없다.
  3. 이벤트에서 발행된 쿠폰의 개수보다 발급된 쿠폰의 개수가 더 많을 수 없다.
  4. 사용자는 발급받은 쿠폰을 확인할 수 있어야 한다.

도메인 지식

  1. 관리자 계정만 이벤트 생성과 이벤트에서 발행할 쿠폰의 개수를 정할 수 있다.
  2. 여러 관리자가 동시에 Event에 대한 설정 정보를 변경하지 않는다.
  3. Event의 정보 수정으로 인해 User의 쿠폰 발급을 막으면 안된다.

엔터티 설계

최초 설계는 다음과 같이 생성했다. 하지만 문제가 생겼는데 그 이유는 쿠폰의 사용 요청이 들어왔을 때 쿠폰이 실제로 User에게 있는지, 쿠폰이 사용됐는지를 검색하기 위해선 User엔터티에 속해있는 Copon 엔터티를 모두 조회해야 한다는 단점이 생겼다.

 

따라서 아래와 같이 분리해서 진행했다,

 

서비스  순서도

  • 사용자의 발급 요청 수신: 사용자가 쿠폰 발급을 요청합니다.
  • 이벤트 확인: DB에 접근하여 사용자가 요청한 이벤트가 실제로 존재하는지 확인합니다.
  • 이벤트가 존재하지 않는 경우: 사용자에게 Bad Request 응답을 보냅니다.
  • 이벤트가 존재하는 경우: 사용자가 해당 이벤트에서 쿠폰을 발급받은 이력이 있는지 확인합니다.
  • 쿠폰 발급 이력 확인: 사용자가 해당 이벤트에서 쿠폰을 발급받은 이력이 있는지 확인합니다.
  • 이력이 있는 경우: 사용자에게 이미 쿠폰을 발급받았다는 응답

서비스  ERD

서비스 ERD (Entity-Relationship Diagram)에 대해 간단히 설명드리겠습니다. 현재 정의된 쿠폰 서비스는 다음과 같은 테이블들로 구성되어 있습니다:

테이블: Coupon

  1. 할인 금액 (discount_amount): 쿠폰을 사용하여 적용될 할인 금액을 나타냅니다.
  2. 발급 일자 (issued_at): 쿠폰이 발급된 날짜를 기록합니다.
  3. 쿠폰 번호 (coupon_code): UUID V4 형식으로 생성된 고유한 쿠폰 번호를 저장합니다.
  4. 사용 유무 (is_used): 쿠폰이 사용되었는지 여부를 나타내는 boolean 타입의 값입니다.

테이블: Time_Deal_Event

  1. 발급된 쿠폰의 개수 (total_coupons_issued): 이벤트를 통해 발급된 전체 쿠폰의 수를 기록합니다.
  2. 사용자에게 전달된 쿠폰 개수 (coupons_distributed_to_users): 각 사용자에게 몇 개의 쿠폰이 전달되었는지를 기록합니다.

관계

  • Time_Deal_Event (1) -> Coupon (N): 하나의 Time_Deal_Event가 여러 개의 쿠폰을 발급할 수 있는 일대다 관계입니다.

이를 통해 쿠폰 서비스에서의 주요 기능과 데이터 구조를 이해할 수 있습니다. 쿠폰은 특정 이벤트를 통해 여러 개가 발급되며, 각 쿠폰은 고유한 코드와 함께 사용 여부 및 발급 날짜 등의 정보를 포함합니다. 이벤트 테이블은 이러한 쿠폰 발급 내역과 사용자에게 배포된 쿠폰 수를 추적합니다.

PK전략 정의

2024.07.25 - [개발] - 최적의 PK를 찾아서

 

최적의 PK를 찾아서

PK전략 정의PK(Primary Key) 전략은 데이터베이스 성능에 큰 영향을 미치는 중요한 요소입니다. PK 값으로 클러스터링 인덱스가 생성되며, 이는 데이터가 물리적으로 정렬되어 저장되는 것을 의미합

bjwan-career.tistory.com

 

락 없이 요청을 보내면 어떻게 될까?

2024.07.23 - [TroubleShooting] - 발급 가능한 쿠폰의 개수보다 사용자에게 전달한 쿠폰의 개수가 더 많다....

 

발급 가능한 쿠폰의 개수보다 사용자에게 전달한 쿠폰의 개수가 더 많다....

타임딜 쿠폰 발급 서비스를 구현하는 도중에 발급 가능한 쿠폰의 개수보다 사용자에게 전달한 쿠폰의 개수가 더 많은 일이 발생했다. 아래가 원인이 된 코드인데 자세히 알아보자.  발급 가능

bjwan-career.tistory.com

DB의 락은 필요할까?

https://bjwan-career.tistory.com/293

 

Redis가 제안한 분산락(feat.Redlock)

서론자바에서 레디스를 통해 분산락을 구현해야 하는 상황이 생겼습니다. 자바에서는 Redisson이라는 라이브러리가 대표적으로 사용되는데, 이 라이브러리가 어떤 방법을 통해 분산락을 구현하

bjwan-career.tistory.com

비관적 락을 개선해 TPS를 높이자

2024.07.24 - [TroubleShooting] - In-memory- database를 사용해 TPS를 높이자

 

In-memory- database를 사용해 TPS를 높이자

서론기존의 타임딜 서비스를 구현하고 나서, nGrinder를 이용해 부하테스트를 진행했습니다. 900명의 유저가 동시에 접근해서 쿠폰 지급을 요청할 때, TPS가 190, 평균 응답시간은 2.3초가 나왔습니다

bjwan-career.tistory.com

1000TPS를 향하다

https://bjwan-career.tistory.com/308

 

TPS 2에서 TPS 10,000까지의 험난한 과정

먼저 성능 개선을 하기 전에 목표를 정해야 합니다. 이 이벤트가 열리게 되면 1,00,000명의 사용자가 초당 5번의 질의를 이어가게 된다.똑똑한 사용자들이 시스템의 헛점을 노리고 쿠폰을 받거나

bjwan-career.tistory.com

 

반응형

'개발' 카테고리의 다른 글

API Gateway를 직접 구현해야 할까?  (0) 2024.08.05
Redis가 제안한 분산락(feat.Redlock)  (0) 2024.07.31
최적의 PK를 찾아서  (0) 2024.07.25
Git Branch 관리 전략  (0) 2024.07.17
객체지향이란 무엇인가  (0) 2024.06.01