회고록

쿠폰 선착순 발급 이벤트 회고록

whyHbr 2024. 12. 10. 17:44
728x90
반응형

1. 프로젝트 개요

  • 프로젝트명: 쿠폰 선착순 발급이벤트 
    • 이벤트 기간내에 발급이 가능하다.
    • 유저당 1번의 쿠폰 발급만 가능하다.
  • 기간: 2024.11.27 ~ 2024.12.10
  • 목표
    • 멀티 모듈에 대한 이해도를 높인다.
    • 대용량 트래픽에 대비해 RPS를 상승시킨다.
    • MySql기반 쿠폰 발급 기능을 개발한다.
    • Redis 기반 쿠폰 발급 기능을 개발한다.
    • 부하 테스트를 진행한다.
    • AWS에 서버를 배포한다.
  • 팀원: 본인 
  • 기술 스택
    • Infra
      • Aws EC2, Aws RDS, Aws Elastic Cache
    • Language
      • Java 17
    • Framework 
      • Spring Boot 3
    • ORM 
      • JPA
    • Library 
      • QueryDsl
    • Database
      • MySql, Redis, H2
    • Monitoring
      • AWS Cloud Watch, Prometheus, Grafana
    • Test
      • Locust
    • Tools
      • Docker Desktop, Intellij

2. 프로젝트 진행 과정

  • 주요 기능 개발:
      • 쿠폰 발급 검증
        • 발급 기한
        • 발급 수량
        • 중복 발급
      • 쿠폰 발급 수량 관리
        • Redis Set 기반 재고 관리
      • 비동기 쿠폰 발금
        • Redis List (발급 queue) 
        • Queue Polling Scheduler
  • 기술적 도전:
      • QueryDsl 을 사용해보았다.
      • symchronized 를 사용해 동시성 이슈를 해결해보았다
      • MySql X Lock 을 사용해 동시성 이슈를 해결해보았다.
      • aop가 아닌 서비스 로직에 적용하는 redis 분산락을 적용해보았다.
      • redis script를 사용해 동시성 이슈를 해결해보았다.
      • redis List, set 을 사용해 쿠폰 발급 서버를 구축해보았다.
      • local cache 를 적용해보았다.
      • grafana, prometheus, Aws CloudWatch 를 사용해 모니터링 환경을 구축해보았다.
      • Aws 배포를 진행해보았다.

3. 성공적인 점

  • 잘 된 부분.
    • 프로젝트 목표를 달성하였다.
    • 트랜잭션에 대한 이해도를 높이며, 다양한 락을 사용해보았다.
    • 두 번 째 Locust 사용이라 전보다 원활하게 사용할 수 있었다.
    • 대용량 트래픽에 대한 대응을 하였다.  RPS 상승이 눈에 보였다.
      • RPS (number of user: 600, ramp up: 100)
        • sycronized: 786
        • Redis 분산락: 319
        • MySql X Lock:  3669
        • redis script: 4652
    • 모니터링을 해보았다. 
    • Aws ec2, rds, elastic cache 을 사용해 배포를 처음 해보았다.

4. 개선할 점

  • 어려운 부분
    • 처음 사용해보는 기술과 툴이 많아 이해하는데 어려움을 겪었다. 특히 aws 는 많이 어렵다. 시간과 노력이 더 필요할 거 같다. 
    • redis script 를 처음 사용해보아 이해하는데 어려움이 있었다. 
    • 배포를 처음해보아 마음대로 안되는 점들이 있었다. 보안상 yml파일을 올리지 않아 ec2 내부에 직접 작성하는방법, security group inbound rules, local 환경에 rds 연 등 배포하는 과정에서 많은 시간을 할애했다.

5. 배운 점

  • 기술적 배움:
    • 익숙하지 않았던 기술들
      • 멀티모듈은 약 반 년 전에 처음 사용해본게 끝이었다. 이번 기회에 다시 사용해봄으로써 전보다 이해도가 높아졌고, 전보다 관리가 수월했다.
      • 간단한 스크립트와 모니터링 기능의 장점으로 인해 지난 프로젝트에 이어 locust 를 사용하였다. 한 번 해봤다고 손에 익어 지난 번 보다 더 수월하게 사용할 수 있었다. 간단한 스크립트와 모니터링 기능이 큰 장점이라고 느꼈다. 
    • 새로운 기술과의 만남
      • MySql X Lock은 DB 자체를 잠구는 락이라 성능이 좋지 않다는 말을 들어 주로 레디스 분산락을 사용해왔다. 하지만 이번에 Locust 를 사용해 RPS를 측정해보니 redis 319, x lock 3369, 10배 이상의 차이로 xlock 의 성능이 좋았다. 컴퓨터 성능상 number of people, ramp up 을 낮게 잡아서 그런가 내가 듣고 생각하던 것과 달랐다. 작은 서비스 같은 경우 x lock 을 사용하는 것도 좋을 것이라는 배움을 얻었다.
      • 처음 QueryDsl을 사용해보았다. 지난 프로젝트서 사용하자는 의견이 있었는데 멘토님께서 요즘은 잘 사용하지 않는 기술이라고 하셔서 사용하지 않았던 기억이 있다. 요즘은 잘 사용하지 않더라도, 경험을 했다는 것에 의의를 뒀다.
      • Redis script 라는 존재를 처음 알았다. 
        • Lua언어로 작성된다. 자유롭게 사용하려면 시간을 더 들여야할 거 같다.
      • local cache 인 caffine 을 처음 사용해보았다.
        • 1차로 local cache를 확인하고 없다면 redis cache 를 사용하는 방식을 적용하니 RPS가 향상하였다. 
      • 모니터링 환경을 구축해보았다.
        • docker-compose.yml 을 사용해 컨테이너를 띄워 프로메테우스를 사용해 메트릭을 수집, 그라파나를 통해 시각화, 대시보드를 만들었다. 또한 Aws CloudWatch 를 사용해 모니터링 환경을 구축하였다.
      • aws 배포에 대한 지식이 생겼다.
        • 배포를 처음 해보았다. 글과 강의로만 접하다가 직접 해보는 기회를 가졌다.  ec2, elastic cache, security group, cloud watch 등 얕게나마 지식이 생겼다. 하지만 자유자재로 사용해보려면 더 배워야 할 것이댜.
  • 프로젝트 관리와 협업:
    • 깃허브 이슈를 사용해 이슈를 관리 하였다.
    • pr conversation 에 해당 pr이 어떤 기능을 하는지 기록했다.
    • 티스토리에 진행 과정을 기록하였다.

6. 향후 계획

  • 향후 개선 사항:
    • 현재는 쿠폰 발급 기능 이라는 하나의 api 만 개발하였다. 더 확장해 여러가지 기능을 추가하면 실력 향상에 많은 도움이 될 것 같다. 
  • 개선된 프로세스:
    • 지난 번에도 propertie 를 ignore에 작성하고, ci 과정서 결국 원본 properties 를 깃허브에 올렸다. 이번엔 ec2내에 작성해 중요 환경변수 값을  github에 올리는 일을 피했다. 

혼자 진행하는 프로젝트에서 많은 도전, 툴, 기능을 사용해봐야겠다. 그래야 추후에 프로젝트를 진행할 때, 취업을 했을 때 도움이 될 수 있을 것이다

 

728x90