Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
313 changes: 313 additions & 0 deletions CONTEXT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
# ๐Ÿ“š Weekly Study Context

> ์ด ํŒŒ์ผ์€ ์ง‘/ํšŒ์‚ฌ ์–ด๋””์„œ๋“  ๊ฐ™์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
> ์„ธ์…˜ ์‹œ์ž‘ ์‹œ "์ปจํ…์ŠคํŠธ ๋ถˆ๋Ÿฌ์™€์ค˜" ๋ผ๊ณ  ๋งํ•˜๋ฉด Claude๊ฐ€ ์ด ํŒŒ์ผ์„ ์ฝ๊ณ  ๋ฐ”๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

---

## ๐ŸŽ“ ํ•™์Šต ์ง„ํ–‰ ๋ฐฉ์‹

### ์ˆœ์„œ
```
1๋‹จ๊ณ„: ๊ฐœ๋… ์žก๊ธฐ โ†’ ๋ชจ๋ฅด๋ฉด Claudeํ•œํ…Œ ๋ฌผ์–ด๋ณด๊ธฐ, Mermaid๋กœ ์ •๋ฆฌ
2๋‹จ๊ณ„: ๊ฐœ๋… ํ€ด์ฆˆ โ†’ ์ค‘๊ฐ„์ค‘๊ฐ„ Claude๊ฐ€ ์งˆ๋ฌธ โ†’ ๋‚ด๊ฐ€ ๋‹ต๋ณ€ โ†’ ํ™•์ธ
3๋‹จ๊ณ„: ์‹œ๋ฎฌ๋ ˆ์ด์…˜ โ†’ Phase 1/2 ์‹คํ–‰ (๋ฌธ์ œ ์ง์ ‘ ๊ฒช๊ธฐ)
4๋‹จ๊ณ„: ์„ค๊ณ„ โ†’ ๊ณ ๋ฏผ ๋ชฉ๋ก โ†’ ๊ฒฐ์ • ์‚ฌํ•ญ์œผ๋กœ ์ด๋™
5๋‹จ๊ณ„: ์ฝ”๋“œ ๊ตฌํ˜„ โ†’ TDD (Red โ†’ Green โ†’ Refactor)
6๋‹จ๊ณ„: Phase 3 ๊ฒ€์ฆ โ†’ Before/After ์ˆ˜์น˜ ๋น„๊ต
7๋‹จ๊ณ„: PR + ๋ธ”๋กœ๊ทธ + WIL
```

### ๊ฐœ๋… ํ•™์Šต ๊ทœ์น™
- ๊ฐœ๋… ์ •๋ฆฌ ์š”์ฒญ ์‹œ โ†’ Claude๊ฐ€ Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ `docs/concepts/` ์— ์ €์žฅ
- ๊ฐ ๊ฐœ๋… ๋๋‚˜๋ฉด โ†’ Claude๊ฐ€ ํ€ด์ฆˆ 1~2๊ฐœ ์ถœ์ œ, ๋‚ด๊ฐ€ ๋‹ต๋ณ€ ํ›„ ํ™•์ธ
- ํ€ด์ฆˆ ํ†ต๊ณผ ๊ธฐ์ค€ โ†’ ์•„๋ž˜ ๊ฐœ๋… ์ฒดํฌ๋ฆฌ์ŠคํŠธ์— โœ… ํ‘œ์‹œ

### ๐Ÿ“– ๊ฐœ๋… ์ฒดํฌ๋ฆฌ์ŠคํŠธ

#### Redis ์ž๋ฃŒ๊ตฌ์กฐ
- [ ] **Sorted Set ๊ธฐ๋ณธ** โ€” ZADD, ZRANK, ZREM, ZCARD, ZSCORE ๋™์ž‘ ์›๋ฆฌ
- [ ] **ZADD NX ์˜ต์…˜** โ€” ์ค‘๋ณต ๋ฐฉ์ง€ ์›๋ฆฌ (์™œ NX๊ฐ€ ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜๋Š”๊ฐ€)
- [ ] **score ์„ค๊ณ„** โ€” ์ง„์ž… ์ˆœ์„œ ๋ณด์žฅ์„ ์œ„ํ•œ score ์ „๋žต (timestamp vs sequence)
- [ ] **TOCTOU ๋ฌธ์ œ** โ€” ์กฐํšŒ ํ›„ ์กฐ๊ฑด ๋ถ„๊ธฐ ์‹œ ๋ฐœ์ƒํ•˜๋Š” race condition

#### ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ ์„ค๊ณ„
- [ ] **๋Œ€๊ธฐ์—ด vs Rate Limiting** โ€” ์–ธ์ œ ์–ด๋–ค ์ „๋žต์„ ์“ฐ๋Š”๊ฐ€
- [ ] **Thundering Herd** โ€” ๋Œ€๊ธฐ์—ด ์—ด๋ฆด ๋•Œ ๋™์‹œ ์ง„์ž… ํญ๋ฐœ ๋ฌธ์ œ์™€ ๋Œ€์‘
- [ ] **๋ฐฐ์น˜ ํฌ๊ธฐ N ์‚ฐ์ •** โ€” `N = ์ปค๋„ฅ์…˜ ์ˆ˜ ร— (์ฃผ๊ธฐ / ํ‰๊ท  ์ฒ˜๋ฆฌ ์‹œ๊ฐ„)` ๊ณต์‹ ๊ทผ๊ฑฐ

#### ํ† ํฐ & TTL
- [ ] **์ž…์žฅ ํ† ํฐ ์„ค๊ณ„** โ€” Redis String + TTL์ด ์™œ ์ ํ•ฉํ•œ๊ฐ€
- [ ] **TTL ๊ธฐ์ค€ ์‚ฐ์ •** โ€” ๋ช‡ ๋ถ„์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š”๊ฐ€, ๊ทธ ๊ทผ๊ฑฐ
- [ ] **ํ† ํฐ ๊ฒ€์ฆ ์œ„์น˜** โ€” Filter vs Interceptor vs AOP ๋น„๊ต

#### ์‹ค์‹œ๊ฐ„ ์ˆœ๋ฒˆ ์กฐํšŒ
- [ ] **Polling ๊ตฌ์กฐ** โ€” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฃผ๊ธฐ์ ์œผ๋กœ ์กฐํšŒํ•˜๋Š”๊ฐ€
- [ ] **Polling vs SSE** โ€” ๊ฐ๊ฐ ์–ธ์ œ ์“ฐ๋Š”๊ฐ€, ์™œ Polling์„ ์„ ํƒํ–ˆ๋Š”๊ฐ€
- [ ] **์˜ˆ์ƒ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ณ„์‚ฐ** โ€” ๊ณต์‹๊ณผ ํ•œ๊ณ„

#### ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ
- [ ] **HikariCP ์ปค๋„ฅ์…˜ ํ’€** โ€” ๊ณ ๊ฐˆ์ด ์™œ ์ƒ๊ธฐ๊ณ  ๋Œ€๊ธฐ์—ด์ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”๊ฐ€
- [ ] **Redis ์žฅ์•  ์‹œ๋‚˜๋ฆฌ์˜ค** โ€” Redis ์ฃฝ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€

---

## ๐Ÿ—“๏ธ ์ด๋ฒˆ ์ฃผ (2026-03-30 ~ 2026-04-03)

### ๋งˆ๊ฐ
- **์ฝ”๋“œ PR**: 2026-04-03 (๊ธˆ) 18:00
- **๋ธ”๋กœ๊ทธ (Technical Writing)**: 2026-04-03 (๊ธˆ) 18:00
- **WIL (Weekly I Learned)**: 2026-04-03 (๊ธˆ) 18:00

### ์ฃผ์ œ
**Redis ๊ธฐ๋ฐ˜ ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ** (Black Friday ์ฃผ๋ฌธ API ์•ž๋‹จ)

---

## ๐Ÿงช Phase 0 โ€” ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (๋ฌธ์ œ ์žฌํ˜„ ๋จผ์ €)
<!-- ์™œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š”์ง€, ์•ˆ ํ•˜๋ฉด ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์ง์ ‘ ๊ฒช๊ณ  ๋‚˜์„œ ๊ตฌํ˜„ -->

### ์‹œ๋ฎฌ๋ ˆ์ด์…˜ 1 โ€” ๋Œ€๊ธฐ์—ด ์—†์ด ์ฃผ๋ฌธ API์— ๋™์‹œ ์š”์ฒญ ํญํƒ„
> ๋ชฉ์ : Rate Limiting๋„ ์—†๊ณ  ๋Œ€๊ธฐ์—ด๋„ ์—†์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ„ฐ์ง€๋Š”์ง€ ํ™•์ธ

**์žฌํ˜„ ๋ฐฉ๋ฒ•**
```bash
# k6๋กœ 200 VU๊ฐ€ ๋™์‹œ์— ์ฃผ๋ฌธ API ์ง์ ‘ ํ˜ธ์ถœ
k6 run --vus 200 --duration 10s simulate/no-queue.js
```

**ํ™•์ธ ํฌ์ธํŠธ**
- [ ] DB ์ปค๋„ฅ์…˜ ํ’€(HikariCP) ๊ณ ๊ฐˆ โ†’ `Connection is not available` ์—๋Ÿฌ
- [ ] ์‘๋‹ต ์‹œ๊ฐ„ ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ (์ •์ƒ 20ms โ†’ ์ˆ˜ ์ดˆ)
- [ ] ์žฌ๊ณ  ์Œ์ˆ˜ or ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐœ์ƒ ์—ฌ๋ถ€

**์˜ˆ์ƒ ๊ฒฐ๋ก **: โ†’ ๋Œ€๊ธฐ์—ด์ด ์™œ ํ•„์š”ํ•œ์ง€ ์ฒด๊ฐ

---

### ์‹œ๋ฎฌ๋ ˆ์ด์…˜ 2 โ€” Sorted Set ์—†์ด List๋กœ ๋Œ€๊ธฐ์—ด ๊ตฌํ˜„
> ๋ชฉ์ : ์ˆœ์„œ ๋ณด์žฅ๊ณผ ์ค‘๋ณต ๋ฐฉ์ง€๊ฐ€ ์™œ Sorted Set์ด์–ด์•ผ ํ•˜๋Š”์ง€ ํ™•์ธ

**์žฌํ˜„ ๋ฐฉ๋ฒ•**
- `LPUSH queue:waiting userId` ๋กœ ๋‹จ์ˆœ List ๊ตฌํ˜„
- ๋™์‹œ์— ๊ฐ™์€ userId๋กœ ์—ฌ๋Ÿฌ ๋ฒˆ ์ง„์ž… ์‹œ๋„

**ํ™•์ธ ํฌ์ธํŠธ**
- [ ] ๋™์ผ userId๊ฐ€ List์— ์ค‘๋ณต ๋“ฑ๋ก๋˜๋Š”์ง€
- [ ] ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžˆ๋Š” ์ผ€์ด์Šค ๋ฐœ์ƒํ•˜๋Š”์ง€ (LPUSH vs RPUSH)
- [ ] ์ˆœ๋ฒˆ ์กฐํšŒ ์‹œ O(N) ์Šค์บ” ์„ฑ๋Šฅ ๋ฌธ์ œ

**์˜ˆ์ƒ ๊ฒฐ๋ก **: โ†’ Sorted Set์˜ `score ๊ธฐ๋ฐ˜ ์ˆœ์„œ ๋ณด์žฅ + ์ค‘๋ณต ๋ฐฉ์ง€(ZADD NX)`๊ฐ€ ์™œ ๋งž๋Š”์ง€

---

### ์‹œ๋ฎฌ๋ ˆ์ด์…˜ 3 โ€” ํ† ํฐ ์—†์ด ์ฃผ๋ฌธ API ๋ฐ”๋กœ ์—ด์–ด๋‘๊ธฐ
> ๋ชฉ์ : ๋Œ€๊ธฐ์—ด ํ†ต๊ณผ ๊ฒ€์ฆ ์—†์œผ๋ฉด ์–ด๋–ค ์ผ์ด ์ƒ๊ธฐ๋Š”์ง€ ํ™•์ธ

**์žฌํ˜„ ๋ฐฉ๋ฒ•**
- ํ† ํฐ ๊ฒ€์ฆ ์ธํ„ฐ์…‰ํ„ฐ ๋น„ํ™œ์„ฑํ™” ์ƒํƒœ์—์„œ
- ๋Œ€๊ธฐ์—ด ์ง„์ž… ์•ˆ ํ•œ ์œ ์ €๊ฐ€ ์ฃผ๋ฌธ API ์ง์ ‘ ํ˜ธ์ถœ

**ํ™•์ธ ํฌ์ธํŠธ**
- [ ] ๋Œ€๊ธฐ์—ด ์šฐํšŒ ๊ฐ€๋Šฅํ•œ์ง€
- [ ] ๋Œ€๊ธฐ ์ค‘์ธ ์œ ์ €๋“ค์ด ์†ํ•ด ๋ณด๋Š”์ง€

**์˜ˆ์ƒ ๊ฒฐ๋ก **: โ†’ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ž…์žฅ ์ œ์–ด๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€

---

### ์‹œ๋ฎฌ๋ ˆ์ด์…˜ 4 โ€” TTL ์—†๋Š” ํ† ํฐ
> ๋ชฉ์ : ํ† ํฐ์— ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์—†์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ ํ™•์ธ

**์žฌํ˜„ ๋ฐฉ๋ฒ•**
- Redis์— TTL ์—†์ด ํ† ํฐ ์ €์žฅ
- ์˜ค๋ž˜๋œ ํ† ํฐ์œผ๋กœ ์ฃผ๋ฌธ API ์žฌ์‹œ๋„

**ํ™•์ธ ํฌ์ธํŠธ**
- [ ] ์ˆ˜ ์‹œ๊ฐ„ ํ›„์—๋„ ํ† ํฐ์œผ๋กœ ์ฃผ๋ฌธ ๊ฐ€๋Šฅํ•œ์ง€
- [ ] ๋Œ€๊ธฐ์—ด ๊ณต์ •์„ฑ ํ›ผ์† ์—ฌ๋ถ€ (๋Œ€๊ธฐ ์•ˆ ํ•˜๊ณ  ๋‚˜์ค‘์— ์‚ฌ์šฉ)

**์˜ˆ์ƒ ๊ฒฐ๋ก **: โ†’ TTL ์„ค๊ณ„ ๊ธฐ์ค€์˜ ์˜๋ฏธ

---

### ์‹œ๋ฎฌ๋ ˆ์ด์…˜ 5 โ€” ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐ์น˜ ํฌ๊ธฐ๋ฅผ ๋„ˆ๋ฌด ํฌ๊ฒŒ ์žก์•˜์„ ๋•Œ
> ๋ชฉ์ : ๋ฐฐ์น˜ ํฌ๊ธฐ N์ด DB ์ปค๋„ฅ์…˜ ํ’€๋ณด๋‹ค ํฌ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ํ™•์ธ

**์žฌํ˜„ ๋ฐฉ๋ฒ•**
- HikariCP `maximum-pool-size=10` ์„ค์ •
- ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐ์น˜ ํฌ๊ธฐ N=50์œผ๋กœ ์„ค์ • ํ›„ ์‹คํ–‰

**ํ™•์ธ ํฌ์ธํŠธ**
- [ ] ์ปค๋„ฅ์…˜ ๋Œ€๊ธฐ ํƒ€์ž„์•„์›ƒ ๋ฐœ์ƒ ์—ฌ๋ถ€
- [ ] ๋‹ค๋ฅธ API ์‘๋‹ต ์ง€์—ฐ ์—ฌ๋ถ€

**์˜ˆ์ƒ ๊ฒฐ๋ก **: โ†’ ๋ฐฐ์น˜ ํฌ๊ธฐ ์‚ฐ์ • ๊ทผ๊ฑฐ (`N โ‰ค ์ปค๋„ฅ์…˜ ํ’€ ํฌ๊ธฐ ร— ์ฃผ๊ธฐ / ์ฒ˜๋ฆฌ์‹œ๊ฐ„`)

---

## โœ… Checklist

### ๐Ÿšช Step 1 โ€” ๋Œ€๊ธฐ์—ด
- [ ] `POST /queue/enter` โ€” Redis Sorted Set ๊ธฐ๋ฐ˜ ๋Œ€๊ธฐ์—ด ์ง„์ž… API
- [ ] `GET /queue/position` โ€” ์ˆœ๋ฒˆ ์กฐํšŒ API
- [ ] userId ๊ธฐ๋ฐ˜ ์ค‘๋ณต ์ง„์ž… ๋ฐฉ์ง€
- [ ] ์ „์ฒด ๋Œ€๊ธฐ ์ธ์› ์กฐํšŒ

### ๐ŸŽซ Step 2 โ€” ์ž…์žฅ ํ† ํฐ & ์Šค์ผ€์ค„๋Ÿฌ
- [ ] ์Šค์ผ€์ค„๋Ÿฌ: ์ฃผ๊ธฐ์ ์œผ๋กœ ๋Œ€๊ธฐ์—ด์—์„œ N๋ช… ๊บผ๋‚ด ์ž…์žฅ ํ† ํฐ ๋ฐœ๊ธ‰
- [ ] ํ† ํฐ TTL ์„ค์ • (e.g. 5๋ถ„)
- [ ] ์ฃผ๋ฌธ API ์ง„์ž… ์‹œ ํ† ํฐ ๊ฒ€์ฆ
- [ ] ์ฃผ๋ฌธ ์™„๋ฃŒ ํ›„ ํ† ํฐ ์‚ญ์ œ
- [ ] ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ธฐ์ค€ ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐ์น˜ ํฌ๊ธฐ ์‚ฐ์ • ๊ทผ๊ฑฐ ๋ฌธ์„œํ™”

### ๐Ÿ“ก Step 3 โ€” ์‹ค์‹œ๊ฐ„ ์ˆœ๋ฒˆ ์กฐํšŒ
- [ ] ์˜ˆ์ƒ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ณ„์‚ฐ ๋กœ์ง
- [ ] Polling ๊ธฐ๋ฐ˜ ์ˆœ๋ฒˆ + ์˜ˆ์ƒ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ์‘๋‹ต
- [ ] ํ† ํฐ ๋ฐœ๊ธ‰ ์‹œ ์ˆœ๋ฒˆ ์กฐํšŒ ์‘๋‹ต์— ํ† ํฐ ํฌํ•จ

### ๐Ÿงช ๊ฒ€์ฆ
- [ ] ๋™์‹œ ์ง„์ž… ํ…Œ์ŠคํŠธ โ€” ๋Œ€๊ธฐ์—ด ์ˆœ์„œ ๋ณด์žฅ ํ™•์ธ
- [ ] ํ† ํฐ ๋งŒ๋ฃŒ ํ…Œ์ŠคํŠธ โ€” TTL ์ดˆ๊ณผ ์‹œ ๋ฌดํšจํ™” ํ™•์ธ
- [ ] ์ฒ˜๋ฆฌ๋Ÿ‰ ์ดˆ๊ณผ ํ…Œ์ŠคํŠธ โ€” ๋ฐฐ์น˜ ํฌ๊ธฐ ์ดˆ๊ณผ ์š”์ฒญ์—๋„ ์•ˆ์ •์ ์ธ์ง€ ํ™•์ธ

---

## ๐Ÿค” ์„ค๊ณ„ ๊ณ ๋ฏผ ๋ชฉ๋ก (๋ฏธ๊ฒฐ)
<!-- ๊ตฌํ˜„ ์ „/์ค‘์— ํŒ๋‹จํ•ด์•ผ ํ•  ๊ฒƒ๋“ค. ๊ฒฐ๋ก  ๋‚˜๋ฉด ์•„๋ž˜ "์„ค๊ณ„ ๊ฒฐ์ • ์‚ฌํ•ญ"์œผ๋กœ ์ด๋™ -->

### Step 1 โ€” ๋Œ€๊ธฐ์—ด
- [ ] **Redis Sorted Set score ๊ธฐ์ค€**: `System.currentTimeMillis()` vs `AtomicLong` ์‹œํ€€์Šค?
- ๋ฐ€๋ฆฌ์ดˆ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ โ†’ ๋™์‹œ ์ง„์ž… ์‹œ ์ˆœ์„œ ๋ณด์žฅ ์–ด๋–ป๊ฒŒ?
- [ ] **์ค‘๋ณต ์ง„์ž… ๋ฐฉ์ง€ ๊ตฌํ˜„ ๋ฐฉ์‹**: `ZSCORE` ์กฐํšŒ ํ›„ ์กฐ๊ฑด ๋ถ„๊ธฐ vs Lua ์Šคํฌ๋ฆฝํŠธ๋กœ ์›์ž์  ์ฒ˜๋ฆฌ?
- ๋ถ„๋ฆฌํ•˜๋ฉด TOCTOU(Time-of-Check-Time-of-Use) ๋ฌธ์ œ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
- [ ] **๋Œ€๊ธฐ์—ด ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ**: ๋Œ€๊ธฐ ์ค‘ ์—ฐ๊ฒฐ ๋Š๊ธด ์œ ์ €๋Š” ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ?
- ๋ฌด๊ธฐํ•œ ๋Œ€๊ธฐ vs TTL ์„ค์ • ํ›„ ์ž๋™ ์ œ๊ฑฐ

### Step 2 โ€” ์ž…์žฅ ํ† ํฐ & ์Šค์ผ€์ค„๋Ÿฌ
- [ ] **ํ† ํฐ ์ €์žฅ์†Œ**: Redis String (TTL ํ™œ์šฉ) vs DB?
- Redis ์„ ํƒ ์‹œ โ†’ ์žฅ์•  ์‹œ ํ† ํฐ ์ผ๊ด„ ์†Œ๋ฉธ ๋ฌธ์ œ
- [ ] **์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐ์น˜ ํฌ๊ธฐ N ์‚ฐ์ • ๊ทผ๊ฑฐ**:
- DB ์ปค๋„ฅ์…˜ ํ’€ ๊ธฐ๋ณธ๊ฐ’(HikariCP default=10), ํ‰๊ท  ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•ด์•ผ ํ•จ
- `N = ์ปค๋„ฅ์…˜ ์ˆ˜ ร— (์Šค์ผ€์ค„ ์ฃผ๊ธฐ / ํ‰๊ท  ์ฒ˜๋ฆฌ ์‹œ๊ฐ„)` ๊ณต์‹ ๊ฒ€ํ† 
- [ ] **ํ† ํฐ ๊ฒ€์ฆ ์œ„์น˜**: Filter vs Interceptor vs AOP?
- [ ] **์Šค์ผ€์ค„๋Ÿฌ ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€**: ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ, ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ์‹œ ๋ถ„์‚ฐ ๋ฝ ํ•„์š”?

### Step 3 โ€” ์‹ค์‹œ๊ฐ„ ์ˆœ๋ฒˆ ์กฐํšŒ
- [ ] **์˜ˆ์ƒ ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ณ„์‚ฐ ๊ณต์‹**:
- `์˜ˆ์ƒ ๋Œ€๊ธฐ ์‹œ๊ฐ„ = ๋‚ด ์ˆœ๋ฒˆ ร— (์Šค์ผ€์ค„ ์ฃผ๊ธฐ / ๋ฐฐ์น˜ ํฌ๊ธฐ N)`?
- ๋” ์ •๊ตํ•œ ๊ณ„์‚ฐ ๋ฐฉ์‹ ์žˆ๋Š”์ง€ ๊ฒ€ํ† 
- [ ] **Polling ์ฃผ๊ธฐ**: ๋ช‡ ์ดˆ๋งˆ๋‹ค ํ˜ธ์ถœ? ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€?
- ๋Œ€๊ธฐ ์ธ์› ๋งŽ์„ ๋•Œ ์ฃผ๊ธฐ ๋Š˜๋ฆฌ๋Š” Adaptive Polling ๊ณ ๋ ค ์—ฌ๋ถ€
- [ ] **Polling ๋ถ€ํ•˜ ์™„ํ™”**: Redis๋งŒ ์กฐํšŒํ•˜๋ฉด ์ถฉ๋ถ„? DB ์กฐํšŒ ์—†์ด ๊ฐ€๋Šฅ?

---

## ๐Ÿ’ญ ์„ค๊ณ„ ๊ฒฐ์ • ์‚ฌํ•ญ (ํ™•์ •)
<!-- ๊ณ ๋ฏผ ๋์— ๋‚ด๋ฆฐ ํŒ๋‹จ๋“ค. ๋ธ”๋กœ๊ทธ/PR ์†Œ์žฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค -->

| ํ•ญ๋ชฉ | ๊ฒฐ์ • | ์ด์œ  |
|------|------|------|
| Polling vs SSE | - | ๋ฏธ๊ฒฐ |
| ํ† ํฐ TTL | - | ๋ฏธ๊ฒฐ |
| ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐ์น˜ ํฌ๊ธฐ N | - | ๋ฏธ๊ฒฐ |
| Redis ์žฅ์•  ์‹œ fallback | - | ๋ฏธ๊ฒฐ |

---

## ๐Ÿ“ ์ง„ํ–‰ ๋กœ๊ทธ
<!-- ๋งค์ผ ์ž‘์—… ํ›„ ๊ฐ„๋žตํžˆ ๊ธฐ๋ก -->

### 2026-03-30 (์›”)
- ํ”„๋กœ์ ํŠธ ์„ธํŒ… ๋ฐ ์ปจํ…์ŠคํŠธ ํŒŒ์ผ ์ƒ์„ฑ
- ์ž‘์—… ์‹œ์ž‘ ์˜ˆ์ •

---

## ๐Ÿ”– ๋‹ค์Œ ์„ธ์…˜์— ์ด์–ด์„œ ํ•  ์ผ
<!-- ์„ธ์…˜ ์ข…๋ฃŒ ์ „ ๋ฐ˜๋“œ์‹œ ์—…๋ฐ์ดํŠธ -->
- Step 1 ์„ค๊ณ„๋ถ€ํ„ฐ ์‹œ์ž‘: Redis Sorted Set ๊ตฌ์กฐ ๊ฒฐ์ •, ํŒจํ‚ค์ง€ ๊ตฌ์กฐ ์„ค๊ณ„

---

## โœ๏ธ ๋ธ”๋กœ๊ทธ & WIL ์†Œ์žฌ ๋ฉ”๋ชจ
<!-- ๊ตฌํ˜„ํ•˜๋‹ค ๋– ์˜ค๋ฅด๋Š” ์ธ์‚ฌ์ดํŠธ, ๊ณ ๋ฏผ, ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋ฉ”๋ชจ -->

### ๋ธ”๋กœ๊ทธ ํ›„๋ณด ์ฃผ์ œ (Technical Writing)
- Rate Limiting์œผ๋กœ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ vs ๋Œ€๊ธฐ์—ด๋กœ ์ค„ ์„ธ์šฐ๋Š” ๊ฒƒ: ์–ด๋–ค ์ƒํ™ฉ์—์„œ?
- ์Šค์ผ€์ค„๋Ÿฌ ๋ฐฐ์น˜ ํฌ๊ธฐ ์‚ฐ์ • ๊ทผ๊ฑฐ (DB ์ปค๋„ฅ์…˜ ํ’€, ํ‰๊ท  ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ๊ธฐ์ค€)
- Thundering Herd ๋Œ€์‘
- Redis ์žฅ์•  ์‹œ ์„œ๋น„์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?
- Polling vs SSE โ€” ์™œ ๊ทธ ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋Š”๊ฐ€?
- ํ† ํฐ TTL์„ ๋ช‡ ๋ถ„์œผ๋กœ ์„ค์ •ํ–ˆ๊ณ , ๊ทธ ๊ธฐ์ค€์€?

### WIL (Weekly I Learned) ์ž‘์„ฑ ๊ฐ€์ด๋“œ
> WIL์€ ๋ธ”๋กœ๊ทธ๋ณด๋‹ค ๊ฐ€๋ณ๊ฒŒ, "์ด๋ฒˆ ์ฃผ ๋‚ด๊ฐ€ ๋ฐฐ์šด ๊ฒƒ"์„ ์†”์งํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋Š” ๊ธ€

**์ž‘์„ฑ ํ•ญ๋ชฉ**
- ์ด๋ฒˆ ์ฃผ ๋ฐฐ์šด ๊ธฐ์ˆ /๊ฐœ๋… (Redis Sorted Set, ํ† ํฐ TTL ์„ค๊ณ„, Polling ๋ถ€ํ•˜ ๋“ฑ)
- ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •
- ์ž˜ ๋๋˜ ๊ฒƒ vs ์•„์‰ฌ์› ๋˜ ๊ฒƒ
- ๋‹ค์Œ ์ฃผ์— ๊ฐ€์ ธ๊ฐˆ ์ธ์‚ฌ์ดํŠธ

---

## ๐Ÿ“‹ PR ์ž‘์„ฑ ์–‘์‹ (์ฐธ๊ณ  ํ…œํ”Œ๋ฆฟ)
<!-- PR ์ž‘์„ฑ ์‹œ ์ด ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฅผ ๊ฒƒ -->

```
๐Ÿ“Œ Summary
ํ•œ ๋‹จ๋ฝ์œผ๋กœ ์ด๋ฒˆ PR์˜ ํ•ต์‹ฌ์„ ์š”์•ฝ (๋ฌด์—‡์„, ์™œ, ํ•ต์‹ฌ ๊ฒฐ๊ณผ)
๋ถˆ๋ฆฟ์œผ๋กœ ํ•ต์‹ฌ ํฌ์ธํŠธ 3~5๊ฐœ

๐Ÿงญ Context & Decision
๋ฌธ์ œ ์ •์˜ (์ฝ”๋“œ ๋ธ”๋ก์œผ๋กœ Before ๊ตฌ์กฐ ํ‘œํ˜„)
๋ฆฌ์Šคํฌ ํ…Œ์ด๋ธ”
ํ•ต์‹ฌ ๊ฒฐ์ • ์š”์•ฝ ํ…Œ์ด๋ธ” (#, ๊ฒฐ์ • ํ•ญ๋ชฉ, ์ตœ์ข… ์„ ํƒ, ํ•ต์‹ฌ ๊ทผ๊ฑฐ)

๊ฐ ๊ฒฐ์ •๋ณ„:
- ์˜๋„ (์™œ ์ด ๊ฒฐ์ •์„ ๋‚ด๋ ธ๋Š”๊ฐ€)
- ์ฝ”๋“œ ์Šค๋‹ˆํŽซ (Before/After ๋น„๊ต)
- ์„ค๊ณ„๋„ (Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ) โ† ์ค‘๊ฐ„์ค‘๊ฐ„ ํ๋ฆ„๋„ ํ•„์ˆ˜!
- ๋Œ€์•ˆ ๋น„๊ต ํ…Œ์ด๋ธ” (์ „๋žต / ์žฅ๋‹จ์  / ์„ ํƒ ์ด์œ )
- ๊ด€๋ จ ํด๋ž˜์Šค ํ…Œ์ด๋ธ” (์ปดํฌ๋„ŒํŠธ / ํŒŒ์ผ๊ฒฝ๋กœ / ๋ฉ”์„œ๋“œ / ์—ญํ• )

๐Ÿ—๏ธ Design Overview
๋ณ€๊ฒฝ ๋ฒ”์œ„ (๊ธฐ์กด ๋ณ€๊ฒฝ / ์‹ ๊ทœ ์ถ”๊ฐ€)
์ฃผ์š” ์ปดํฌ๋„ŒํŠธ & ํ•ต์‹ฌ ๋ฉ”์„œ๋“œ ํ…Œ์ด๋ธ”

๐Ÿ” Flow Diagram
Mermaid๋กœ ์ „์ฒด ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ† ์„ค๊ณ„๋„ ํ•„์ˆ˜!

โœ… Checklist
Step๋ณ„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๐Ÿ” ๋ฆฌ๋ทฐ ํฌ์ธํŠธ
๋ฉ˜ํ† /๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ๋ฌป๊ณ  ์‹ถ์€ ํŒ๋‹จ 2~3๊ฐœ
- ํ•ด๊ฒฐํ•˜๋ ค๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ œ
- ์‹œ๋„ํ•œ ์ ‘๊ทผ
- ์ฝ”๋“œ ์œ„์น˜
- ์ด๋ ‡๊ฒŒ ์„ ํƒํ•œ ์ด์œ 
- ์ธ์ง€ํ•˜๊ณ  ์žˆ๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
- ์—ฌ์ญ™๊ณ  ์‹ถ์€ ์ 
```

### PR ์ž‘์„ฑ ์‹œ ํ•ต์‹ฌ ์›์น™
- "๋ฌด์—‡์„ ํ–ˆ๋‹ค" ๊ฐ€ ์•„๋‹ˆ๋ผ **"์™œ ๊ทธ๋ ‡๊ฒŒ ํŒ๋‹จํ–ˆ๋Š”๊ฐ€"** ์ค‘์‹ฌ
- ๊ฐ ๊ฒฐ์ •๋งˆ๋‹ค **๋Œ€์•ˆ ๋น„๊ต ํ…Œ์ด๋ธ”** ํฌํ•จ (์™œ ์ด๊ฑธ ์„ ํƒํ–ˆ๊ณ  ๋‚˜๋จธ์ง€๋Š” ์™œ ๋ฒ„๋ ธ๋Š”์ง€)
- **Mermaid ์„ค๊ณ„๋„** ์ค‘๊ฐ„์ค‘๊ฐ„ ์‚ฝ์ž… (ํ๋ฆ„๋„, ์ƒํƒœ ๋จธ์‹ , ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ)
- ๋ฆฌ๋ทฐ ํฌ์ธํŠธ์—์„œ **์†”์งํ•˜๊ฒŒ ํŒ๋‹จ์ด ์„œ์ง€ ์•Š๋Š” ๋ถ€๋ถ„** ์งˆ๋ฌธ

---

## ๐Ÿ—๏ธ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ (์ฐธ๊ณ )
```
apps/commerce-api/src/main/java/com/loopers/
โ”œโ”€โ”€ application/ # Facade (usecase ์กฐํ•ฉ)
โ”œโ”€โ”€ domain/ # Entity, Service, Repository interface
โ”œโ”€โ”€ infrastructure/ # Repository ๊ตฌํ˜„์ฒด (JPA, Redis)
โ”œโ”€โ”€ interfaces/api/ # Controller, DTO, ApiSpec
โ””โ”€โ”€ support/ # CoreException, ErrorType
```

**Tech Stack**: Java 21, Spring Boot 3.4.4, Redis, MySQL 8.0, Kafka
Loading