Skip to content

Collaborative-AI-SystemDesign/design-leetcode-scalable-architecture

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

98 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

LeetCode ํด๋ก  ํ”Œ๋žซํผ - ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ”„๋กœ์ ํŠธ

๐Ÿ“– ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

์ด ํ”„๋กœ์ ํŠธ๋Š” ์‹œ์Šคํ…œ ๋””์ž์ธ ์ธํ„ฐ๋ทฐ ์ค€๋น„๋ฅผ ์œ„ํ•œ ์‹ค๋ฌด ์ค‘์‹ฌ ํ•™์Šต ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค. LeetCode์™€ ๊ฐ™์€ ์˜จ๋ผ์ธ ์ฝ”๋”ฉ ํ”Œ๋žซํผ์„ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋ฉฐ, ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์„ ์ฐพ์•„๋‚ด๊ณ  ๊ตฌ์กฐ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์„ ํ†ตํ•ด ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ์›๋ฆฌ๋ฅผ ์ฒด๋“ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

๋‹จ์ˆœํžˆ ๋™์ž‘ํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์บ์‹ฑ ์ „๋žต, ํŽ˜์ด์ง€๋„ค์ด์…˜ ๋ฐฉ์‹ ์„ ํƒ, ์ฝ”๋“œ ์‹คํ–‰ ์ƒŒ๋“œ๋ฐ•์Šค ๋ถ„๋ฆฌ, ์‹ค์‹œ๊ฐ„ ๋ฆฌ๋”๋ณด๋“œ ์„ค๊ณ„, ๋ฉ”์‹œ์ง€ ํ์™€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ™œ์šฉํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ ๋“ฑ ์‹œ์Šคํ…œ ๋””์ž์ธ ์ธํ„ฐ๋ทฐ์—์„œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์ฃผ์ œ๋“ค์„ ์‹ค์ œ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ์‹คํ—˜ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๐Ÿ“š ์ฐธ๊ณ  ์ž๋ฃŒ:

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

Backend

  • Framework: Spring Boot 3.5.0
  • Language: Java 17
  • Build Tool: Gradle 8.x
  • Database: MySQL 8.0
  • Cache: Redis
  • Message Queue: RabbitMQ

Infrastructure & DevOps

  • Monitoring: Prometheus + Grafana
  • Database Migration: SQL Scripts

Testing & Performance

  • Performance Monitoring: Spring Boot Actuator + Micrometer

๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ๋ฌธ์ œ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ

  • ๋ฌธ์ œ ๋ชฉ๋ก ์กฐํšŒ: ๋‹ค์–‘ํ•œ ํŽ˜์ด์ง• ๋ฐฉ์‹ ์ง€์› (Cursor, Offset)
  • ๋ฌธ์ œ ์ƒ์„ธ ์กฐํšŒ: ์บ์‹ฑ ์ „๋žต ์ ์šฉ์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ๋‚œ์ด๋„๋ณ„ ๋ถ„๋ฅ˜: Easy, Medium, Hard
  • ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ถ„๋ฅ˜: Array, String, Tree ๋“ฑ

2. ์ฝ”๋“œ ์ œ์ถœ ๋ฐ ์‹คํ–‰

  • ์•ˆ์ „ํ•œ ์ฝ”๋“œ ์‹คํ–‰: Docker ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ ๋ถ„๋ฆฌ
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: RabbitMQ๋ฅผ ํ†ตํ•œ ์ œ์ถœ ์ฒ˜๋ฆฌ
  • ์‹ค์‹œ๊ฐ„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜: ๋ฉ”์‹œ์ง€ ํ ๊ธฐ๋ฐ˜ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ

3. ๋ฆฌ๋”๋ณด๋“œ ์‹œ์Šคํ…œ

  • ์‹ค์‹œ๊ฐ„ ์ˆœ์œ„: Redis ๊ธฐ๋ฐ˜ ๊ณ ์„ฑ๋Šฅ ๋ฆฌ๋”๋ณด๋“œ
  • ์ฝ˜ํ…Œ์ŠคํŠธ๋ณ„ ์ˆœ์œ„: ๋Œ€ํšŒ ๋‹จ์œ„ ์ˆœ์œ„ ๊ด€๋ฆฌ
  • ์„ฑ๋Šฅ ์ตœ์ ํ™”: ์บ์‹ฑ์„ ํ†ตํ•œ ๋น ๋ฅธ ์‘๋‹ต

4. ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ

  • JWT ์ธ์ฆ: ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ
  • ์‚ฌ์šฉ์ž ํ†ต๊ณ„: ์ œ์ถœ ์ด๋ ฅ ๋ฐ ์„ฑ๊ณผ ์ถ”์ 

์‹œ์Šคํ…œ ๋””์ž์ธ

image

๐Ÿ“Š ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ˜„ํ™ฉ

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ตœ์ ํ™”

  • JPA ์„ค์ •: spring.jpa.open-in-view: false๋กœ OSIV ๋น„ํ™œ์„ฑํ™”
  • ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ: hibernate.jdbc.batch_size: 1000 ์„ค์ •
  • ์ธ๋ฑ์‹ฑ: ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ๋ฑ์Šค ์ตœ์ ํ™”

2. ์บ์‹ฑ ์ „๋žต

  • Redis ์บ์‹œ: ๋ฌธ์ œ ์ƒ์„ธ ์ •๋ณด ๋ฐ ๋ฆฌ๋”๋ณด๋“œ ์บ์‹ฑ
  • Spring Cache: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ ์บ์‹ฑ ์ ์šฉ

3. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

  • RabbitMQ: ์ฝ”๋“œ ์‹คํ–‰ ์š”์ฒญ์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  • ๋ฉ”์‹œ์ง€ ํ ์ตœ์ ํ™”: acknowledge-mode: none ์„ค์ •์œผ๋กœ ์„ฑ๋Šฅ ํ–ฅ์ƒ

4. ์„œ๋ฒ„ ์ตœ์ ํ™”

  • Tomcat ํŠœ๋‹: max-threads: 250, max-connections: 10000
  • Connection Pool: ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ด€๋ฆฌ

๐ŸŽฏ API ์—”๋“œํฌ์ธํŠธ

๋ฌธ์ œ ๊ด€๋ฆฌ

# ๋ฌธ์ œ ๋ชฉ๋ก ์กฐํšŒ (๋ฒ”์œ„ ๊ธฐ๋ฐ˜)
GET /problems?start={start}&end={end}

# ๋ฌธ์ œ ๋ชฉ๋ก ์กฐํšŒ (Offset ํŽ˜์ด์ง•)
GET /problems/offset?page={page}&size={size}

# ๋ฌธ์ œ ๋ชฉ๋ก ์กฐํšŒ (Cursor ํŽ˜์ด์ง•)
GET /problems/cursor?cursor={cursor}&limit={limit}

# ๋ฌธ์ œ ์ƒ์„ธ ์กฐํšŒ
GET /problems/{problemId}

# ์ฝ”๋“œ ์ œ์ถœ
POST /problems/{problemId}/submission
Content-Type: application/json
{
  "code": "public class Solution {...}",
  "language": "JAVA"
}

๋ฆฌ๋”๋ณด๋“œ

# ์ฝ˜ํ…Œ์ŠคํŠธ ๋ฆฌ๋”๋ณด๋“œ ์กฐํšŒ
GET /v1/contests/{contest_id}/leaderboard

๐Ÿ—„๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ

์ฃผ์š” ํ…Œ์ด๋ธ”

  • problem: ๋ฌธ์ œ ์ •๋ณด (์ œ๋ชฉ, ์„ค๋ช…, ๋‚œ์ด๋„, ์ œ์•ฝ์‚ฌํ•ญ)
  • submission: ์ œ์ถœ ๋‚ด์—ญ (์ฝ”๋“œ, ์–ธ์–ด, ์ƒํƒœ, ์‹คํ–‰์‹œ๊ฐ„, ๋ฉ”๋ชจ๋ฆฌ)
  • user: ์‚ฌ์šฉ์ž ์ •๋ณด
  • contest: ๋Œ€ํšŒ ์ •๋ณด
  • leaderboard: ๋ฆฌ๋”๋ณด๋“œ ์ˆœ์œ„
  • testcases: ํ…Œ์ŠคํŠธ์ผ€์ด์Šค (๋ฌธ์ œ๋‹น 100๊ฐœ)
  • example: ์˜ˆ์ œ (๋ฌธ์ œ๋‹น 3๊ฐœ)
  • starter_code: ์‹œ์ž‘ ์ฝ”๋“œ ํ…œํ”Œ๋ฆฟ

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

1. ํ™˜๊ฒฝ ์„ค์ •

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Java 17+
  • Docker & Docker Compose
  • Gradle 8.x

๊ณตํ†ต ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

export MYSQL_HOST=localhost
export MYSQL_DB=sd_db
export MYSQL_USER=sd_user
export MYSQL_PASSWORD=sd_password
export REDIS_HOST=localhost
export RABBITMQ_HOST=localhost
export RABBITMQ_USERNAME=guest
export RABBITMQ_PASSWORD=guest

๐Ÿ“Š ๋ชจ๋‹ˆํ„ฐ๋ง

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”ํŠธ๋ฆญ

  • Endpoint: http://localhost:8080/actuator
  • Prometheus ๋ฉ”ํŠธ๋ฆญ: http://localhost:8080/actuator/prometheus

Grafana ๋Œ€์‹œ๋ณด๋“œ

  • URL: http://localhost:3000
  • ๊ธฐ๋ณธ ๊ณ„์ •: admin/admin

๐Ÿ”ง ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ

  • ํŽ˜์ด์ง€๋„ค์ด์…˜: Cursor vs Offset ๋ฐฉ์‹ ์„ฑ๋Šฅ ๋น„๊ต
  • JPA ์ตœ์ ํ™”: OSIV ๋น„ํ™œ์„ฑํ™”, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ์ ์šฉ
  • ์ฟผ๋ฆฌ ์ตœ์ ํ™”: N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ, ์ธ๋ฑ์Šค ํ™œ์šฉ

2. ์บ์‹ฑ ์ „๋žต

  • ๋ฆฌ๋”๋ณด๋“œ ์บ์‹ฑ: Redis Sorted Set ํ™œ์šฉ
  • ๋ฌธ์ œ ์ƒ์„ธ ์บ์‹ฑ: ์กฐํšŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ์ ์ ˆํ•œ TTL ์„ค์ •: ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์„ฑ๋Šฅ ๋ฐธ๋Ÿฐ์Šค

3. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

  • ๋ฉ”์‹œ์ง€ ํ: ์ฝ”๋“œ ์‹คํ–‰์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ
  • RabbitMQ ์ตœ์ ํ™”: ACK ๋ชจ๋“œ ์กฐ์ •์œผ๋กœ ์ฒ˜๋ฆฌ๋Ÿ‰ ํ–ฅ์ƒ

๐Ÿ“ˆ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

API ์„ฑ๋Šฅ

  • ๋ฌธ์ œ ๋ชฉ๋ก ์กฐํšŒ: ์ดˆ๋‹น 1000+ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • ๋ฌธ์ œ ์ƒ์„ธ ์กฐํšŒ: ์บ์‹ฑ ์ ์šฉ์œผ๋กœ ์‘๋‹ต์‹œ๊ฐ„ 50ms ์ดํ•˜
  • ์ฝ”๋“œ ์ œ์ถœ: ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์ฆ‰์‹œ ์‘๋‹ต

์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค

  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰: ํž™ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ: ์ปค๋„ฅ์…˜ ํ’€ ํšจ์œจํ™”
  • ์บ์‹œ ์ ์ค‘๋ฅ : 90% ์ด์ƒ ์บ์‹œ ํ™œ์šฉ

๐Ÿšง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์ฃผ์š” ํ•ด๊ฒฐ ์ด์Šˆ

  1. JPA OSIV ๋ฌธ์ œ: LazyInitializationException ํ•ด๊ฒฐ
  2. RabbitMQ ACK ๋ชจ๋“œ: ์„ฑ๋Šฅ vs ์•ˆ์ •์„ฑ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
  3. vCPU ์ฒ˜๋ฆฌ๋Ÿ‰ ํ•œ๊ณ„: ์Šค๋ ˆ๋“œ ํ’€ ์ตœ์ ํ™”

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ๋ชฉ์ : ์‹œ์Šคํ…œ ๋””์ž์ธ ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์‹ค๋ฌด ๊ฒฝํ—˜ ์Œ“๊ธฐ
๐ŸŽฏ ํ•ต์‹ฌ ํ•™์Šต ๋‚ด์šฉ: ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„, ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ
๐Ÿ“Š ์„ฑ๊ณผ: ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฒฝํ—˜ ์Šต๋“

About

design-leetcode-scalable-architecture

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages