Blooming Blooms는 픽업과 배송이 가능한 컴포저블 서비스로 MSA기반 화훼 쇼핑몰 플랫폼입니다. 다양한 주문(배달주문, 픽업주문, 구독주문)이 존재하며, 몰인몰 형태로 Seller가 입점해 제품을 판매하는 형태의 쇼핑몰입니다.
- 2023년 10월 31일 ~ 2024년 1월 29일
Store서비스는 가게 사장(Seller)과 관련된 기능이 구현되어 있는 MicroService입니다.
주요 도메인으로는 가게와 관련된 로직을 수행하는 Store, 가게의 재고를 담당하는 Cargo, 가게사장이 생성하고 유저가 사용하는 Coupon, 상품에 대한 문의인 Question이 존재합니다.
Store서비스의 Layer는 5단계(Controller → Facade → Service → Handler → Repository)로 구성되어 있습니다.
Service Layer는 핵심 비즈니스 로직이 작성되며 주로 하나의 트랜잭션으로 묶이는 작업들이 존재합니다.
Facade Layer는 트랜잭션으로 묶이지 않는 FeignClient통신, Kafka Pub/Sub, SQS Pub/Sub등의 작업을 진행합니다. 이는 불필요한 작업으로 Service Layer의 트랜잭션이 길어지는 걸 방지하기 위함입니다.
Handler Layer는 Repository Layer의 작업을 한층 더 추상화 해 Service Layer코드의 가독성을 높여주고 데이터 접근과 관련된 중복 코드를 줄여줍니다.
- 요구사항 : 1인당 1장만 발급 가능하며 한정된 수량의 쿠폰만 발급해야 합니다.
- 문제 : 멀티쓰레드 환경에서 쿠폰을 발급했을 때 동시성 문제로 쿠폰 초과 발급 문제 발생합니다.
- 고려한 사항 : 비관락, Redisson, Redis의 Set, Redis의 트랜잭션, Redis의 Lua Script
- MSA환경의 확장성을 고려해 비관락이 아닌 분산락 선택했습니다.
- Redisson : 1인 1발급 요구사항을 확인하기 위해 RDB를 한번 더 탐색하는 과정이 필요해 사용하지 않았습니다.
- Set자료구조 : 발급 개수를 확인하고 추가로 발급하는 작업이 원자적이지 못해 사용하지 않았습니다.
- Redis트랜잭션 : 트랜잭션 작업이 완료돼야만 결과값을 활용할 수 있어 사용하지 않았습니다.
- 해결 방법 : Lua Script를 작성하고 이를 실행하는 방법으로 멀티쓰레드 환경의 동시성 문제를 해결했습니다.
- 검증 : 멀티쓰레드 환경의 테스트 코드 작성, 실서버에서 JMeter 동시 요청을 이용한 테스트를 진행했습니다.
- 요구사항 : 쿠폰을 발급받은 유저 정보를 쿠폰의 유효기간 동안 Redis에 set자료구조로 보관해야 했습니다.
- 문제 : 쿠폰의 유효기간은 쿠폰을 생성하는 시점에 결정되지만, 실제로 Redis에 데이터를 저장하고 TTL을 설정하는 작업은 유저가 쿠폰을 발급 받는 시점에만 가능했습니다.
- 해결 방법 : 쿠폰 생성과 동시에 더미 데이터를 넣은 set데이터를 생성해 쿠폰 생성과 Redis에 데이터를 넣는 시점의 불일치를 해소했습니다.
프로젝트를 수행하면서 했던 고민과 문제해결 방법, 공부한 내용들이 정리되어 있는 블로그 링크입니다.
- https://velog.io/@qwerty1434/락을-통한-동시성-제어-쿠폰편
- https://velog.io/@qwerty1434/락을-통한-동시성-제어-재고편
- https://velog.io/@qwerty1434/락을-통한-동시성-제어-설명편
- https://velog.io/@qwerty1434/테스트-코드-멀티쓰레드-환경의-트랜잭션
- https://velog.io/@qwerty1434/MSA환경에서-트랜잭션-관리하기
- https://velog.io/@qwerty1434/프로젝트-구조에-대한-고민1-비즈니스-로직을-어떻게-잘-보여줄-수-있을까
- https://velog.io/@qwerty1434/프로젝트-구조에-대한-고민2-트랜잭션을-최대한-짧게-유지하기
- https://velog.io/@qwerty1434/Resilience4j와-CircuitBreaker-기초
- https://velog.io/@qwerty1434/카프카-개념-정리
- https://velog.io/@qwerty1434/Spring-Jpa환경에서-복합키-사용-시-Duplicate-Exception이-발생하지-않는-이유
- https://velog.io/@qwerty1434/반정규화-테이블-관리하기