Skip to content

seunggulee1007/flow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

50 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Flow - μ‹€μ‹œκ°„ λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œ 🎫

Java Spring Boot WebFlux Redis

λŒ€κ·œλͺ¨ νŠΈλž˜ν”½μ„ μ•ˆμ •μ μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” λ¦¬μ•‘ν‹°λΈŒ λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œ

포트폴리였 보기 | μ•„ν‚€ν…μ²˜ | API λͺ…μ„Έ


πŸ“Œ ν”„λ‘œμ νŠΈ μ†Œκ°œ

FlowλŠ” ν‹°μΌ“νŒ…, μˆ˜κ°•μ‹ μ²­ λ“± μˆœκ°„μ μœΌλ‘œ λͺ°λ¦¬λŠ” λŒ€κ·œλͺ¨ νŠΈλž˜ν”½μ„ 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ μ‹€μ‹œκ°„ λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

핡심 문제 ν•΄κ²°

문제: ν‹°μΌ“νŒ… μ‹œκ°„μ— 수만 λͺ…이 λ™μ‹œμ— 접속 β†’ μ„œλ²„ λ‹€μš΄ πŸ’₯
ν•΄κ²°: λŒ€κΈ°μ—΄λ‘œ μœ μž…μ„ μ œμ–΄ β†’ μ•ˆμ •μ μΈ μ„œλΉ„μŠ€ 운영 βœ…

μ£Όμš” νŠΉμ§•

  • πŸš€ λ…ΌλΈ”λ‘œν‚Ή λ¦¬μ•‘ν‹°λΈŒ μ•„ν‚€ν…μ²˜ - Spring WebFlux 기반 κ³ μ„±λŠ₯ 처리
  • ⚑ Redis Sorted Set ν™œμš© - μˆœμœ„ 관리 및 λΉ λ₯Έ 쑰회 (O(log N))
  • πŸ‘‘ VIP μš°μ„ μˆœμœ„ 처리 - μš°μ„ μˆœμœ„λ³„ μ°¨λ“± μ§„μž… ν—ˆμš©
  • πŸ“Š μ‹€μ‹œκ°„ 톡계 및 λͺ¨λ‹ˆν„°λ§ - λŒ€κΈ° 인원, 처리율 μ‹€μ‹œκ°„ 좔적
  • πŸ“œ 이λ ₯ 관리 - λͺ¨λ“  λŒ€κΈ°μ—΄ 이벀트 좔적 및 감사
  • πŸ”” Redis Pub/Sub μ•Œλ¦Ό - μ‹€μ‹œκ°„ μƒνƒœ λ³€κ²½ μ•Œλ¦Ό
  • ⏰ μžλ™ μŠ€μΌ€μ€„λ§ - 주기적으둜 μ‚¬μš©μž μ§„μž… ν—ˆμš©
  • 🎨 λŒ€κΈ°μ‹€ μ›Ή UI - μ‚¬μš©μž μΉœν™”μ μΈ λŒ€κΈ° ν™”λ©΄

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

Backend

  • Java 21 - μ΅œμ‹  LTS, Virtual Thread 지원
  • Spring Boot 3.4.4 - μ΅œμ‹  μ•ˆμ •ν™” 버전
  • Spring WebFlux - λ¦¬μ•‘ν‹°λΈŒ λ…ΌλΈ”λ‘œν‚Ή μ›Ή ν”„λ ˆμž„μ›Œν¬
  • Project Reactor - λ¦¬μ•‘ν‹°λΈŒ 슀트림 κ΅¬ν˜„

Infrastructure

  • Redis 7.0 - In-Memory 데이터 μ €μž₯μ†Œ
    • Sorted Set: μˆœμœ„ 관리
    • Pub/Sub: μ‹€μ‹œκ°„ μ•Œλ¦Ό
    • List: 이λ ₯ 관리
  • Embedded Redis - ν…ŒμŠ€νŠΈ ν™˜κ²½

Testing & Quality

  • JUnit 5 - λ‹¨μœ„ ν…ŒμŠ€νŠΈ ν”„λ ˆμž„μ›Œν¬
  • Reactor Test - λ¦¬μ•‘ν‹°λΈŒ 슀트림 ν…ŒμŠ€νŠΈ
  • StepVerifier - 비동기 검증
  • TDD - ν…ŒμŠ€νŠΈ 주도 개발 방법둠

πŸš€ λΉ λ₯Έ μ‹œμž‘

1. 사전 μš”κ΅¬μ‚¬ν•­

Java 21
Redis 7.0+

2. Redis μ‹€ν–‰

# macOS (Homebrew)
brew install redis
redis-server

# Docker
docker run -d -p 6379:6379 redis:7-alpine

3. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰

# ν”„λ‘œμ νŠΈ 클둠
git clone https://github.com/your-username/flow.git
cd flow

# λΉŒλ“œ 및 μ‹€ν–‰
./gradlew bootRun

4. 접속 확인

# λŒ€κΈ°μ‹€ 접속
open http://localhost:9010/waiting-room?queue=default&user_id=1

# API ν…ŒμŠ€νŠΈ
curl "http://localhost:9010/api/v1/queue?user_id=1&queue=default"

πŸ“– μ£Όμš” κΈ°λŠ₯

1️⃣ λŒ€κΈ°μ—΄ 등둝

# 일반 μ‚¬μš©μž 등둝
POST /api/v1/queue?user_id=100&queue=default

# VIP μ‚¬μš©μž 등둝 (μš°μ„ μˆœμœ„)
POST /api/v1/queue?user_id=101&queue=default&is_vip=true

2️⃣ μˆœμœ„ 쑰회

GET /api/v1/queue/rank?user_id=100&queue=default

3️⃣ μ§„μž… ν—ˆμš© (κ΄€λ¦¬μž)

POST /api/v1/queue/allow?queue=default&count=10

4️⃣ 톡계 쑰회

GET /api/v1/queue/statistics?queue=default

5️⃣ 이λ ₯ 쑰회

# νŠΉμ • μ‚¬μš©μž 이λ ₯
GET /api/v1/queue/history?user_id=100&queue=default

# 전체 λŒ€κΈ°μ—΄ 이λ ₯
GET /api/v1/queue/history/all?queue=default&count=50

πŸ“Š μ„±λŠ₯ ν…ŒμŠ€νŠΈ κ²°κ³Ό

λΆ€ν•˜ ν…ŒμŠ€νŠΈ (λ™μ‹œ μ‚¬μš©μž 30λͺ…, 10초)

  • μ²˜λ¦¬λŸ‰: 30 TPS
  • 평균 응닡 μ‹œκ°„: 52ms
  • 성곡λ₯ : 100%

상세 κ²°κ³Ό

μžμ„Έν•œ μ„±λŠ₯ ν…ŒμŠ€νŠΈ κ²°κ³ΌλŠ” PERFORMANCE.mdλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.


🎯 ν”„λ‘œμ νŠΈ ν•˜μ΄λΌμ΄νŠΈ

1. λ¦¬μ•‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ° κ΅¬ν˜„

  • λ…ΌλΈ”λ‘œν‚Ή I/O둜 수천 개의 λ™μ‹œ μ—°κ²° 처리
  • 적은 μŠ€λ ˆλ“œλ‘œ 높은 μ²˜λ¦¬λŸ‰ 달성
  • λ°±ν”„λ ˆμ…”λ₯Ό ν†΅ν•œ μ•ˆμ •μ μΈ 슀트림 처리

2. 효율적인 자료ꡬ쑰 선택

  • Redis Sorted Set: O(log N) μˆœμœ„ 쑰회
  • νƒ€μž„μŠ€νƒ¬ν”„ 기반 μŠ€μ½”μ–΄: κ³΅μ •ν•œ λŒ€κΈ° μˆœμ„œ 보μž₯
  • VIP μ˜€ν”„μ…‹: μš°μ„ μˆœμœ„ 처리 κ΅¬ν˜„

3. ν™•μž₯ κ°€λŠ₯ν•œ μ•„ν‚€ν…μ²˜

  • 큐 μ΄λ¦„μœΌλ‘œ λ©€ν‹°ν…Œλ„Œμ‹œ 지원
  • μˆ˜ν‰ ν™•μž₯ κ°€λŠ₯ν•œ λ¬΄μƒνƒœ 섀계
  • 이벀트 기반 λŠμŠ¨ν•œ κ²°ν•©

4. 운영 κ³ λ € 사항

  • λŒ€κΈ°μ—΄ μš©λŸ‰ μ œν•œ - λ¬΄ν•œ λŒ€κΈ° λ°©μ§€
  • TTL μ„€μ • - μžλ™ 만료둜 λ©”λͺ¨λ¦¬ 관리
  • 이λ ₯ 관리 - 감사 및 문제 좔적
  • 톡계 API - 운영 λͺ¨λ‹ˆν„°λ§

πŸ“š λ¬Έμ„œ


πŸ§ͺ ν…ŒμŠ€νŠΈ

전체 ν…ŒμŠ€νŠΈ μ‹€ν–‰

./gradlew test

λΆ€ν•˜ ν…ŒμŠ€νŠΈ

# κΈ°λ³Έ λΆ€ν•˜ ν…ŒμŠ€νŠΈ
./scripts/load-test.sh

# 슀트레슀 ν…ŒμŠ€νŠΈ
./scripts/stress-test.sh

# VIP μš°μ„ μˆœμœ„ ν…ŒμŠ€νŠΈ
./scripts/vip-test.sh

πŸ› οΈ μ„€μ •

application.yml μ£Όμš” μ„€μ •

scheduler:
  enable: true  # μžλ™ μ§„μž… ν—ˆμš© ν™œμ„±ν™”
  max-allow-user-count: 3  # ν•œ λ²ˆμ— μ§„μž… ν—ˆμš©ν•  μ΅œλŒ€ μ‚¬μš©μž 수

queue:
  max-capacity: 100  # λŒ€κΈ°μ—΄ μ΅œλŒ€ μš©λŸ‰ (0=λ¬΄μ œν•œ)
  ttl-seconds: 600   # λŒ€κΈ°μ—΄ μžλ™ 만료 μ‹œκ°„ (초)
  token:
    max-age-seconds: 300  # 토큰 유효 μ‹œκ°„

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

flow/
β”œβ”€β”€ src/
β”‚   β”œβ”€β”€ main/
β”‚   β”‚   β”œβ”€β”€ java/com/nhn/flow/
β”‚   β”‚   β”‚   β”œβ”€β”€ controller/       # REST API 컨트둀러
β”‚   β”‚   β”‚   β”œβ”€β”€ service/          # λΉ„μ¦ˆλ‹ˆμŠ€ 둜직
β”‚   β”‚   β”‚   β”œβ”€β”€ dto/              # μš”μ²­/응닡 객체
β”‚   β”‚   β”‚   └── exception/        # μ˜ˆμ™Έ 처리
β”‚   β”‚   └── resources/
β”‚   β”‚       β”œβ”€β”€ application.yml   # μ„€μ • 파일
β”‚   β”‚       └── templates/        # Thymeleaf ν…œν”Œλ¦Ώ
β”‚   └── test/                     # ν…ŒμŠ€νŠΈ μ½”λ“œ
β”œβ”€β”€ scripts/                      # λΆ€ν•˜ ν…ŒμŠ€νŠΈ 슀크립트
└── docs/                         # ν”„λ‘œμ νŠΈ λ¬Έμ„œ

πŸŽ“ ν•™μŠ΅ 포인트

이 ν”„λ‘œμ νŠΈλ₯Ό 톡해 λ‹€μŒμ„ ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€:

  • βœ… Spring WebFluxλ₯Ό ν™œμš©ν•œ λ¦¬μ•‘ν‹°λΈŒ ν”„λ‘œκ·Έλž˜λ°
  • βœ… Redis의 λ‹€μ–‘ν•œ 자료ꡬ쑰 ν™œμš© (Sorted Set, List, Pub/Sub)
  • βœ… λŒ€κ·œλͺ¨ λ™μ‹œμ„± 처리 및 μ„±λŠ₯ μ΅œμ ν™”
  • βœ… TDD 기반 개발 및 ν…ŒμŠ€νŠΈ μžλ™ν™”
  • βœ… 싀무 μ€‘μ‹¬μ˜ μ—λŸ¬ 핸듀링 및 검증
  • βœ… RESTful API 섀계 및 λ¬Έμ„œν™”

πŸ“ž 문의

ν”„λ‘œμ νŠΈμ— λŒ€ν•œ μ§ˆλ¬Έμ΄λ‚˜ μ œμ•ˆμ‚¬ν•­μ΄ μžˆμœΌμ‹œλ©΄ 이슈λ₯Ό λ“±λ‘ν•΄μ£Όμ„Έμš”.


πŸ“„ λΌμ΄μ„ μŠ€

This project is licensed under the MIT License.


λ§Œλ“  μ‚¬λžŒ | 포트폴리였

⭐ 이 ν”„λ‘œμ νŠΈκ°€ 도움이 λ˜μ—ˆλ‹€λ©΄ Starλ₯Ό λˆŒλŸ¬μ£Όμ„Έμš”!

About

πŸŽŸοΈν‹°μΌ“νŒ… λŒ€κΈ°μ—΄ μ‹œμŠ€ν…œπŸŽ«

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages