Skip to content

minibr/TT-Ticket-Trade

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

328 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

TT (Ticket & Trade) - Backend

곡연 예맀(λŒ€κΈ°μ—΄/μ’Œμ„ 선점/좔첨·신청 예맀)와 ν‹°μΌ“ 거래(κ΅ν™˜/양도), 결제 흐름을 μ§€μ›ν•˜λŠ” Spring Boot 기반 λ°±μ—”λ“œ μ„œλ²„

Java 21 Spring Boot 4.0.0 PostgreSQL Redis Cluster Docker

πŸ“‹ λͺ©μ°¨


🎯 ν”„λ‘œμ νŠΈ κ°œμš”

image

TT(Ticket & Trade) λŠ” 곡연 ν‹°μΌ“ 예맀 및 2μ°¨ 거래(κ΅ν™˜/양도) ν”Œλž«νΌμ˜ λ°±μ—”λ“œ μ„œλ²„μž…λ‹ˆλ‹€.

μ£Όμš” 도메인

도메인 μ„€λͺ…
λŒ€κΈ°μ—΄ Redis 기반 νŠΈλž˜ν”½ λΆ„μ‚°, 순차 μ ‘κ·Ό μ œμ–΄
μ’Œμ„ 예맀 μ’Œμ„ 선점(HOLD β†’ SOLD), 만료 μžλ™ 볡ꡬ
좔첨 예맀 등급별 응λͺ¨, 곡정 좔첨, 당첨 μ•Œλ¦Ό
사전신청 예맀 μ˜€ν”ˆ/마감 μ •μ±… 기반 μ‹ μ²­ 처리
거래 ν‹°μΌ“ μ†Œμœ κΆŒ 검증, κ΅ν™˜Β·μ–‘λ„ 흐름
결제 도메인별 결제 흐름 뢄리, μƒνƒœ 관리
인증 JWT + Refresh Token Rotation, 카카였 OIDC

πŸ‘₯ νŒ€ ꡬ성

이름 μ—­ν•  GitHub
κΉ€μ±„ν˜„ Backend (PO) GitHub
κΉ€μ±„ν˜„ Backend GitHub
λ…Έλ―Έκ²½ Backend GitHub
λ°•λ―Όν˜• Backend (νŒ€μž₯) GitHub
μ΄μœ„λ¦Ό Backend GitHub

πŸ”— 링크

ꡬ뢄 링크
🌐 배포 https://doncrytt.vercel.app
πŸ’» Frontend WEB7_9_B2ST_FE
πŸ”§ Backend WEB7_9_B2ST_BE
πŸ“– API λ¬Έμ„œ Swagger UI

βš™οΈ 핡심 κΈ°λŠ₯

πŸ” 인증/인가 (Auth)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
JWT 인증 Access Token(30λΆ„) + Refresh Token(7일, Redis μ €μž₯)
Token Rotation μž¬λ°œκΈ‰ μ‹œ Family/Generation 기반 νƒˆμ·¨ 감지, 이전 토큰 μ‚¬μš© μ‹œ 전체 μ„Έμ…˜ λ¬΄νš¨ν™”
카카였 OIDC ID Token RSA μ„œλͺ… 검증(JWKS 24μ‹œκ°„ 캐싱), nonce 1νšŒμ„± 검증, μžλ™ 계정 연동
둜그인 λ³΄μ•ˆ 5회 μ‹€νŒ¨ μ‹œ 10λΆ„ 잠금(Redis TTL), Lua Script μ›μžμ  μΉ΄μš΄νŒ…
μœ„ν˜‘ 탐지 Credential Stuffing(IPλ‹Ή 10+ 계정), Brute Force(IPλ‹Ή 50+ μ‹€νŒ¨) 탐지 β†’ Slack μ•Œλ¦Ό

πŸ‘€ νšŒμ› (Member)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
νšŒμ›κ°€μž… BCrypt μ•”ν˜Έν™”, IP별 Rate Limiting(μ‹œκ°„λ‹Ή 3회, Lua Script)
이메일 인증 SecureRandom 6자리 μ½”λ“œ, Redis TTL 5λΆ„, μ‹œλ„ 횟수 μ œν•œ(5회)
νƒˆν‡΄/볡ꡬ Soft Delete + 30일 볡ꡬ 유예, 볡ꡬ 토큰(UUID, 24μ‹œκ°„ TTL)
감사 둜그 둜그인/κ°€μž… 이벀트 비동기 μ €μž₯(@Async + REQUIRES_NEW)

⏳ λŒ€κΈ°μ—΄ (Queue)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
λŒ€κΈ°μ—΄ μ§„μž… Redis Sorted Set 기반, νƒ€μž„μŠ€νƒ¬ν”„ μŠ€μ½”μ–΄λ‘œ μˆœμ„œ 보μž₯
순번 쑰회 ZRANK λͺ…λ ΉμœΌλ‘œ μ‹€μ‹œκ°„ λŒ€κΈ° 순번 λ°˜ν™˜
μž…μž₯ 처리 순차적 μž…μž₯ 토큰 λ°œκΈ‰, 유효 μ‹œκ°„ μ œν•œ
μƒνƒœ 관리 WAITING β†’ PROCESSING β†’ COMPLETED μƒνƒœ 전이
ν™˜κ²½ μ„€μ • λŒ€κΈ°μ—΄ on/off μ„€μ • κ°€λŠ₯, νŠΈλž˜ν”½ 상황에 따라 μœ μ—°ν•˜κ²Œ 적용

πŸͺ‘ μ’Œμ„ 예맀 (Reservation)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
μ’Œμ„ 선점 AVAILABLE β†’ HOLD μƒνƒœ 전이, 5λΆ„ TTL μ„€μ •
쀑볡 λ°©μ§€ 동일 μ’Œμ„ λ™μ‹œ 선점 μ‹œλ„ μ‹œ 낙관적 락으둜 좩돌 감지
예맀 ν™•μ • 결제 μ™„λ£Œ μ‹œ HOLD β†’ SOLD μƒνƒœ 전이
선점 만료 μŠ€μΌ€μ€„λŸ¬ 기반 TTL 만료 μ’Œμ„ μžλ™ 볡ꡬ (HOLD β†’ AVAILABLE)
예맀 μ·¨μ†Œ 예맀 μ·¨μ†Œ μ‹œ μ’Œμ„ μƒνƒœ 원볡, ν™˜λΆˆ 처리 연동

🎲 좔첨 예맀 (Lottery)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
응λͺ¨ 등둝 회차/등급별 응λͺ¨, 쀑볡 응λͺ¨ 검증
응λͺ¨ μ œν•œ 1인당 등급별 μ΅œλŒ€ 응λͺ¨ μˆ˜λŸ‰ μ œν•œ
좔첨 처리 SecureRandom 기반 곡정 좔첨 μ•Œκ³ λ¦¬μ¦˜
당첨 처리 λ‹Ήμ²¨μž μ’Œμ„ μžλ™ λ°°μ •, 결제 κΈ°ν•œ μ„€μ •
κ²°κ³Ό μ•Œλ¦Ό 당첨/낙첨 이메일 비동기 λ°œμ†‘
미결제 처리 결제 κΈ°ν•œ 초과 μ‹œ μžλ™ 당첨 μ·¨μ†Œ, μ’Œμ„ λ°˜ν™˜

πŸ“ 사전신청 예맀 (Pre-Reservation)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
μ‹ μ²­ κΈ°κ°„ μ˜€ν”ˆ/마감 μΌμ‹œ 기반 μ‹ μ²­ κ°€λŠ₯ κΈ°κ°„ 검증
μ‹ μ²­ 등둝 회차/등급별 사전신청, μˆ˜λŸ‰ μ§€μ •
μ‹ μ²­ ν™•μ • μ‹ μ²­ β†’ 결제 λŒ€κΈ° β†’ 결제 μ™„λ£Œ 흐름, μ˜ˆμ™Έ: CANCELLED, EXPIRED
만료 처리 결제 κΈ°ν•œ 초과 μ‹œ μ‹ μ²­ μžλ™ 만료, 결제 μ‹œλ„ 차단
μ‹ μ²­ μ·¨μ†Œ μ‚¬μš©μž μš”μ²­μ— μ˜ν•œ μ‹ μ²­ μ·¨μ†Œ 처리

πŸ’³ 결제 (Payment)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
도메인별 뢄리 μ’Œμ„μ˜ˆλ§€/좔첨/사전신청/κ±°λž˜λ³„ 결제 생성/검증 둜직 독립
μƒνƒœ 관리 PENDING β†’ PROCESSING β†’ COMPLETED/FAILED/CANCELLED (전이 κ·œμΉ™ λͺ…μ‹œ)

πŸ” 거래 (Trade)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
거래 등둝 ν‹°μΌ“ μ†Œμœ κΆŒ 검증, 쀑볡 등둝 λ°©μ§€
거래 μš”μ²­ ꡬ맀자 거래 μš”μ²­, 판맀자 승인 λŒ€κΈ°
μž„μ‹œ 점유 승인 μ‹œ redis에 ν‹°μΌ“ μž„μ‹œ 점유 등둝, 결제 κΈ°ν•œκΉŒμ§€ 재거래/μž¬μ˜ˆμ•½ μš”μ²­ μ¦‰μ‹œ 차단(μ΅œμ’… 확정은 DB둜 검증)
거래 승인 판맀자 승인 μ‹œ 결제 ν”„λ‘œμ„ΈμŠ€ μ§„μž…
μ†Œμœ κΆŒ 이전 결제 μ™„λ£Œ μ‹œ ν‹°μΌ“ μ†Œμœ κΆŒ ꡬ맀자둜 λ³€κ²½

πŸ§‘β€πŸ’Ό κ΄€λ¦¬μž (Admin)

κΈ°λŠ₯ κ΅¬ν˜„ 상세
νšŒμ› 관리 검색/필터링/νŽ˜μ΄μ§•, λŒ€μ‹œλ³΄λ“œ 톡계
인증 관리 둜그인/κ°€μž… 둜그 쑰회, 계정 잠금 ν•΄μ œ
κΆŒν•œ 뢄리 /api/admin/** URL 레벨 + @PreAuthorize λ©”μ„œλ“œ 레벨

πŸ› οΈ 기술 μŠ€νƒ

<Backend>

Java Spring Boot Spring Security Spring Data JPA QueryDSL Gradle Swagger

<DataBase>

PostgreSQL H2 Database Redis

<Observability & Performance>

Grafana Prometheus Doppler Micrometer

<Infra>

Terraform Docker AWS Amazon%20EC2 Amazon%20S3

<External Services>

JWT KAKAO OAuth SMTP Slack Webhook Swagger Postman Testcontainers JUnit


πŸ—οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

Image

πŸ—‚οΈ ERD

Image


πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

펼쳐보기
src/main/java/com/back/b2st/
β”œβ”€β”€ domain/
β”‚   β”œβ”€β”€ auth/               # JWT, OAuth, 둜그인 λ³΄μ•ˆ, 토큰 관리
β”‚   β”œβ”€β”€ member/             # νšŒμ› CRUD, νƒˆν‡΄/볡ꡬ, Rate Limiting
β”‚   β”œβ”€β”€ email/              # 이메일 인증, 비동기 λ°œμ†‘
β”‚   β”œβ”€β”€ performance/        # 곡연 관리
β”‚   β”œβ”€β”€ performanceschedule/# 곡연 회차
β”‚   β”œβ”€β”€ seat/               # μ’Œμ„ 관리
β”‚   β”œβ”€β”€ scheduleseat/       # νšŒμ°¨λ³„ μ’Œμ„ μƒνƒœ
β”‚   β”œβ”€β”€ queue/              # λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œ
β”‚   β”œβ”€β”€ reservation/        # μ’Œμ„ 예맀
β”‚   β”œβ”€β”€ prereservation/     # 사전 μ‹ μ²­
β”‚   β”œβ”€β”€ lottery/            # 좔첨 예맀
β”‚   β”œβ”€β”€ payment/            # 결제
β”‚   β”œβ”€β”€ ticket/             # ν‹°μΌ“ 관리
β”‚   β”œβ”€β”€ trade/              # 거래 (κ΅ν™˜/양도)
β”‚   β”œβ”€β”€ venue/              # 곡연μž₯
β”‚   └── bank/               # 은행 μ½”λ“œ Enum
β”‚
β”œβ”€β”€ global/
β”‚   β”œβ”€β”€ alert/              # SlackAlertService (Webhook 연동)
β”‚   β”œβ”€β”€ config/             # Redis, S3, Redisson, Alert μ„€μ •
β”‚   β”œβ”€β”€ error/              # GlobalExceptionHandler, ErrorCode
β”‚   β”œβ”€β”€ jwt/                # JwtTokenProvider, JwtAuthenticationFilter
β”‚   β”œβ”€β”€ jpa/                # BaseEntity, QueryDslConfig, AuditorAware
β”‚   β”œβ”€β”€ s3/                 # S3Service, PresignedUrl
β”‚   β”œβ”€β”€ util/               # MaskingUtil, CookieUtils, SecurityUtils
β”‚   └── metrics/            # MetricsConfig
β”‚
└── security/               # Spring Security μ„€μ •
    β”œβ”€β”€ SecurityConfig.java
    β”œβ”€β”€ CustomUserDetails.java
    β”œβ”€β”€ CustomUserDetailsService.java
    β”œβ”€β”€ JwtAuthenticationEntryPoint.java
    └── JwtAccessDeniedHandler.java

docker/
β”œβ”€β”€ docker-compose.yml              # 전체 μŠ€νƒ (App, DB, Redis Cluster, Monitoring)
β”œβ”€β”€ monitoring/
β”‚   β”œβ”€β”€ prometheus/
β”‚   β”‚   β”œβ”€β”€ prometheus.yml
β”‚   β”‚   └── rules/auth-alerts.yml
β”‚   β”œβ”€β”€ grafana/
β”‚   β”‚   β”œβ”€β”€ provisioning/
β”‚   β”‚   └── dashboards/
β”‚   └── alertmanager/
β”‚       └── alertmanager.yml
└── init-*.sh                       # Redis Cluster μ΄ˆκΈ°ν™” 슀크립트

πŸ“Š λͺ¨λ‹ˆν„°λ§ ꡬ성

Grafana λŒ€μ‹œλ³΄λ“œ
계측 λŒ€μ‹œλ³΄λ“œ μ£Όμš” λ©”νŠΈλ¦­
Service tt-service-overview μš”μ²­ 수, μ—λŸ¬μœ¨, 응닡 μ‹œκ°„ 뢄포
Domain tt-auth-dashboard auth_login_total, auth_account_locked_total, auth_token_reissue_total
tt-email-dashboard email_sent_total, email_verification_total
tt-queue-dashboard λŒ€κΈ°μ—΄ μƒνƒœ, μ²˜λ¦¬λŸ‰
tt-reservation-dashboard 예맀 생성, μ’Œμ„ 선점/μ·¨μ†Œ
tt-lottery-dashboard 응λͺ¨ 수, 당첨 처리
tt-payment-dashboard 결제 μš”μ²­/μ™„λ£Œ/μ‹€νŒ¨
tt-trade-dashboard 거래 등둝/μ™„λ£Œ
Infra tt-jvm-dashboard νž™ λ©”λͺ¨λ¦¬, GC, μŠ€λ ˆλ“œ ν’€
tt-database-dashboard 컀λ„₯μ…˜ ν’€, 쿼리 μ„±λŠ₯
tt-redis-dashboard λ©”λͺ¨λ¦¬, μ»€λ§¨λ“œ/sec, ν‚€ μƒνƒœ
Alertmanager κ·œμΉ™
// μ˜ˆμ‹œ
groups:
  - name: auth-alerts
    rules:
      - alert: HighLoginFailureRate
        expr: rate(auth_login_total{result="failure"}[5m]) > 0.1
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "둜그인 μ‹€νŒ¨μœ¨ 증가"

      - alert: AccountLockDetected
        expr: increase(auth_account_locked_total[5m]) > 0
        labels:
          severity: critical
        annotations:
          summary: "계정 잠금 λ°œμƒ"

🧩 ν˜‘μ—… κ·œμΉ™

펼쳐보기

μ½”λ“œ μ»¨λ²€μ…˜

  • Naver Java Convention 기반
  • IntelliJ IDEA μžλ™ μ„œμ‹ μ€€μˆ˜

Git 브랜치 μ „λž΅

  • main: ν”„λ‘œλ•μ…˜
  • develop: 개발 톡합
  • feature/*: κΈ°λŠ₯ 개발
  • λ¨Έμ§€ 쑰건: μ΅œμ†Œ 1λͺ… 리뷰 승인

🏷️ 넀이밍 & μž‘μ„± κ·œμΉ™

펼쳐보기

이슈(Issue)

  • 제λͺ© κ·œμΉ™: [νƒ€μž…] μž‘μ—…λ‚΄μš©
    • μ˜ˆμ‹œ: [feat] 둜그인 κΈ°λŠ₯ μΆ”κ°€
  • λ³Έλ¬Έ: νŒ€ ν…œν”Œλ¦Ώμ— 맞좰 μž‘μ„±

PR(Pull Request)

  • 제λͺ© κ·œμΉ™: [νƒ€μž…] μž‘μ—…λ‚΄μš©
    • μ˜ˆμ‹œ: [feat] 둜그인 κΈ°λŠ₯ μΆ”κ°€
  • λ³Έλ¬Έ: νŒ€ ν…œν”Œλ¦Ώμ— 맞좰 μž‘μ„±
  • 브랜치 보호 κ·œμΉ™: main, develop은 보호 브랜치둜 μ΅œμ†Œ 1λͺ… 리뷰 승인 ν›„μ—λ§Œ λ¨Έμ§€

브랜치(Branch)

  • 생성 κΈ°μ€€: develop λΈŒλžœμΉ˜μ—μ„œ 생성
  • λͺ…λͺ… κ·œμΉ™: νƒ€μž…/μž‘μ—…λ‚΄μš©
    • μ˜ˆμ‹œ: feat/쑰회-κΈ°λŠ₯-개발

Commit Message

  • ν˜•μ‹: νƒ€μž…: μž‘μ—…λ‚΄μš©
    • μ˜ˆμ‹œ: feat: 둜그인 κΈ°λŠ₯ μΆ”κ°€
νƒ€μž… 의미
feat μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€
fix 버그 μˆ˜μ •
docs λ¬Έμ„œ μˆ˜μ •(README, 주석 λ“±)
refactor μ½”λ“œ λ¦¬νŒ©ν† λ§(λ™μž‘ λ³€ν™” μ—†μŒ)
test ν…ŒμŠ€νŠΈ μ½”λ“œ μΆ”κ°€/μˆ˜μ •

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Java 95.4%
  • HTML 2.7%
  • Shell 1.2%
  • Other 0.7%