/off-coupon

선착순 쿠폰 발행 서비스 입니다. (네고왕 이벤트 참고)

Primary LanguageJava

off-coupon 프로젝트 개요

image
이 프로젝트는 네고왕 선착순 이벤트를 참고하여 개발된 서비스로, 선착순 쿠폰 발행 및 사용 기능을 중점적으로 다루고 있습니다.

프로젝트 목표

  • 고가용성 선착순 쿠폰 발행 및 사용 서비스를 구현하는 것이 목표입니다.
  • 객체지향 원칙에 준수하며 유지 보수 용이한 코드를 작성하는 것을 목표로 합니다.
  • Slice Test를 활용하여 각 모듈의 기능을 단위별로 테스트하는 것이 목표입니다.
  • 대규모 트래픽에도 데이터 정합성을 유지하고 서비스 안정성을 보장하는것이 목표입니다.

Git Flow

✅ master : 릴리스 버전을 관리하는 메인 브랜치
✅ develop : 개발이 진행되는 통합 브랜치
✅ feature : 새로운 기능을 개발하는 브랜치
✅ hotfix : 실제 프로덕션에서 발생한 버그를 수정하는 브랜치

Reference : 우아한 형제들 기술블로그 : gitFlow

프로젝트 기술 스택

  • Java
  • Spring Boot
  • MySQL
  • Redis
  • RabbitMQ
  • MyBatis
  • Gradle
  • JUnit
  • JaCoCo
  • Docker
  • IntelliJ
  • JMeter
  • Jenkins

서비스 아키텍처

image

쿠폰 발행 Flow

image image

쿠폰 사용 Flow

image

쿼리 최적화

1000만건의 데이터를 대상으로 쿼리최적화 with. 복합인덱스, 커버링인덱스
쿼리 최적화를 했지만 부족하다면, Parallel Stream을 사용해보자

동시성 테스트

쿠폰 발급에 대한 동시성 처리 (1) - synchronized, pessimisti Lock, optimistic Lock
쿠폰 발급에 대한 동시성 처리 (2) - MySQL의 NamedLock, Redis의 분산락(Lettuce, Redisson)

CICD

NCP환경에서 Jenkins와 Docker로 CICD Pipeline 구축하기

회원가입

@RequestBody는 어떻게 바인딩 되는걸까? (with. 디버깅 과정)
Request에 대한 validation과 Exception 처리에 대한 고찰
DATETIME vs TIMESTAMP 둘 중 어느것이 더 나을까?

트러블 슈팅

private 메소드를 테스트하려 했지만, 문제는 테스트 코드 로직이었다.
Junit 테스트 중 Lock wait timeout exceeded 에러 발생
테스트코드도 코드이므로 합성을 통해 중복을 없애자

Commit Convention

  • feat : 새로운 기능 추가
  • fix : 버그 수정
  • docs : 문서 수정
  • style : 코드 포맷팅, 세미콜론 누락, 코드 변경이 없는 경우
  • refactor : 코드 리팩토링
  • test : 테스트 코드, 리팩토링 테스트 코드
  • chore : 빌드 업무 수정, 패키지 매니저 수정