Skip to content

KokKok-dev/.github

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

4 Commits
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿฝ๏ธ TableKok : MSA ๊ธฐ๋ฐ˜ ์Œ์‹์  ํ†ตํ•ฉ ์˜ˆ์•ฝ ํ”Œ๋žซํผ

image

"๊ณ ๊ฐ๊ณผ ์ ์ฃผ ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ์˜ฌ์ธ์› ์˜ˆ์•ฝ ์†”๋ฃจ์…˜" > ์ผ๋ฐ˜ ์˜ˆ์•ฝ๋ถ€ํ„ฐ ์ธ๊ธฐ ๋ง›์ง‘ ์‹ค์‹œ๊ฐ„ ๋Œ€๊ธฐ์—ด(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 ๋ถ„์„๊ธฐ๋ฅผ ์ด์šฉํ•œ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ํ•œ๊ธ€ ๊ฒ€์ƒ‰

๐Ÿงฌ ์ธํ”„๋ผ ์„ค๊ณ„๋„

[์ธํ”„๋ผ ์•„ํ‚คํ…์ฒ˜]

image

[CI/CD]

image

[์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜]

image

[ERD]

image

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ (Tech Stack)

Java Spring Boot Spring Data JPA Spring Cloud

Kafka Redis Elasticsearch SSE

AWS EC2 AWS RDS AWS ECS AWS ECR Docker GitHub Actions

JMeter JitPack

Slack Discord Notion

๊ตฌ๋ถ„ ๊ธฐ์ˆ  (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

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ (Key Features)

1๏ธโƒฃ ์ธ์ฆ ๋ฐ ํšŒ์› ๊ด€๋ฆฌ (Auth Service)

  • ํ†ตํ•ฉ ํšŒ์›๊ฐ€์ž…: ์‚ฌ์—…์ž ๋ฒˆํ˜ธ ์œ ๋ฌด์— ๋”ฐ๋ฅธ Role ์ž๋™ ๋ถ€์—ฌ (CUSTOMER / OWNER)
  • ๋ณด์•ˆ: JWT Access/Refresh Token ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐ Redis Blacklist๋ฅผ ํ†ตํ•œ ๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ
  • Gateway: GlobalFilter๋ฅผ ํ†ตํ•œ JWT ํŒŒ์‹ฑ ๋ฐ X-User-Id ํ—ค๋” ์ฃผ์ž…

2๏ธโƒฃ ์Œ์‹์  ๊ด€๋ฆฌ ๋ฐ ๊ฒ€์ƒ‰ (Store & Search Service)

  • CQRS ํŒจํ„ด ์ ์šฉ: Command(PostgreSQL)์™€ Query(Elasticsearch) ์ฑ…์ž„ ๋ถ„๋ฆฌ
  • ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”: Kafka๋ฅผ ํ†ตํ•ด Store ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ Search ์„œ๋น„์Šค๋กœ ์‹ค์‹œ๊ฐ„ ์ „ํŒŒ (Eventual Consistency)
  • ๊ณ ์„ฑ๋Šฅ ๊ฒ€์ƒ‰: Elasticsearch Nori ๋ถ„์„๊ธฐ ํ™œ์šฉ ๋ฐ search_after ๊ธฐ๋ฐ˜ Cursor ํŽ˜์ด์ง• ๊ตฌํ˜„

3๏ธโƒฃ ์˜ˆ์•ฝ ๋ฐ ์›จ์ดํŒ… ์‹œ์Šคํ…œ (Reservation & Waiting Service)

  • ์ผ๋ฐ˜ ์˜ˆ์•ฝ: ํŠธ๋žœ์žญ์…˜ ๋ณด์žฅ์„ ํ†ตํ•œ ์ค‘๋ณต ์˜ˆ์•ฝ ๋ฐฉ์ง€ ๋ฐ ์ •์ฑ… ๊ฒ€์ฆ
  • ์ธ๊ธฐ ๋ง›์ง‘ ์˜ˆ์•ฝ (๋Œ€๊ธฐ์—ด): Redis ZSet์„ ํ™œ์šฉํ•œ ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ (์ˆœ๋ฒˆ ๋ณด์žฅ, ์ง„์ž… ์ œ์–ด)
  • ํ˜„์žฅ ์›จ์ดํŒ…: ์‹ค์‹œ๊ฐ„ ์ค„์„œ๊ธฐ ๋ฐ ์˜ˆ์ƒ ๋Œ€๊ธฐ์‹œ๊ฐ„ ๊ณ„์‚ฐ, SSE๋ฅผ ํ†ตํ•œ ์ž…์žฅ ์•Œ๋ฆผ

4๏ธโƒฃ ๋ฆฌ๋ทฐ ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ (Review Service)

  • ์‹ ๋ขฐ์„ฑ ํ™•๋ณด: ๋ฐฉ๋ฌธ ์™„๋ฃŒ(DONE) ๋œ ์˜ˆ์•ฝ์— ํ•œํ•ด์„œ๋งŒ ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • ํ†ต๊ณ„ ์ตœ์ ํ™”: Kafka๋ฅผ ํ™œ์šฉํ•ด ๋ฆฌ๋ทฐ ์ž‘์„ฑ ์‹œ ํ‰๊ท  ํ‰์ /๋ฆฌ๋ทฐ ์ˆ˜๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ง‘๊ณ„ํ•˜์—ฌ Store ์„œ๋น„์Šค์— ๋ฐ˜์˜

๐Ÿ—ฃ๏ธ ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ • (Technical Decisions)

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)$์œผ๋กœ ๋‹จ์ถ•ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์‘๋‹ต ์†๋„ ๊ฐœ์„ .

๐Ÿ€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… (Troubleshooting) & ์„ฑ๋Šฅ ๊ฐœ์„ 

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๋ฐฐ ๊ฐœ์„ )** ๋ฐ ์ผ์ •ํ•œ ์กฐํšŒ ์†๋„ $O(1)$ ๋ณด์žฅ.

์„œ๋น„์Šค๋ณ„ ํฌํŠธ๋ฒˆํ˜ธ

์„œ๋น„์Šค๋ช… ํฌํŠธ๋ฒˆํ˜ธ
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

๐Ÿ’พ ์„ค์น˜ ๋ฐ ์‹คํ–‰ ๋ฐฉ๋ฒ• (Getting Started)

  1. Repository Clone
    git clone [https://github.com/username/TableKok.git](https://github.com/username/TableKok.git)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published