"๊ณ ๊ฐ๊ณผ ์ ์ฃผ ๋ชจ๋๋ฅผ ์ํ ์ฌ์ธ์ ์์ฝ ์๋ฃจ์ " > ์ผ๋ฐ ์์ฝ๋ถํฐ ์ธ๊ธฐ ๋ง์ง ์ค์๊ฐ ๋๊ธฐ์ด(Queue), ํ์ฅ ์จ์ดํ ๊น์ง ํ ๋ฒ์ ๊ด๋ฆฌํ๋ MSA ๊ธฐ๋ฐ ์๋น์ค์ ๋๋ค.
TableKok์ ์์์ ์์ฝ, ์จ์ดํ , ๋ฆฌ๋ทฐ ๊ด๋ฆฌ๋ฅผ ํ๋์ ํ๋ซํผ์์ ์ ๊ณตํ์ฌ ํํธํ๋ ์์ฝ ๊ฒฝํ์ ํตํฉํฉ๋๋ค. ๋จ์ํ ์์ฝ ๊ธฐ๋ฅ์ ๋์ด, ๋๊ท๋ชจ ํธ๋ํฝ์ด ๋ฐ์ํ๋ ์ธ๊ธฐ ๋ง์ง์ ๋๊ธฐ์ด ์ฒ๋ฆฌ์ ์ค์๊ฐ ํ์ฅ ์จ์ดํ ๋ฌธ์ ๋ฅผ ๊ธฐ์ ์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ์์ต๋๋ค.
| ์ด๋ฆ | ์ญํ | ๋ด๋น ๋๋ฉ์ธ ๋ฐ ๊ธฐ์ฌ | GitHub |
|---|---|---|---|
| ํ์ฑ์ | ํ์ฅ | ๐ Auth, ๐ช Gateway(Auth), ๐ Infra | Link |
| ์ด๊ฐํ | ๋ถํ์ฅ | ๐ช Store, โณ Waiting | Link |
| ์ก์ค์ผ | ํ์ | ๐ Search, โญ Review, ๐ช Gateway(Routing) | Link |
| ํฉ๊ต์ | ํ์ | ๐ Reservation(Normal/Queue) | Link |
- 2025.11.24 ~ 2025.12.26(5์ฃผ)
- ์ฌ์ฉ์ ๊ฒฝํ ํตํฉ: ์์ฝ, ์จ์ดํ , ๋ฆฌ๋ทฐ๋ฅผ ํ๋์ ์ฑ์์ ์ฒ๋ฆฌ
- ๋์ฉ๋ ํธ๋ํฝ ์ฒ๋ฆฌ: ์ธ๊ธฐ ๋ง์ง ์์ฝ ์ ๋ฐ์ํ๋ ๋์์ฑ ์ด์ ๋ฐ ์๋ฒ ๋ถํ ํด๊ฒฐ
- ์ค์๊ฐ์ฑ ๋ณด์ฅ: SSE์ Kafka๋ฅผ ํ์ฉํ ์ค์๊ฐ ์๋ฆผ ๋ฐ ๋ฐ์ดํฐ ๋๊ธฐํ
- ๊ฒ์ ์ฑ๋ฅ ์ต์ ํ: Elasticsearch + Nori ๋ถ์๊ธฐ๋ฅผ ์ด์ฉํ ๋น ๋ฅด๊ณ ์ ํํ ํ๊ธ ๊ฒ์
| ๊ตฌ๋ถ | ๊ธฐ์ (Technology) |
|---|---|
| Language & Framework | Java 17, Spring Boot 3.2, Spring Cloud (Gateway, Eureka, OpenFeign) |
| Database | PostgreSQL, Redis (Caching, Pub/Sub, ZSet), Elasticsearch |
| Message Queue | Apache Kafka (Event-Driven Architecture) |
| DevOps & Infra | Docker, Zipkin (Distributed Tracing), GitHub Actions (CI/CD) |
| Tools | QueryDSL, SSE (Server-Sent Events), JWT |
- ํตํฉ ํ์๊ฐ์ : ์ฌ์ ์ ๋ฒํธ ์ ๋ฌด์ ๋ฐ๋ฅธ Role ์๋ ๋ถ์ฌ (CUSTOMER / OWNER)
- ๋ณด์: JWT Access/Refresh Token ๊ธฐ๋ฐ ์ธ์ฆ ๋ฐ Redis Blacklist๋ฅผ ํตํ ๋ก๊ทธ์์ ์ฒ๋ฆฌ
- Gateway:
GlobalFilter๋ฅผ ํตํ JWT ํ์ฑ ๋ฐX-User-Idํค๋ ์ฃผ์
- CQRS ํจํด ์ ์ฉ: Command(PostgreSQL)์ Query(Elasticsearch) ์ฑ ์ ๋ถ๋ฆฌ
- ๋ฐ์ดํฐ ๋๊ธฐํ: Kafka๋ฅผ ํตํด Store ๋ณ๊ฒฝ ์ฌํญ์ Search ์๋น์ค๋ก ์ค์๊ฐ ์ ํ (Eventual Consistency)
- ๊ณ ์ฑ๋ฅ ๊ฒ์: Elasticsearch Nori ๋ถ์๊ธฐ ํ์ฉ ๋ฐ
search_after๊ธฐ๋ฐ Cursor ํ์ด์ง ๊ตฌํ
- ์ผ๋ฐ ์์ฝ: ํธ๋์ญ์ ๋ณด์ฅ์ ํตํ ์ค๋ณต ์์ฝ ๋ฐฉ์ง ๋ฐ ์ ์ฑ ๊ฒ์ฆ
- ์ธ๊ธฐ ๋ง์ง ์์ฝ (๋๊ธฐ์ด): Redis
ZSet์ ํ์ฉํ ๋๊ธฐ์ด ์์คํ (์๋ฒ ๋ณด์ฅ, ์ง์ ์ ์ด) - ํ์ฅ ์จ์ดํ : ์ค์๊ฐ ์ค์๊ธฐ ๋ฐ ์์ ๋๊ธฐ์๊ฐ ๊ณ์ฐ, SSE๋ฅผ ํตํ ์ ์ฅ ์๋ฆผ
- ์ ๋ขฐ์ฑ ํ๋ณด: ๋ฐฉ๋ฌธ ์๋ฃ(DONE) ๋ ์์ฝ์ ํํด์๋ง ๋ฆฌ๋ทฐ ์์ฑ ๊ฐ๋ฅ
- ํต๊ณ ์ต์ ํ: Kafka๋ฅผ ํ์ฉํด ๋ฆฌ๋ทฐ ์์ฑ ์ ํ๊ท ํ์ /๋ฆฌ๋ทฐ ์๋ฅผ ๋น๋๊ธฐ๋ก ์ง๊ณํ์ฌ Store ์๋น์ค์ ๋ฐ์
1. Monorepo vs Polyrepo: ๋ชจ๋ ธ๋ ํฌ ์ ํ
- ๋ฐฐ๊ฒฝ: 4์ธ์ ์๊ท๋ชจ ํ์ผ๋ก ๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ํ์ ํจ์จ์ฑ์ด ํ์ํจ.
- ์ ํ: Monorepo
- ์ด์ : ๊ณตํต ์ค์ (Git Convention, Build Logic) ์ ์ง ๋น์ฉ ๊ฐ์ ๋ฐ ํ์ ๊ฐ ์ ์ฒด ์ํคํ ์ฒ ์ดํด๋ ์ฆ์ง์ ์ํจ.
2. CQRS ํจํด๊ณผ Kafka ๋์
- ๋ฌธ์ : ์์์ ๋๋ฉ์ธ์ ๋ณต์กํ ์กฐ์ธ ์ฐ์ฐ๊ณผ ์กฐํ ํธ๋ํฝ(Read)์ด ์ฐ๊ธฐ(Write) ํธ๋ํฝ๋ณด๋ค ์๋์ ์ผ๋ก ๋์(8:2 ๋น์จ).
- ํด๊ฒฐ:
- CQRS: Store Service(Write/RDBMS)์ Search Service(Read/Elasticsearch) ๋ถ๋ฆฌ.
- Kafka: ์๋น์ค ๊ฐ ๋์จํ ๊ฒฐํฉ์ ์ ์งํ๋ฉฐ ๋ฐ์ดํฐ ์ต์ข ์ผ๊ด์ฑ ๋ณด์ฅ. ์ฅ์ ๋ฐ์ ์ ๋ฉ์์ง ์ ์ค ๋ฐฉ์ง.
3. Redis ZSet์ ํ์ฉํ ๋๊ธฐ์ด ๊ด๋ฆฌ
-
๋ฌธ์ : RDBMS
COUNT(*)๋ก ๋๊ธฐ ์๋ฒ์ ๊ณ์ฐํ ๊ฒฝ์ฐ ๋๋ ํธ๋ํฝ ์ DB ๋ถํ ์ฌ๊ฐ. - ํด๊ฒฐ: Redis Sorted Set (ZSet) ๋์ .
-
์ฑ๊ณผ: ๋๊ธฐ ์๋ฒ ํ์ธ ์๊ฐ ๋ณต์ก๋๋ฅผ
$O(\log N)$ ์ผ๋ก ๋จ์ถํ์ฌ ์ค์๊ฐ ์๋ต ์๋ ๊ฐ์ .
1. ์ธ๊ธฐ ๋ง์ง ์์ฝ ํธ๋ํฝ ์ ์ด (Distributed Queue)
- ์ํฉ: ์ธ๊ธฐ ๋งค์ฅ ์์ฝ ์คํ ์ ํธ๋ํฝ ํญ์ฃผ๋ก ์ธํ Connection Refused ๋ฐ ์๋ต ์ง์ฐ ๋ฐ์ (ํ๊ท 446ms, ์ค๋ฅ์จ 0.91%).
- ํด๊ฒฐ: Redis
ZSet๊ธฐ๋ฐ์ ๋๊ธฐ์ด ์์คํ ๋์ . - ์ง์ ์ ์ด: ์ค์ผ์ค๋ฌ๊ฐ 'Score=์์ฝ์ ํ์๊ฐ'์ ๊ธฐ์ค์ผ๋ก N๋ช ์ฉ๋ง ์์ฝ ๊ฐ๋ฅ ์ํ๋ก ์ ํ.
- ์ต์ ํ: ๋๊ธฐ์ด ์ง์ ์์๋ง ์์๋ฅผ ๊ณ์ฐํ๊ณ , ์ดํ ์๋ฆผ์ '์ ์ฅ ์ธ์ ์'๋ง ์ ๋ฌํ์ฌ ํด๋ผ์ด์ธํธ๊ฐ ์์๋ฅผ ๊ณ์ฐํ๋๋ก ํ์ฌ ์๋ฒ ์ฐ์ฐ ์ต์ํ.
- ๊ฒฐ๊ณผ: ์์ ์ ์ธ ํธ๋ํฝ ์ฒ๋ฆฌ ๋ฐ ์๋ฒ ๋ฆฌ์์ค ํจ์จํ ๋ฌ์ฑ.
2. ์จ์ดํ ๋ฒํธ ๋ฐ๊ธ ๋์์ฑ ์ด์ ํด๊ฒฐ
* **๋ฌธ์ :** JMeter ํ ์คํธ ์ ๋์ ์์ฒญ์ ๋ํด ์ค๋ณต๋ ์จ์ดํ ๋ฒํธ๊ฐ ๋ฐ๊ธ๋๋ ํ์ ๋ฐ์. * **์๋ 1 (DB Lock):** `PESSIMISTIC_WRITE` ๋ฝ ์ ์ฉ โ ์ ํฉ์ฑ์ ํด๊ฒฐ๋์์ผ๋ ๋๊ธฐ ์๊ฐ ๋์ ์ผ๋ก ์ฑ๋ฅ ์ ํ (72ms). * **์๋ 2 (Redis Atomic):** **Redis `INCR` ๋ช ๋ น์ด ์ฌ์ฉ**. * **๊ฒฐ๊ณผ:** ๋ฝ ์์ด ์์์ฑ(Atomicity)์ ๋ณด์ฅํ๋ฉฐ ์ฒ๋ฆฌ ์๋ **72ms โ 0.002ms**๋ก ํ๊ธฐ์ ๊ฐ์ .3. ๋ฆฌ๋ทฐ ์กฐํ ์ฑ๋ฅ ์ต์ ํ (Index & Cursor Paging)
* **๋ฌธ์ :** 100๋ง ๊ฑด ๋ฐ์ดํฐ ์กฐํ ์ Full Table Scan ๋ฐ์ (61.96ms), Deep Pagination ์ ์ฑ๋ฅ ์ ํ. * **ํด๊ฒฐ:** 1. ๋ณตํฉ ์ธ๋ฑ์ค ์ ์ฉ (`idx_store_created_at`). 2. `Offset` ๋ฐฉ์ ๋์ `Cursor` ๊ธฐ๋ฐ ํ์ด์ง(No-Offset) ๋์ . * **๊ฒฐ๊ณผ:** ์ฟผ๋ฆฌ ์คํ ์๊ฐ **32.45ms โ 0.025ms (์ฝ 1,298๋ฐฐ ๊ฐ์ )** ๋ฐ ์ผ์ ํ ์กฐํ ์๋| ์๋น์ค๋ช | ํฌํธ๋ฒํธ |
|---|---|
| Eureka Server | 19090 |
| API Gateway | 19091 |
| User-service | 8081 |
| Store-service | 8082 |
| Search-service | 8083 |
| Reservation-service | 8084 |
| Hot-Reservation-service | 8085 |
| Waiting-service | 8086 |
| Review-service | 8087 |
- Repository Clone
git clone [https://github.com/username/TableKok.git](https://github.com/username/TableKok.git)