์ด ํ๋ก์ ํธ๋ ์์คํ ๋์์ธ ์ธํฐ๋ทฐ ์ค๋น๋ฅผ ์ํ ์ค๋ฌด ์ค์ฌ ํ์ต ํ๋ก์ ํธ์ ๋๋ค. LeetCode์ ๊ฐ์ ์จ๋ผ์ธ ์ฝ๋ฉ ํ๋ซํผ์ ์ง์ ์ค๊ณํ๊ณ ๊ตฌํํ๋ฉฐ, ์ฑ๋ฅ ๋ณ๋ชฉ์ ์ฐพ์๋ด๊ณ ๊ตฌ์กฐ์ ์ผ๋ก ํด๊ฒฐํ๋ ๊ณผ์ ์ ํตํด ๋๊ท๋ชจ ์์คํ ์ค๊ณ ์๋ฆฌ๋ฅผ ์ฒด๋ํ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
๋จ์ํ ๋์ํ๋ ์๋น์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ, ์บ์ฑ ์ ๋ต, ํ์ด์ง๋ค์ด์ ๋ฐฉ์ ์ ํ, ์ฝ๋ ์คํ ์๋๋ฐ์ค ๋ถ๋ฆฌ, ์ค์๊ฐ ๋ฆฌ๋๋ณด๋ ์ค๊ณ, ๋ฉ์์ง ํ์ ์ปจํ ์ด๋๋ฅผ ํ์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ตฌ์กฐ ๋ฑ ์์คํ ๋์์ธ ์ธํฐ๋ทฐ์์ ์์ฃผ ๋ฑ์ฅํ๋ ์ฃผ์ ๋ค์ ์ค์ ๋ก ์ค๊ณํ๊ณ ์คํํ ํ๋ก์ ํธ์ ๋๋ค.
๐ ์ฐธ๊ณ ์๋ฃ:
- LeetCode ํ๋ก์ ํธ ์์ธ ๋ฌธ์
- Implementation
- Requirement
- API endpoint
- Optimization: GET ProblemList
- Optimization: GET ProblemDetail
- Optimization: POST Submit Problem
- Optimization: GET LeaderBoard
- Load Test: Apis
- Load Test: POST Submit Problem
- TroubleShooting: JPA OSIV
- RabbitMq: ackMode = None
- Throuput beyond #vCPU
- Framework: Spring Boot 3.5.0
- Language: Java 17
- Build Tool: Gradle 8.x
- Database: MySQL 8.0
- Cache: Redis
- Message Queue: RabbitMQ
- Monitoring: Prometheus + Grafana
- Database Migration: SQL Scripts
- Performance Monitoring: Spring Boot Actuator + Micrometer
- ๋ฌธ์ ๋ชฉ๋ก ์กฐํ: ๋ค์ํ ํ์ด์ง ๋ฐฉ์ ์ง์ (Cursor, Offset)
- ๋ฌธ์ ์์ธ ์กฐํ: ์บ์ฑ ์ ๋ต ์ ์ฉ์ผ๋ก ์ฑ๋ฅ ์ต์ ํ
- ๋์ด๋๋ณ ๋ถ๋ฅ: Easy, Medium, Hard
- ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ถ๋ฅ: Array, String, Tree ๋ฑ
- ์์ ํ ์ฝ๋ ์คํ: Docker ์๋๋ฐ์ค ํ๊ฒฝ ๋ถ๋ฆฌ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ: RabbitMQ๋ฅผ ํตํ ์ ์ถ ์ฒ๋ฆฌ
- ์ค์๊ฐ ๊ฒฐ๊ณผ ๋ฐํ: ๋ฉ์์ง ํ ๊ธฐ๋ฐ ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
- ์ค์๊ฐ ์์: Redis ๊ธฐ๋ฐ ๊ณ ์ฑ๋ฅ ๋ฆฌ๋๋ณด๋
- ์ฝํ ์คํธ๋ณ ์์: ๋ํ ๋จ์ ์์ ๊ด๋ฆฌ
- ์ฑ๋ฅ ์ต์ ํ: ์บ์ฑ์ ํตํ ๋น ๋ฅธ ์๋ต
- JWT ์ธ์ฆ: ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
- ์ฌ์ฉ์ ํต๊ณ: ์ ์ถ ์ด๋ ฅ ๋ฐ ์ฑ๊ณผ ์ถ์
-
API Server: This.
-
Code Sandbox: https://github.com/Collaborative-AI-SystemDesign/leetcode-sandbox
-
Result Server: https://github.com/Collaborative-AI-SystemDesign/leetcode-sandbox-consumer
- JPA ์ค์ :
spring.jpa.open-in-view: false๋ก OSIV ๋นํ์ฑํ - ๋ฐฐ์น ์ฒ๋ฆฌ:
hibernate.jdbc.batch_size: 1000์ค์ - ์ธ๋ฑ์ฑ: ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค ์ต์ ํ
- Redis ์บ์: ๋ฌธ์ ์์ธ ์ ๋ณด ๋ฐ ๋ฆฌ๋๋ณด๋ ์บ์ฑ
- Spring Cache: ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ ์บ์ฑ ์ ์ฉ
- RabbitMQ: ์ฝ๋ ์คํ ์์ฒญ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
- ๋ฉ์์ง ํ ์ต์ ํ:
acknowledge-mode: none์ค์ ์ผ๋ก ์ฑ๋ฅ ํฅ์
- Tomcat ํ๋: max-threads: 250, max-connections: 10000
- Connection Pool: ํจ์จ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ฆฌ
# ๋ฌธ์ ๋ชฉ๋ก ์กฐํ (๋ฒ์ ๊ธฐ๋ฐ)
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: ์์ ์ฝ๋ ํ ํ๋ฆฟ
- 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
- URL:
http://localhost:3000 - ๊ธฐ๋ณธ ๊ณ์ : admin/admin
- ํ์ด์ง๋ค์ด์ : Cursor vs Offset ๋ฐฉ์ ์ฑ๋ฅ ๋น๊ต
- JPA ์ต์ ํ: OSIV ๋นํ์ฑํ, ๋ฐฐ์น ์ฒ๋ฆฌ ์ ์ฉ
- ์ฟผ๋ฆฌ ์ต์ ํ: N+1 ๋ฌธ์ ํด๊ฒฐ, ์ธ๋ฑ์ค ํ์ฉ
- ๋ฆฌ๋๋ณด๋ ์บ์ฑ: Redis Sorted Set ํ์ฉ
- ๋ฌธ์ ์์ธ ์บ์ฑ: ์กฐํ ์ฑ๋ฅ ํฅ์
- ์ ์ ํ TTL ์ค์ : ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์ฑ๋ฅ ๋ฐธ๋ฐ์ค
- ๋ฉ์์ง ํ: ์ฝ๋ ์คํ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ
- RabbitMQ ์ต์ ํ: ACK ๋ชจ๋ ์กฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ํฅ์
- ๋ฌธ์ ๋ชฉ๋ก ์กฐํ: ์ด๋น 1000+ ์์ฒญ ์ฒ๋ฆฌ
- ๋ฌธ์ ์์ธ ์กฐํ: ์บ์ฑ ์ ์ฉ์ผ๋ก ์๋ต์๊ฐ 50ms ์ดํ
- ์ฝ๋ ์ ์ถ: ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ์ฆ์ ์๋ต
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ํ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ: ์ปค๋ฅ์ ํ ํจ์จํ
- ์บ์ ์ ์ค๋ฅ : 90% ์ด์ ์บ์ ํ์ฉ
- JPA OSIV ๋ฌธ์ : LazyInitializationException ํด๊ฒฐ
- RabbitMQ ACK ๋ชจ๋: ์ฑ๋ฅ vs ์์ ์ฑ ํธ๋ ์ด๋์คํ
- vCPU ์ฒ๋ฆฌ๋ ํ๊ณ: ์ค๋ ๋ ํ ์ต์ ํ
๐ ํ๋ก์ ํธ ๋ชฉ์ : ์์คํ
๋์์ธ ์ธํฐ๋ทฐ ๋๋น ์ค๋ฌด ๊ฒฝํ ์๊ธฐ
๐ฏ ํต์ฌ ํ์ต ๋ด์ฉ: ๋๊ท๋ชจ ์์คํ
์ค๊ณ, ์ฑ๋ฅ ์ต์ ํ, ๋ถํ ํ
์คํธ
๐ ์ฑ๊ณผ: ์ค์ ์ด์ ํ๊ฒฝ ์์ค์ ์ฑ๋ฅ ์ต์ ํ ๊ฒฝํ ์ต๋