Tiny Star

프로젝트/쿠폰 7

[쿠폰] 성능 테스트 및 개선 (JDBC Bulk Insert)

k6 - DB Worker delay1. 100count / 5s k6는 테스트를 진행해서 끝났는데, insert는 계속되는 문제가 발생했다.현재 로직은 5초마다 최대 100개의 메세지를 처리하도록 되어있는데 이 수치를 조정해서 보완해보려고 한다. 2. 10,000count / 5s '20분 -> 1분'으로 많이 줄었지만, 그래도 1분 이상 차이가 난다.아무래도 한번 메세지를 받을 때마다 5초의 딜레이가 있다보니 거기서 나오는 문제로 예상된다.1초로 바꿔보자. 3. 10,000count / 1s이제 1분 안으로 들어왔다.다만 1초로 줄였음에도 30초가 넘는 차이가 나는게 이상한데, 아무래도 saveAll()이 하나씩 insert 하다보니까 생기는 문제가 아닐까 생각해봤다. Bulk insert가 가..

프로젝트/쿠폰 2025.04.30

[쿠폰] 테스트를 위한 k6 + InfluxDB + Grafana 구성

k6 → InfluxDB → Grafanak6: 테스트 트래픽 생성InfluxDB: 시계열 DB, 테스트 메트릭 저장Grafana: 실시간 시각화 1. k6 Dockerdocker pull grafana/k6// coupon_test.jsimport http from 'k6/http';import { check } from 'k6';export const options = { vus: 100, // 가상 사용자 수 duration: '10s', // 테스트 시간};export default function () { // 1 ~ 10 사이의 랜덤 couponId const couponId = Math.floor(Math.random() * 10) + 1; const url = `http:..

프로젝트/쿠폰 2025.04.30

[쿠폰] 쿠폰 발급 수정 (saveAll, @Transactional)

for (MapRecord message : messages) { // 중략 CouponIssues issued = CouponIssues.builder() .coupons(Coupons.builder().id(Long.parseLong(couponIdStr)).build()) .userId(userId) .build(); couponIssuesRepository.save(issued); // 중략}기존 코드는 이렇게 CouponIssues 객체 하나씩 인서트하고 있었는데,이렇게하면 Redis 등록하면서 인서트하는거나 마찬가지였다. 그래서 CouponId 기준으로 그룹지어 saveAll 처리하고 그에 따라 Redis Stre..

프로젝트/쿠폰 2025.04.29

[쿠폰] 쿠폰 발급 (Redis Stream, CustomDbWorker)

쿠폰 발급에 관한 상세사항은 [Git Issues] 참고 흐름[1] 발급 요청 수신 ↓[2] Redis 재고 조회 ↓[3] 재고 DECR - 재고 부족이면 → 발급 실패 ↓[4] 발급 성공 - 재고 DECR 상태 유지큰 흐름은 위와 같다.다만 여기에서는 Redis에 해당 Key가 만료되어 사라지거나 다른 문제로 없어졌다면 어떻게 해야할지와DECR만 할 뿐 발급 내역을 따로 저장하는 로직이 포함되어 있지 않아서 추가했다. [1] 발급 요청 수신 ↓[2] Redis 재고 조회 - 없으면 → DB 조회 → Redis 복구 ↓[3] 재고 DECR - 재고 부족이면 → 발급 실패 ↓[4] 발급 성공 - 발급 성공 이력을 Kafka/Redis Stream 등에 publish ..

프로젝트/쿠폰 2025.04.29

[쿠폰] 쿠폰 조회 (Redis 예외처리)

couponId에 따른 재고 조회하는 API (자세한 내용 Git Issue 참고) 1. 요구사항1. 목적Redis에 coupon:{couponId}:stock 형식으로 재고를 등록한다. 2. 작업 내용POST /api/admin/coupons요청 파라미터:couponId (Long, 필수) : 쿠폰 IDquantity (int, 필수) : 초기 재고 수량ttlSeconds (int, 선택) : 재고 만료시간(초 단위), 미지정시 무제한 유지 3. 요청/응답 예시요청POST /api/admin/coupon{ "couponId": 123, "quantity": 100, "ttlSeconds": 86400} 응답{ "couponId":13, "stock":100} 2. 작업 내용//..

프로젝트/쿠폰 2025.04.28

[쿠폰] 쿠폰 생성 (@Transactional, CustomException)

쿠폰 정보를 받아서 DB에 저장하고 Redis에도 올리는 작업을 했다. (자세한 내용은 Git Issue 참고) 1. 요구사항1. 목적쿠폰 등록 시 DB와 Redis를 일관성 있게 관리하기 위해 등록 흐름을 명확히 분리한다.쿠폰 정보를 먼저 DB에 저장하고, 생성된 coupon_id를 기반으로 Redis에 재고를 등록하는 프로세스를 구현한다. 2. 작업 내용쿠폰 종류 등록 API 구현POST /api/admin/coupons API 생성쿠폰 이름(name), 총 수량(total_quantity) 등을 받아 DB에 저장저장 후 생성된 coupon_id를 반환쿠폰 재고 Redis 등록반환된 coupon_id를 사용하여 Redis에 coupon:{coupon_id}:stock으로 재고 등록필요 시 TTL(만..

프로젝트/쿠폰 2025.04.28

[쿠폰] Redis 선착순 쿠폰 시스템

Redis를 사용하여 선착순 쿠폰 시스템을 만들어보기로 했다.쿠폰에 초점이 맞춰진만큼 로그인 기능 등은 안넣고 오로지 쿠폰 발급만 구현하려고 한다. 🎯 시스템 구성 목표로그인 없이 (단, userId는 요청에 포함)선착순 쿠폰 발급쿠폰 재고는 Redis로 관리쿠폰 발급 결과만 DB에 저장빠른 응답 최우선 ✅ API 설계 구분 내용 MethodPOSTURL/api/coupons/issue요청 Body{ "userId": "string", "couponId": "string" }응답성공: { "success": true, "message": "쿠폰 발급 성공" }실패: { "success": false, "message": "쿠폰 소진" } ✅ ERD 설계[Coupon] (쿠폰 종류 관리 테이블)-..

프로젝트/쿠폰 2025.04.28
top