Tiny Star

전체 글 46

[데이터] Kaggle (캐글)

프로젝트에 활용할 데이터셋을 찾다가 Kaggle(캐글) 이라는 사이트를 알게되었다. Kaggle데이터 과학자와 머신러닝 엔지니어들이 모여 서로 문제를 풀고, 데이터를 분석하고, 학습하는 플랫폼Kaggle은 수십만 개의 데이터를 자유롭게 검색하고 활용할 수 있는 데이터 저장소 제공CSV부터 이미지, JSON까지 다양한 형식의 데이터셋이 있고, 무료로 이용 가능 데이터셋 예시 주제 예시 데이터셋 건강/의료코로나 확진자 현황, 의학 이미지스포츠월드컵 경기 결과, NBA 선수 스탯경제/금융주식 시장, 암호화폐 가격게임포켓몬 정보, 롤 챔피언 통계일상/기타넷플릭스 영화 목록, 음식 영양 정보 ⭐ 실제 업무용 데이터뿐만 아니라, 흥미로운 주제의 캐주얼한 데이터도 많아서 초보자도 쉽게 접근 가능 사용하는 법 ..

IT 2025.05.05

[쿠폰] 성능 테스트 및 개선 (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

[Spring] @Transactional 트랜잭션 어노테이션

쿠폰 프로젝트를 진행하면서 사용하게 된 어노테이션이다. [클라이언트 요청] ↓POST /api/admin/coupons ↓[CouponService] ↓1. couponsRepository.save(coupon) 실행 ↓2. RedisTemplate 재고 등록Redis에 재고 등록을 하게되는데, 만약 이 때 오류로 Redis 등록에 실패했다면 DB에 저장된 데이터도 삭제하는게 좋다고 판단했다. 왜냐면 실패했을 시 똑같은 쿠폰을 다시 발행할텐데, DB 에는 동일한 이름의 쿠폰이 두 개가 등록되기 때문이다. 1. @Transactional@Transactional은 메서드 실행을 하나의 트랜잭션 단위로 묶어서,전체가 성공하면 커밋(commit),중간에 실패하면 롤백(rollback) 하게..

IT 2025.04.28

Redis란?

공고보면 기술 스택에 Redis가 있는 경우를 왕왕 봤다.전 실무에서는 대용량데이터를 넣고 통계돌리는 일이 과반수였기 때문에 Redis를 사용할 일이 없었다.그래서 개인 프로젝트하면서 사용할건데, 막상 Redis 에 대해 자세히 알지 못해서 찾아서 정리해보려고 한다. 1. Redis 란?Remote Dictionary Server의 약자로 메모리 기반의 Key-Value 저장소이다.대표적인 In-Memory DataStructure Store로 데이터가 RAM에 저장되어 매우 빠른 읽기/쓰기 속도를 제공한다.RAM 사용으로 인한 단점은 없을까?- 비용 문제: 디스크에 비해 비싸기 때문에 대용량 데이터를 저장하려면 비용이 많이 든다.- 용량 한계: 디스크보다 훨씬 작기 때문에, 너무 많은 데이터를 넣..

IT 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