반응형

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

Mysql 기반 선착순 쿠폰 발급 기능 개발 (5)

동시성 이슈를 해결하기 위해 다음과 같은 방식으로 순차적으로 적용해보겠다.synchronizedredis lockmysql lock각 방식을 적용함으로써 장단점도 같이 알아보겠다. 동시성 이슈 해결 - synchronized 들어가기 앞서 synchronized 가 무엇인지 알아보자.스레드 동기화란?스레드 동기화는 멀티스레드 환경에서 여러 스레드가 하나의 공유자원에 동시에 접근하지 못하도록 막는것을 말한다.공유데이터가 사용 되어 동기화가 필요한 부분을 임계영역(critical section)이라고 부르며, 자바에서는 이 임계영역에 synchronized 키워드를 사용하여 여러 스레드가 동시에 접근하는 것을 금지함으로써 동기화를 할 수 있다.  synchronized 사용 방법1) 메소드에 synchron..

Mysql 기반 선착순 쿠폰 발급 기능 개발 (4)

성능테스트에 앞서 미리 알고 있으면 좋은 것들에 대해서 설명하겠다. 성능 테스트에서 서비스가 빠른지 느린지에 대한 기준은 다음과 같이 크게 2가지로 판단할 수 있다.ThroughputLatency Throughput Throughput이란 시간당 처리량을 의미한다.TPS(Transaction Per Second), RPS(Request Per Second) 등으로도 불리며, '1초에 처리하는 단위 작업의 수' 혹은 '1초에 처리하는 HTTP 요청 수' 등으로 해석할 수 있다. 즉, 1초에 최대한 많은 작업을 처리할 수 있는 서비스가 성능 측면에서 좋은 서비스라고 볼 수 있다. 예를 들어, A 서비스는 1초에 1000개의 작업을 처리하고, B 서비스는 1초에 2000개의 작업을 처리할 수 있는 능력을 가졌..

Mysql 기반 선착순 쿠폰 발급 기능 개발 (3)

이제부터 만든 서비스를 호출하기 위해 presentation Layer 설계를 해보자. 그전까지는 다른곳에서 가져다 쓸 mycoupon-core 에서 작업하였고, 지금은 mycore-api에서 작업을 진행하겠다. CouponIssueController // mycouponapi/controller/CouponIssueController.java package com.example.mycouponapi.controller; import com.example.mycouponapi.dto.CouponIssueRequestDto; import com.example.mycouponapi.dto.CouponIssueResponseDto; import com.example.mycouponapi.service.Coup..

Mysql 기반 선착순 쿠폰 발급 기능 개발 (2)

쿠폰 엔터티 발급 기능 이제부터 본격적으로 coupon 엔터티에 기능을 추가해보자. 서비스에 기능을 추가할 수 있지만, DDD 관점에서 설정을 한다면 도메인과 관련된 기능은 도메인에 넣어주는 것이 좋다. Coupon // mycouponcore/model/Coupon.java package com.example.mycouponcore.model; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Entity @Builder @NoArgsConst..

Mysql 기반 선착순 쿠폰 발급 기능 개발 (1)

mysql, redis 설정 먼저 mysql과 redis를 도커 컨테이너로 띄우기 위해 docker-compose를 작성해 주자. //docker-compose.yml version: '3.7' services: redis: container_name: coupon-redis image: redis:7.2-alpine command: redis-server --port 6380 labels: - "name=redis" - "mode=standalone" ports: - 6380:6380 mysql: container_name: coupon-mysql image: ubuntu/mysql:edge command: mysqld --character-set-server=utf8mb4 --collation-ser..

2. 프로젝트 환경 설정

멀티모듈 구성 좀 더 효율적인 관리를 위해 멀티모듈로 구성해 볼 예정이다. dependecy는 필요할 때 그때 추가하기로 한다. create를 누르면 다음과 같이 프로젝트가 생성될 것이다. 제일 바깥의 디렉토리는 src 폴더가 필요없으니 삭제해주도록 하자. 루트 디렉토리(mycoupon)에서 우클릭 > new > Module… 선택하면 새로운 모듈을 만들 수 있다. 위의 타이틀에 New Module을 꼭 확인하자!! 아까와 동일하게 dependency를 나중에 넣어줄 예정이기에 그냥 바로 craete를 해주자. 총 3가지 모듈로 구성될 것이다. mycoupon-api mycoupon-consumer mycoupon-core 보통 멀티모듈로 구성할 때는 공통으로 가져다 쓰는 모듈을 core로 두고, 나머지..

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

선착순 쿠폰 발급 시스템이란? 한정된 수량의 쿠폰을 먼저 신청한 사용자에게 제공하는 시스템을 말합니다. 선착순 쿠폰 이벤트 요구사항 특정 기간(ex) 2024-04-01 오후 3시 ~ 2024-04-07 오후 8시)에 발급해야 한다. 한 유저당 한번의 쿠폰이 발급되어야 한다. 선착순 쿠폰의 최대 발급 수량이 정해져 있다. 기능 정의서 쿠폰 발급 기능 쿠폰 발급 기간 검증 쿠폰 발급 수량 검증 쿠폰 전체 발급 수량 중복 발급 요청 검증 쿠폰 발급 쿠폰 발급 수량 증가 쿠폰 발급 기록 저장 coupon_id user_id 구현 목표 정확한 발급 수량을 제어합니다.(동시성 이슈 처리) 많은 트레픽이 들어와도 안정적으로 높은 처리량 도메인 크게 2가지 도메인이 있다. 쿠폰 쿠폰 발행 로직에 집중하기 위해 핵심 ..

반응형