์ด ํ๋ก์ ํธ๋ Spring Boot ๊ธฐ๋ฐ์ E-Commerce ์ผํ๋ชฐ ๊ตฌํ์ ๋ชฉํ๋ก ํ ๊ฐ์ธ ํ๋ก์ ํธ์ ๋๋ค.
์ํ ์กฐํ๋ถํฐ ์ฃผ๋ฌธ, ๊ฒฐ์ ๊น์ง ์ผ๋ฐ์ ์ธ ์ปค๋จธ์ค ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์ค์ PG์ฌ API ์ฐ๋์ ํตํ ๊ฒฐ์ ํ ์คํธ๋ ํฌํจ๋์ด ์์ต๋๋ค.
์๋น์ค๋ MSA + ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ(EDA) ๋ก ๊ตฌ์ฑ๋์์ผ๋ฉฐ, ๊ณ ํธ๋ํฝ/์ฅ์ ์ํฉ์์๋ ์์ ์ ์ธ ๋์์ ๋ชฉํ๋ก ๋ค์์ ์ค๊ณํ์ต๋๋ค:
โก ์ค์ ์ฅ์ ์ํฉ(Redis ๋ค์ด, Kafka ์ด๋ฒคํธ ์ ์ค, PG API ์ค๋ฅ ๋ฑ)์ ๋๋นํ์ฌ, ํ์ฅ์ฑยท๋ณต์๋ ฅยท์ผ๊ด์ฑ์ ๊ณ ๋ คํ ๋ฐฑ์๋ ์ค๊ณ๋ฅผ ํ์ตํ๊ณ ๊ตฌํํ ํ๋ก์ ํธ์ ๋๋ค
์๋์ ํญ๋ชฉ์ ์ค์น ํ, ์คํํด์ฃผ์ธ์.
- JDK 21 ์ด์
- gradle
- Docker
์๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ํ๋ก์ ํธ๋ฅผ ์ค์นํ๊ณ ์คํํด์ฃผ์ธ์.
-
์ ์ฅ์๋ฅผ ํด๋ก ํฉ๋๋ค.
git clone https://github.com/Jyoungjo/hurry-up-order.git cd hurry-up-order -
Docker๋ฅผ ์ฌ์ฉํ์ฌ PostgreSQL๊ณผ Redis๋ฅผ ์คํํฉ๋๋ค.
docker run --env=POSTGRES_USER=๊ณ์ ๋ช --env=POSTGRES_PASSWORD=๋น๋ฐ๋ฒํธ --network=bridge -p 5432:5432 -d postgres docker run --network=bridge -p 6379:6379 -d redis:latest
-
๊ฐ ๋ชจ๋ ๋ด ์ฒจ๋ถ๋ application-secret.yml.txt ํ์ผ์ ์ฐธ๊ณ ํ์ฌ ์์ฑ ํ resources์ ์ฒจ๋ถํฉ๋๋ค.
-
Gradle์ ์ฌ์ฉํ์ฌ ํ์ ์์กด์ฑ์ ์ค์นํ๊ณ ๋น๋ํฉ๋๋ค.
./gradlew clean build
-
์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค.
./gradlew preorder-eureka:bootRun ./gradlew preorder-gateway:bootRun ./gradlew preorder-user:bootRun ./gradlew preorder-item:bootRun ./gradlew preorder-order:bootRun ./gradlew preorder-payment:bootRun
API ๋ช ์ธ์ ๊ฒฝ์ฐ ๐API ๋ช ์ธ์์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๐ค ์ฌ์ฉ์ ๊ด๋ฆฌ
- ํ์๊ฐ์ ์ ์ ๋ณด ์ํธํ ์ ์ฅ
- ๋ก๊ทธ์์ ์ refresh token ๋ธ๋๋ฆฌ์คํธ ์ฒ๋ฆฌ๋ก ์ฌ๋ฐ๊ธ ์ฐจ๋จ
- ์ฌ์ฉ์ ์ ๋ณด ์กฐํ, ์์ , ํํด ๊ธฐ๋ฅ
- ์์๋ฆฌ์คํธ ์ถ๊ฐ/์ญ์ ๋ฐ ์์๋ฆฌ์คํธ์์ ๋ฐ๋ก ์ฃผ๋ฌธ ๊ฐ๋ฅ
๐ ์ํ/์ฃผ๋ฌธ/์ฅ๋ฐ๊ตฌ๋ ๊ด๋ฆฌ
- ํ๋งค์ ์ํ ๋ฑ๋ก ๋ฐ ํ์ด์ง/์์ธ ์กฐํ
- ์ผ๋ฐ ์ํ ๋ฐ ์๋ ํ์ ์ํ ์ฃผ๋ฌธ ์ฒ๋ฆฌ
- ์ฃผ๋ฌธ ๋ด์ญ ์กฐํ, ์ทจ์ ๋ฐ ๋ฐํ ์ฒ๋ฆฌ
- ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ + ์ฅ๋ฐ๊ตฌ๋์์ ๋ฐ๋ก ์ฃผ๋ฌธ ์ฐ๊ฒฐ
๐ฆ ์ฌ๊ณ ๊ด๋ฆฌ
- ์ค์๊ฐ ์ฌ๊ณ ์กฐํ, ์ฆ๊ฐ/์ฐจ๊ฐ
- Redis + Lua Script๋ฅผ ํตํ ๋์์ฑ ์ ์ด
๐ณ ๊ฒฐ์ ๋ฐ ์ ์ฐ ์ฒ๋ฆฌ
- TossPayments / NicePayments API ์ฐ๋
- Circuit Breaker + Retry๋ก ์ฅ์ ์ ๋ณต์๋ ฅ ํ๋ณด
- ๊ฒฐ์ ์คํจ ์ Kafka ๊ธฐ๋ฐ ๋ณด์ ํธ๋์ญ์ ์ฒ๋ฆฌ
- ๊ฒฐ์ ์๋ฃ ํ ์ ์ฐ ์ ์ฅ ๋ฐ ์ค์ผ์ค๋ง ์ฒ๋ฆฌ
โ ํ ์คํธ
- ๊ฐ ๋ ์ด์ด๋ณ Unit Test (Coverage 75%)
- ๋์์ฑ ํ ์คํธ ์ฝ๋๋ก ์ฌ๊ณ ์ ์ด ์ ํจ์ฑ ์ ์ฆ
- TOSS ๊ฒฐ์ API Timeout ์ต์ ํ, ๋น๋๊ธฐ ํธ์ถ์ ๋ํ Executor ์ค์ ์ต์ ํ ์งํ
| ํญ๋ชฉ | ์ฒ๋ฆฌ ๋ด์ฉ | ๊ฐ์ ์ | ๊ฐ์ ํ | ํฅ์๋ |
|---|---|---|---|---|
| ์ด๋ฉ์ผ ์ธ์ฆ | ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ | 13s | 0.69s | โ ์ฝ 18.8๋ฐฐ ํฅ์ / 94.6% ๊ฐ์ |
| ์ํ ๋ฐ ์ฌ๊ณ ์กฐํ | Redis Caching | 180ms | 14ms | โ ์ฝ 13๋ฐฐ ํฅ์ / ์ฝ 92.2% ๊ฐ์ |
| ๋ก๊ทธ์ธ | ๋ก์ปฌ Cache + Interface Projection | 1.3s | 8ms | โ ์ฝ 162๋ฐฐ ํฅ์ / 99.4% ๊ฐ์ |
| ์ฃผ๋ฌธ ์์ฑ (์ํ 1000๊ฑด ๊ธฐ์ค) | Batch INSERT + ์ธ๋ถ API ๋ณ๋ ฌ ํธ์ถ(CompletableFuture) | 5.3s | 1.23s | โ ์ฝ 4.3๋ฐฐ ํฅ์ / 76.8% ๊ฐ์ |
๐ ๐ ์ฑ๋ฅ ๊ฐ์ ์์ธ ๋ณด๊ธฐ
| ๋ฌธ์ | ์์ธ ๋ฐ ํ์ | ํด๊ฒฐ ๋ฐฉ๋ฒ | ํจ๊ณผ |
|---|---|---|---|
| ์ฌ๊ณ ๋์์ฑ ๋ฌธ์ | ํธ๋์ญ์ ์ถฉ๋๋ก ์ด๊ณผ ํ๋งค ๋ฐ์ | Redis + Lua + ๋๊ด์ ๋ฝ ์ ์ฉ | โ ์ฌ๊ณ ์ด๊ณผ 0๊ฑด ๋ฌ์ฑ |
| Eureka ๋ฑ๋ก ๋๋ฝ | Eureka ๊ธฐ๋ ์ ๋ค๋ฅธ ์๋น์ค ์คํ | HealthCheck + Compose ์์กด์ฑ ์ค์ | โ ์๋น์ค ์ธ์ ์์ ํ |
| Test ํ๊ฒฝ ๋ด Embedded Redis ์ถฉ๋ | ํ ์คํธ ์ค ํฌํธ ์ค๋ณต | ๋น ํฌํธ ๋์ ํ ๋น ๋ก์ง ๋์ | โ ํด๋น ๋ฌธ์ ๋ก ์ธํ ํ ์คํธ ์คํจ์จ 0% ๋ฌ์ฑ |
| Redis ์ฅ์ | ๋จ์ผ Redis ์ฅ์ ์ ์ ์ฒด ์ฃผ๋ฌธ ์คํจ | Redis Sentinel + ์ปค๋ฅ์ ์ฌ์๋ | โ ์ฃผ๋ฌธ ์คํจ์จ 100% โ 0% |
| Kafka ์ด๋ฒคํธ ์๋น ๋๋ฝ | ์ค๋ณต/์ฅ์ ์ ์ด๋ฒคํธ ์ฌ์ฒ๋ฆฌ ๋ถ๊ฐ | ProcessedEvent ํ ์ด๋ธ + DLQ ์ฒ๋ฆฌ | โ ๋ฐ์ดํฐ ์ ํฉ์ฑ ํ๋ณด |
| ์ฃผ๋ฌธ ๋กค๋ฐฑ ๋ถ๊ฐ | ๊ฒฐ์ ์คํจ ์ ์ฌ๊ณ ๊ฐ ๋ณต๊ตฌ ์๋จ | SAGA ํจํด + ๋ณด์ ์ด๋ฒคํธ ๋์ | โ ์ ์ฒด ํ๋ฆ ๋ณต์๋ ฅ ๊ฐํ |
๐ ๐ ํธ๋ฌ๋ธ ์ํ ์์ธ ๋ณด๊ธฐ
- PostgreSQL โ ๋์ฉ๋ ํธ๋ํฝ๊ณผ ๋์์ฑ ์ ์ด์ ๊ฐํจ
- ID ๊ฐ์ ์ฐธ์กฐ โ ๋ฎ์ ๊ฒฐํฉ๋, ๋์ ์ ์ฐ์ฑ ํ๋ณด
- Outbox ํจํด โ DB ํธ๋์ญ์ ๊ณผ Kafka ์ด๋ฒคํธ์ ์ ํฉ์ฑ ๋ณด์ฅ
- Feign Client โ ์ง๊ด์ ์ด๋ฉฐ Spring Cloud์ ํตํฉ ์ฉ์ด
- Kafka ๋ฉ์์ง โ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐ ์ฅ์ ๊ฒฉ๋ฆฌ์ ์ ๋ฆฌ
- Redis โ ๋น ๋ฅธ ์๋ต์ฑ๊ณผ ๋ฐ์ดํฐ ์ผ๊ด์ฑ ํ๋ณด
- Batch Insert โ ์ฃผ๋ฌธ ์ฒ๋ฆฌ I/O ์ต์ํ
- CompletableFuture โ ์ธ๋ถ ์๋น์ค ๋ณ๋ชฉ ์ ๊ฑฐ
- Circuit Breaker โ ์ธ๋ถ ๊ฒฐ์ API ์ฅ์ ์ ํ ๋ฐฉ์ง
- Redis Sentinel + Docker โ ์๋ Failover ๊ตฌ์ฑ์ผ๋ก ๊ณ ๊ฐ์ฉ์ฑ ํ๋ณด
โ ๊ธฐ์ ์์ฌ๊ฒฐ์ ์์ธ ๋ณด๊ธฐ
ํน์ฌ ํ๋ก์ ํธ์ ๊ฐ์ ์ฌํญ์ ๋ฐ๊ฒฌํ์ จ์ ๊ฒฝ์ฐ, ๊ธฐ์ฌํด์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/branch_name) - Commit your Changes (
git commit -m 'commit!') - Push to the Branch (
git push origin feature/branch_name) - Open a Pull Request
Email - zimbote0411@gmail.com
Project Link: https://github.com/Jyoungjo/hanghae99_pre-order

