Skip to content

캠프파이어에서 마지막에 남아있는 그 달콤한 조각! 딱 “한 번만, 특별하게” 먹는 느낌 한정판이라 달콤하지만 빨리 사라지는, 그런 의미를 담았습니다

Notifications You must be signed in to change notification settings

FocusCrew-4/Smore

Repository files navigation

🧁 Smore / KeepGoing

한정판 굿즈 구매 경쟁 & 경매 커머스 플랫폼

고트래픽 환경에서도 공정성과 정합성을 보장하는 이벤트 기반 경쟁 구매·경매 커머스 시스템

브로셔 링크

https://teamsparta.notion.site/Smore-2d32dc3ef5148071b2addf555bfee097?pvs=74


팀 소개

유영우 (Team Lead)

  • BidCompetition : 구매 경쟁 핵심 플로우 설계·구현
  • Order : 주문 생성, 상태 전이, 환불 연계 및 정합성 제어

송의현

  • Member : 회원 도메인 설계 및 관리
  • Auth : 인증·인가(JWT, 권한 제어)
  • Auction : 실시간 경매(WebSocket)
  • Gateway(GW) : API Gateway, 보안 및 내부 통신 제어

안지현

  • Product : 상품 도메인 및 상태 기반 라이프사이클 관리
  • Category : 카테고리 도메인 설계 및 검색 연계

류형선

  • Payment : 결제 생성·승인·환불·정산 전체 흐름 구현
  • PaymentPolicy : 결제/환불/취소 정책 도메인 설계
유영우 안지현 송의현 류형선
@yoo20370 @An-jihyun @yawning5 @ooinl77

📌 프로젝트 개요

Smore는 판매자가 설정한 기준 수량에 도달하면 남은 상품을 자동으로 경매로 전환하여 판매할 수 있는 한정판 굿즈 특화 커머스 플랫폼입니다.

인기 상품은 정가 판매로 빠르게 소진

일정 수요 이상에서는 경쟁·경매를 통해 상품 가치 극대화

구매자는 공정하고 투명한 경쟁 기반 구매 경험을 제공받습니다


🧠 핵심 아이디어

판매자는 상품 등록 시 정가 판매 수량 + 경매 전환 기준 수량을 함께 설정

기준 수량 도달 시 👉 운영 개입 없이 자동으로 경매 모드 전환

경매 종료 후 👉 상위 입찰자 순으로 구매 권한(Winner) 확정


🎯 프로젝트 목표

DDD 기반 MSA 설계

  • 비즈니스 도메인 중심 서비스 분리
  • 책임 경계 명확화 및 변경 영향 최소화

Kafka 이벤트 기반 비동기 처리

  • 서비스 간 결합도 최소화
  • Inbox / Outbox 패턴으로 이벤트 전달 신뢰성 확보

고트래픽 구간 안정성 확보

  • 판매 전환, 결제 만료, 환불 등 트래픽 집중 구간 분산 처리

동시성 제어 & 데이터 정합성 보장

  • 선착순 구매 / 입찰 / 환불 요청 환경에서도 overselling 방지

보상 트랜잭션 기반 예외 처리

  • 결제 실패·만료·환불을 정상 흐름으로 설계

검색 및 인기 상품 고도화

  • Elasticsearch + ETL 기반 검색 파이프라인

관측 가능성(Observability) 강화

  • Zipkin / Prometheus / Grafana 기반 병목 분석 및 성능 개선

시스템 아키텍처

image

ERD

image

이벤트스토밍

image

UseCase

image

ContextMap

image

경쟁 - 주문 - 결제 플로우 차트

image

주요 기능

👤 회원 관리

🟢 인증 및 인가 관리

  • 사용자의 로그인 요청을 처리하고 서비스 접근을 위한 인증/인가 기준을 일관되게 적용합니다.
  • 사용자 역할(Role)에 따라 접근 가능한 기능을 구분합니다.

🟢 로그인/로그아웃 제공

  • 사용자 로그인 기능을 제공하여 인증된 사용자만 서비스 이용이 가능합니다.
  • 로그아웃 시 기존 인증 정보를 무효화하여 보안성을 유지합니다.

🟢 JWT 기반 인증 토큰 관리

  • 인증 성공 시 사용자 식별 및 권한 정보가 포함된 JWT를 발급합니다.
  • 서비스 요청 시 전달된 토큰을 검증하여 유효한 사용자 요청인지 판단합니다.

🟢 회원 정보 관리

  • 회원 가입, 조회, 수정, 탈퇴 등 회원정보의 전체 생명주기를 관리합니다.
  • 탈퇴 시, 데이터 정합성과 이력 관리를 고려한 소프트 삭제 방식을 적용합니다.

🟢 판매자 등록 및 승인 관리

  • 판매자 등록 요청을 관리하고, 관리자 승인 또는 거절할 수 있는 기능을 제공합니다.
  • 승인된 판매자만 판매 관련 기능을 사용할 수 있도록 제어합니다.

📦상품 도메인 관리

🟢 한정판매 → 경매 전환이 가능한 상품 라이프사이클 관리

  • 판매자가 설정한 기준 수량에 도달하면 상품은 한정판매에서 경매로 자동 전환됩니다.
  • 상품 상태(판매중, 전환대기, 경매진행, 종료)에 따라 흐름이 명확히 분리된 상태 기반 도메인으로 설계되었습니다.

🟢 상태 기반 흐름 제어 및 이벤트 연계

  • 상품 상태 변경을 중심으로 비즈니스 로직을 구성하여 복잡한 조건 분기 없이 일관된 흐름을 유지합니다.
  • 상태 변경 시 도메인 이벤트를 발행하여 재고, 경매 도메인과 느슨하게 연동됩니다.

🟢 검색 최적화를 위한 Elasticsearch 적용 (Elasticsearch 기반 상품 검색 기능 구현)

  • RDB 조회 중심 구조에서 벗어나 Elasticsearch를 활용한 상품 검색 기능을 도입했습니다.
  • 상품명, 설명, 카테고리, 판매 상태 등 검색 품질에 중요한 필드를 기준으로 색인을 구성했습니다

🟢 ETL 기반 검색 데이터 파이프라인 구성

  • 크롤링 및 가공 데이터를 활용해 검색 전용 상품 인덱스를 생성하는 ETL 구조를 설계했습니다.
  • 운영 DB와 검색 인덱스를 분리하여 조회 성능과 확장성을 동시에 확보했습니다.

🟢 검색 확장을 고려한 데이터 모델링

  • 향후 조건 검색, 추천, 랭킹, 벡터 검색 고도화를 고려해 검색 친화적인 상품 Document 구조를 설계했습니다.
  • 검색 시스템이 도메인 로직에 영향을 주지 않도록 인프라 레벨에서 책임을 분리했습니다.

🔖카테고리 도메인 관리

🟢 상품과 분리된 독립 카테고리 구조

  • 카테고리를 상품과 분리된 독립 도메인으로 설계하여 서비스 확장 시 결합도를 최소화했습니다.
  • 카테고리 변경이 상품 로직에 영향을 주지 않습니다.

🟢 카테고리 기반 탐색 및 검색 연계

  • 카테고리 기준 탐색이 가능하며 Elasticsearch 검색 조건과 자연스럽게 연계됩니다.
  • 검색 및 추천 시스템 확장을 고려한 카테고리 모델을 적용했습니다.

🛒 실시간 구매 경쟁

🟢 대규모 트래픽에서도 주문 실패 없이 안정적인 구매 경험 제공

  • 사용자는 제한된 수량의 상품에 실시간 구매에 참여하여 즉시 선착순 구매 권한 획들 결과를 확인할 수 있습니다.
  • 대규모 동시 접속 상황에서도 중복 주문이나 초과 판매 없이 공정한 참여 경험을 제공합니다.

🟢 구매 성공자 자동 확정 및 결제 시간 관리

  • 선착순 사용자는 즉시 구매 권한을 부여받고, 정해진 시간 내 결제를 완료하도록 관리됩니다.
  • 결제 미완료 시 구매 권한은 자동으로 만료되어 다음 사용자에게 기회가 제공됩니다.

🟢 재고 자동 관리 및 복구 시스템

  • 상품 재고는 실시간으로 관리되며, 결제 실패/취소/만료 상황에서도 재고가 자동으로 복구됩니다.
  • 판매 종료 후에도 재고 불일치로 인한 운영 이슈를 방지합니다.

🟢 재고 변경 이력을 기록하여 운영자가 추적 가능한 관리 환경 제공

  • 모든 재고 증감 내역이 이력 로그로 기록되어 운영자는 언제 어떤 사유로 재고가 변경되었는지 추적 가능합니다.
  • 이를 통해 장애, 클레임, 정산 이슈 발생 시에도 원인 분석과 대응이 가능합니다.

🟢 중복 요청 및 오류 상황에서도 일관된 결과 보장

  • 반복 요청, 네트워크 지연, 재시도 상황에서도 주문 결제 결과가 중복 처리되지 않도록 설계되었습니다.
  • 동일한 요청에 대해 항상 동일한 결과를 제공하여 사용자 혼란을과 운영 리스크를 최소화합니다.

🧾 주문 서비스

🟢 주문 생성 및 관리

  • 사용자의 구매 요청을 주문 단위로 생성하고 관리합니다.
  • 주문은 결제/재고/경매 흐름의 기준이 되는 중심 도메인입니다.

🟢 주문 상태 관리

  • 주문 전체 생명주기를 관리합니다. (주문 생성 → 결제 대기 → 결제 완료 → 주문 완료 / 취소 / 환불)
  • 주문 상태를 기준으로 후속 서비스의 동작 여부가 결정됩니다.

🟢 결제 및 환불 연계

  • 결제 서비스와 연계하여 결제 요청을 시작합니다.
  • 결제 성공 / 실패 / 환불 결과를 수신하여 주문 상태를 일관되게 갱신합니다.

🟢 부분 환불을 지원하는 환불 요청 및 처리 관리

  • 하나의 주문에 대하여 여러 건의 부분 환불 요청을 관리합니다. 환불 가능 여부를 주문 기준으로 판단하고, 환불 요청을 결제 서비스로 전달합니다.

🟢 환불 누적 기준 관리 및 동시성 제어

  • 주문 기준으로 환불 예약/완료 수량을 누적 관리하여 초과 환불을 방지합니다.
  • 동시 환불 요청 상황에서도 일관된 결과를 보장합니다.

🟢 재고 경매 결과 반영

  • 환불 완료 시 실시간 재고 또는 경매 자원이 정상적으로 복구될 수 있도록 연계합니다.

🟢 중복 요청 및 일관성 보장

  • 결제 / 환불 재시도 상황에서도 주문 상태가 중복 변경되지 않도록 관리합니다.

🎩 실시간 경매

🟢 경매 생성 및 운영 관리

  • 경매를 생성하고 시작/종료 상태를 관리하여 경매 전체 생명주기를 일관되게 운영합니다.

🟢 실시간 경매 진행 관리

  • 경매 진행 중인 상품에 관련된 실시간 입찰을 지원합니다
  • 실시간으로 유효한 입찰 하한가와 최고가를 제공하여 유의미한 입찰을 할 수 있도록 돕습니다

🟢 입찰 및 낙찰 이력 관리

  • 실시간 입찰 정보를 2 개의 DB 에 기록하여 장애시에도 기록이 보존되도록 하였습니다
  • 자신의 입찰내역을 확인후 낙찰 확정 또는 취소가 가능합니다
  • 현재 낙찰대상이 아니더라도 상위 입찰자가 권리를 포기하게 되면 입찰 이력에 따른 낙찰대상이 될 수 있습니다

🟢 낙찰 결과 기록 및 제공

  • 낙찰자 및 낙찰 금액 포함한 낙찰 결과를 기록합니다.
  • 낙찰 완료 상태를 명확히 관리하여 후속 프로세스와 연계합니다.

💵 결제 서비스

🟢 결제 생성 및 관리

  • 결제 요청을 결제 단위로 생성하고 관리합니다.
  • 결제는 실제 금전 처리를 수행하는 도메인입니다.

🟢 PG사 결제 처리

  • 결제 전, 결제 진행 중, 결제 완료, 결제 실패 등 결제 상태를 명확히 관리합니다.

🟢 PG사 환불(부분 취소) 처리

  • 주문 서비스로부터 전달받은 환불 요청을 기반으로 PG사에 부분 환불(부분 취소)을 요청합니다.

🟢 결제 환불 결과 이벤트 발행

  • 결제 및 환불 성공/실패 결과를 이벤트로 발행하여 주문 서비스 및 다른 서비스가 후속 처리를 수행할 수 있도록 합니다.

🟢 결제 취소 및 보상 처리

  • 결제 취소 요청 시 PG사 취소를 수행하고 내부적으로 보상 트랜잭션을 처리하여 결제 상태의 정합성을 유지합니다.

🟢 결제 만료 처리 및 재고 복구 이벤트 발행

  • 결제 대기 상태에서 결제 시간이 만료된 주문을 감지합니다.
  • 결제 만료 시 이벤트를 발행하여 재고가 자동으로 복구될 수 있도록 연계합니다.

적용 기술

CleanShot 2025-12-28 at 00 22 57@2x

CONTRIBUTORS

유영우 (팀장)

✅ 판매 경쟁 서비스 (Bid-Competition)

⚫ 경쟁 구매 핵심 플로우 구현

  • 고트래픽 선착순 상황에서도 overselling 없이 구매권(Winner)을 확정하도록 경쟁 구매 흐름 설계·구현

⚫ 선착순/경쟁 트래픽 집중 구간 대응 (부하 분산 + 정합성) :

  • Redis+Lua로 재고 선점으로 DB 진입을 1차 제어하고, DB 비관락/조건부 UPDATE로 최종 재고 확정. 실패 시 Redis 선점 재고를 롤백해 Redis–DB 불일치 누적 방지

⚫ 재고 자동 복구 및 종료 이후 변경 차단 :

  • 결제 실패·만료·주문 실패·환불 등 실패/예외 시나리오에서 재고가 자동 복구되도록 구성하고, END 이후 경쟁 재고 변경을 제한해 사고 방지(결과는 Product 재고로 반영)

⚫ 재고 변경 로그 기반 운영 추적성 강화 :

  • 재고 복구/감소 시 로그 기록 + 유니크 키 기반 멱등 로그로 중복 이벤트에도 동일 로그 중복 생성 방지

Winner(선착순 권리 획득) 처리 안정화 (멱등성 + 동시성 제어) :

  • 멱등키로 중복 요청을 차단하고, 결제 완료 이벤트 처리 시 동시 업데이트 충돌을 방지해
  • 상태 전환이 안전하게 확정되도록 구현

⚫ 실패/예외 시나리오 보상 : 결제 만료/환불 등 이벤트에 따라 재고/상태를 자동 복구

✅ 주문 서비스 (Order)

Bid/Auction → Order 생성 이벤트 기반 흐름 설계/구현 :

  • 구매 경쟁/경매 결과 이벤트를 수신해 임시 주문 생성 → Outbox 기록 → 이벤트 발행까지
  • 트랜잭션 경계로 일관되게 처리

⚫ 결제 환불 이벤트 연계 및 상태 전이 안정화 :

  • 결제 완료/실패 이벤트 리스너 구현(ack 기반 재시도 포함), 주문 완료 멱등 처리(이미 완료 시 즉시 성공), CREATED→COMPLETED 등 상태 전이 규칙 강제.
  • 결제 실패 시 주문 FAILED 전환 및 Outbox로 후속 전파

부분 환불 지원 구조 설계/구현 (Refund 엔티티 분리) :

  • 멱등키 기반 중복 방지 + CAS(조건부 Update) 기반 예약/확정 처리로 동시 환불 요청에서도 정합성 유지

✅ 공통 안정성/운영

⚫ 사가/보상 기반 왕복 정합성 흐름 :

  • 판매→주문→결제 정방향 이벤트 연결과, 결제→주문→판매 역방향 보상 흐름(결제 실패/타임아웃/환불 결과 반영 후 재고 롤백/확정 및 Winner 정리) 설계·구현

Outbox 폴링 기반 이벤트 발행 인프라 구축 :

  • Scheduler + Processor로 PENDING 선점(claim) / 재시도 / 실패 처리까지 구현해 전달 신뢰성 확보

⚫ 분산 트레이싱(Zipkin) 문맥 전파 개선 :

  • Outbox/Kafka 경계에서 traceId를 헤더로 연결하여 HTTP→DB→Kafka→Consumer 단일 Trace 추적 가능하도록 구성

대량 처리 안정화 (스레드풀/페이징 튜닝):

  • 만료/복구성 배치에 페이징 적용 및 스레드풀 정책 조정으로 고갈 시에도 안정적으로 처리

⚫ kafka(KRaft) 3노드 클러스터로 인프라 안전성 강화:

  • 서비스 간 비동기 이벤트 흐름의 중심 인프라를 Kafka로 구성하고, 장애/재시도 상황에서도 처리 흐름이 끊기지 않도록 기반을 마련

안지현 (팀원)

✅ Product / Category 도메인 설계 및 구현한정판매 → 경매 전환이라는 핵심 비즈니스 로직을 상태 중심 구조로 구현

Elasticsearch 도입 및 상품 검색 인덱스 설계·적용

ETL 기반 검색 데이터 파이프라인 설계로 운영 DB 부하 없이 검색 성능 확보

이벤트 기반 구조 + 검색 인프라 분리를 통해 확장 가능한 커머스 아키텍처 기반 구축

송의현 (팀원)

Member / Auth

인박스 설계를 통한 동일 이벤트의 중복 수신에도 :

  • 비즈니스 처리는 한번만 성공하도록 보장

판매금 누적, 정산 과정에서 SAGA 와 아웃박스 패턴을 이용하여 데이터 정합성 유지 :

GW

Jwt 를 무조건 신뢰하는게 아닌 Member 의 정보와 조회하여 위변조 가능성 검증 :

내부서버에서는 커스텀 헤더를 통해서 정보전달 하여 :

  • Security 책임을 내부서버로 부터 제거

Auction

WebSocket 을 통한 실시간 경매구현

외부 브로커를 사용해 확장성 및 분산환경에서 Session 문제 해결

Redis 를 사용해 실시간 입찰의 부하를 DB 로 부터 제거 및 부하 완화

허용되는 구독과 메시지 발행 토픽을 Redis 로 관리하여 STOMP 의 인가문제 완화

류형선 (팀원)

결제 생성 → 승인 → 정산 이벤트까지의 전체 승인 플로우 구현

주문 생성 이벤트 수신 후 임시 결제 생성:

  • order.created.v1 이벤트 수신 → 만료 체크 → 임시 결제(Redis) 생성 및 저장 로직 구현

임시 결제 Redis 저장/조회/승격 및 API Inbox 구현:

  • TTL 기반 임시 결제 저장 및 승인 시 key 승격 처리로 빠른 승인 흐름 지원

⚫ TossPayments 샌드박스 결제 구현:

  • 상품 주문 내역을 바탕으로 한 샌드박스 결제

⚫ 결제 승인 API 구현:

  • /api/v1/payments/approve 엔드포인트에서 승인 요청을 받아 PG 승인 흐름으로 연결

승인 서비스 로직 설계:

  • Redis 단기 멱등 캐시 → RDB 멱등 확인 → 임시 결제 검증 → PG 승인 요청. 승인 성공 시 결제 저장 + 수수료 정책을 적용하여 정산금 계산 + Outbox 이벤트 발행

⚫ PG 연동 구현: Toss 승인/환불 WebClient 호출 및 응답 매핑 처리

이벤트 기반 통합 + 멱등성/재시도 구조 고도화

Outbox 패턴 구현:

  • 결제 승인/정산/환불 등 이벤트를 Outbox에 저장하고 Kafka로 재전송까지 포함

API 단기 멱등성:

  • approve 요청을 Redis API Inbox에 저장해 중복 호출 방지

TTL 만료 기반 결제 실패 처리:

  • Redis 키 만료 이벤트로 결제 실패 이벤트 발행 처리

환불 도메인: 정책/PG/이벤트/재시도까지 완성된 복합 흐름

환불 요청 이벤트 수신 + Inbox 기반 처리:

  • 환불 이벤트 수신 → 재시도 횟수 관리 → Inbox 상태 전이 → 처리 중복 방지

환불 정책 판단 + 금액 계산:

  • CancelPolicy/RefundPolicy 적용 기준에 따른 환불 가능 여부 및 환불 금액 계산

PG 환불 호출 + 실패/성공에 따른 이벤트 발행:

  • PG 환불 결과에 따라 실패/성공/재시도 Outbox 이벤트 생성

정산 도메인 구현 및 안정성 검증

정산 요청 처리/검증/성공/실패 이벤트 발행:

  • 정산금 검증 → Ledger 적재 → 성공/실패 이벤트 분기

Mongo 기반 정산 Ledger 저장 및 멱등 처리:

  • 중복 idempotencyKey 무시 처리로 안정성 확보

정책 도메인 전체 구성

정책 CRUD API 구현: 수수료/취소/환불 정책 생성/조회/삭제 API 제공:

정책 Facade 연동:

  • 결제 승인 시 FeePolicy 조회 및 정산 계산에 활용.
  • 결제 취소/환불 시 CancelPolicy/RefundPolicy 조회 및 검증에 활용

감사 로그(Audit Log)로 운영 가시성 확보

승인 요청/PG 승인/환불 요청/환불 완료 등 결제 전 과정 로그를 Mongo에 저장하여 운영 모니터링과 장애 분석 근거 확보

About

캠프파이어에서 마지막에 남아있는 그 달콤한 조각! 딱 “한 번만, 특별하게” 먹는 느낌 한정판이라 달콤하지만 빨리 사라지는, 그런 의미를 담았습니다

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors 4

  •  
  •  
  •  
  •  

Languages