Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

ChuHoYeon/ticketing

Repository files navigation

🎫 Ticketing

λŒ€κ·œλͺ¨ νŠΈλž˜ν”½ μƒν™©μ—μ„œ μ‹œμŠ€ν…œ λ‹€μš΄μ„ λ°©μ§€ν•˜κ³ , κ³΅μ •ν•œ 순차 처리λ₯Ό 보μž₯ν•˜κΈ° μœ„ν•œ Redis 기반 λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œ ν•™μŠ΅ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€.

πŸš€ Project Overview

μ‚¬μš©μžκ°€ μ„œλΉ„μŠ€μ— 직접 μ§„μž…ν•˜λŠ” λŒ€μ‹ , Redis λŒ€κΈ°μ—΄μ„ 거쳐 순차적으둜 μž…μž₯ν•˜λ„λ‘ μ œμ–΄ν•©λ‹ˆλ‹€. ν‹°μΌ“νŒ…, μˆ˜κ°• μ‹ μ²­, μ„ μ°©μˆœ 이벀트 λ“± μˆœκ°„μ μΈ νŠΈλž˜ν”½ 폭주가 μ˜ˆμƒλ˜λŠ” μ‹œλ‚˜λ¦¬μ˜€λ₯Ό ν•΄κ²°ν•˜λŠ” 데 μ΄ˆμ μ„ λ§žμ·„μŠ΅λ‹ˆλ‹€.

πŸ›  Tech Stack

  • Language: Java 25
  • Framework: Spring Boot 4.0.6
  • Reactive: Spring WebFlux, Spring Data Redis Reactive (queue-server)
  • Web: Spring Web MVC, Thymeleaf (website)
  • Database: Redis
  • Test: JUnit 5, Reactor Test, Embedded Redis

πŸ“‚ Project Structure

Gradle λ©€ν‹° λͺ¨λ“ˆ ꡬ쑰λ₯Ό μ‚¬μš©ν•˜μ—¬ 관심사λ₯Ό λΆ„λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

  • common: 곡톡 DTO, μ˜ˆμ™Έ 클래슀 및 곡톡 μœ ν‹Έλ¦¬ν‹°
  • queue-server: [WebFlux] λŒ€κΈ°μ—΄ 등둝, 순번 쑰회, μ§„μž… ν—ˆμš© 처리 및 μŠ€μΌ€μ€„λŸ¬ 핡심 둜직
  • website: [MVC] μ‹€μ œ μ„œλΉ„μŠ€κ°€ μ œκ³΅λ˜λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ (λŒ€κΈ°μ—΄ ν†΅κ³Όμž μ „μš©)

πŸ”„ System Flow

  1. μ§„μž… μ‹œλ„: μ‚¬μš©μžκ°€ website 접속 μ‹œ μΏ ν‚€μ˜ λŒ€κΈ°μ—΄ 토큰 확인
  2. λŒ€κΈ°μ‹€ λ¦¬λ‹€μ΄λ ‰νŠΈ: μœ νš¨ν•œ 토큰이 없을 경우 queue-server의 λŒ€κΈ° νŽ˜μ΄μ§€λ‘œ 이동
  3. 순번 폴링: λŒ€κΈ°μ‹€μ—μ„œ 본인의 μˆœλ²ˆμ„ 주기적으둜 쑰회 (Redis Sorted Set 기반)
  4. μžλ™ μ§„μž… 처리: queue-server λ‚΄λΆ€ μŠ€μΌ€μ€„λŸ¬κ°€ μ„€μ •λœ μΈμ›λ§ŒνΌ 순차적으둜 μ§„μž… ν—ˆμš© μƒνƒœλ‘œ λ³€κ²½
  5. 토큰 λ°œκΈ‰ 및 볡귀: μ§„μž…μ΄ ν—ˆμš©λ˜λ©΄ 토큰을 λ°œκΈ‰λ°›μ•„ 쿠킀에 μ €μž₯ν•œ λ’€ μ›λž˜ website둜 λ°”λ‘œ 볡귀

πŸ’Ύ Redis Data Structure

Redis의 Sorted Set을 ν™œμš©ν•˜μ—¬ μ„ μ°©μˆœ(FIFO) ꡬ쑰λ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

  • Wait Queue: users:queue:{name}:wait
    • score: 등둝 μ‹œκ°(Timestamp) / member: μ‚¬μš©μž μ‹λ³„μž
  • Proceed Queue: users:queue:{name}:proceed
    • μ§„μž…μ΄ ν—ˆμš©λœ μ‚¬μš©μž 정보 (토큰 검증 μ‹œ ν™œμš©)

✨ Key Features

  • 비동기 처리: WebFlux와 Reactive Redisλ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ€μš©λŸ‰ μš”μ²­μ„ 효율적으둜 처리
  • μžλ™ μŠ€μΌ€μ€„λ§: 운영자의 κ°œμž… 없이 섀정에 따라 μžλ™μœΌλ‘œ λŒ€κΈ° 인원 μ§„μž… 처리
  • 쀑볡 λ°©μ§€: 동일 μ‚¬μš©μžμ˜ 쀑볡 λŒ€κΈ°μ—΄ 등둝 차단
  • 격리된 ꡬ쑰: λŒ€κΈ°μ—΄ 둜직과 μ‹€μ œ μ„œλΉ„μŠ€ λ‘œμ§μ„ λͺ¨λ“ˆλ‘œ λΆ„λ¦¬ν•˜μ—¬ μœ μ—°μ„± 확보

πŸ“Š System Flow Diagram

Sequence Diagram

sequenceDiagram
 autonumber
 participant User as μ‚¬μš©μž λΈŒλΌμš°μ €
 participant Website as Website μ„œλ²„
 participant Queue as Queue Server
 participant Redis as Redis
 User->>Website: GET /?user_id={userId}
 Website->>Website: μΏ ν‚€μ—μ„œ user-queue-{queue}-token 쑰회
 Website->>Queue: GET /api/v1/queue/allowed<br/>queue={queue}&user_id={userId}&token={token}
 Queue->>Queue: 토큰 μœ νš¨μ„± 검증
 Queue-->>Website: { allowed: true | false }
 alt μ§„μž… ν—ˆμš©λ¨
 Website-->>User: index.html λ°˜ν™˜
 else μ§„μž… λΆˆκ°€
 Website-->>User: 302 Redirect<br/>/waiting-room?user_id={userId}&redirect_url={websiteUrl}
 User->>Queue: GET /waiting-room
 Queue->>Queue: μΏ ν‚€ 토큰 μž¬κ²€μ¦
 alt μœ νš¨ν•œ 토큰 있음
 Queue-->>User: 302 Redirect to Website
 else μœ νš¨ν•œ 토큰 μ—†μŒ
 Queue->>Redis: ZADD users:queue:{queue}:wait<br/>member=userId, score=timestamp
 Redis-->>Queue: 등둝 κ²°κ³Ό
 Queue->>Redis: ZRANK users:queue:{queue}:wait userId
 Redis-->>Queue: ν˜„μž¬ 순번
 Queue-->>User: waiting-room.html λ°˜ν™˜
 end
 loop 1μ΄ˆλ§ˆλ‹€ 순번 쑰회
 User->>Queue: GET /api/v1/queue/rank<br/>queue={queue}&user_id={userId}
 Queue->>Redis: ZRANK users:queue:{queue}:wait userId
 Redis-->>Queue: rank
 Queue-->>User: { rank: number }
 end
 par μŠ€μΌ€μ€„λŸ¬ μžλ™ 처리
 Queue->>Redis: ZPOPMIN users:queue:{queue}:wait
 Redis-->>Queue: λŒ€κΈ°μ—΄ μ•ž μ‚¬μš©μž λͺ©λ‘
 Queue->>Redis: ZADD users:queue:{queue}:proceed
 end
 User->>Queue: GET /api/v1/queue/rank
 Queue->>Redis: ZRANK users:queue:{queue}:wait userId
 Redis-->>Queue: -1
 Queue-->>User: { rank: -1 }
 User->>Queue: GET /api/v1/queue/touch<br/>queue={queue}&user_id={userId}
 Queue->>Queue: SHA-256 토큰 생성
 Queue-->>User: Set-Cookie: user-queue-{queue}-token={token}
 User->>Website: GET /?user_id={userId}
 Website->>Queue: GET /api/v1/queue/allowed
 Queue-->>Website: { allowed: true }
 Website-->>User: index.html λ°˜ν™˜
 end
Loading

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /