Skip to content

Jyoungjo/hurry-up-order

Repository files navigation

Hurry Up Order!

E-Commerce MSA ํ”„๋กœ์ ํŠธ



๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

์ด ํ”„๋กœ์ ํŠธ๋Š” Spring Boot ๊ธฐ๋ฐ˜์˜ E-Commerce ์‡ผํ•‘๋ชฐ ๊ตฌํ˜„์„ ๋ชฉํ‘œ๋กœ ํ•œ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

์ƒํ’ˆ ์กฐํšŒ๋ถ€ํ„ฐ ์ฃผ๋ฌธ, ๊ฒฐ์ œ๊นŒ์ง€ ์ผ๋ฐ˜์ ์ธ ์ปค๋จธ์Šค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์‹ค์ œ PG์‚ฌ API ์—ฐ๋™์„ ํ†ตํ•œ ๊ฒฐ์ œ ํ…Œ์ŠคํŠธ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค๋Š” MSA + ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(EDA) ๋กœ ๊ตฌ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ๊ณ ํŠธ๋ž˜ํ”ฝ/์žฅ์•  ์ƒํ™ฉ์—์„œ๋„ ์•ˆ์ •์ ์ธ ๋™์ž‘์„ ๋ชฉํ‘œ๋กœ ๋‹ค์Œ์„ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค:

  • Kafka ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์„œ๋น„์Šค ๊ฐ„ ๊ฒฐํ•ฉ๋„ ์ตœ์†Œํ™”

  • Redis + Lua Script ๊ธฐ๋ฐ˜ ์žฌ๊ณ  ์„ ์  ๋ฐ ๋™์‹œ์„ฑ ์ œ์–ด

  • Redis Sentinel์„ ํ†ตํ•œ ๊ณ ๊ฐ€์šฉ์„ฑ ํ™•๋ณด

  • Outbox ํŒจํ„ด + Kafka ์žฌ์‹œ๋„ + DLQ ์ฒ˜๋ฆฌ๋กœ ๋ฉ”์‹œ์ง€ ์†์‹ค ๋ฐฉ์ง€

  • PG์‚ฌ ์žฅ์•  ๋Œ€์‘์„ ์œ„ํ•œ Circuit Breaker ๋ฐ Retry ๊ธฐ๋ฐ˜ ํšŒ๋ณต ํƒ„๋ ฅ์„ฑ ํ™•๋ณด

โžก ์‹ค์ œ ์žฅ์•  ์ƒํ™ฉ(Redis ๋‹ค์šด, Kafka ์ด๋ฒคํŠธ ์œ ์‹ค, PG API ์˜ค๋ฅ˜ ๋“ฑ)์— ๋Œ€๋น„ํ•˜์—ฌ, ํ™•์žฅ์„ฑยท๋ณต์›๋ ฅยท์ผ๊ด€์„ฑ์„ ๊ณ ๋ คํ•œ ๋ฐฑ์—”๋“œ ์„ค๊ณ„๋ฅผ ํ•™์Šตํ•˜๊ณ  ๊ตฌํ˜„ํ•œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค

์‚ฌ์šฉ ๊ธฐ์ˆ 

  • Spring
  • Spring Security
  • Postgre
  • Redis
  • Docker
  • AWS EC2
  • AWS RDS
  • KAFKA

์‹œ์ž‘ํ•˜๊ธฐ

์‚ฌ์ „ ์ค€๋น„ ์‚ฌํ•ญ

์•„๋ž˜์˜ ํ•ญ๋ชฉ์„ ์„ค์น˜ ํ›„, ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”.

  • JDK 21 ์ด์ƒ
  • gradle
  • Docker

์„ค์น˜ ๋ฐฉ๋ฒ•

์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”.

  1. ์ €์žฅ์†Œ๋ฅผ ํด๋ก ํ•ฉ๋‹ˆ๋‹ค.

    git clone https://github.com/Jyoungjo/hurry-up-order.git
    cd hurry-up-order
  2. 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
  3. ๊ฐ ๋ชจ๋“ˆ ๋‚ด ์ฒจ๋ถ€๋œ application-secret.yml.txt ํŒŒ์ผ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ ํ›„ resources์— ์ฒจ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

  4. Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š” ์˜์กด์„ฑ์„ ์„ค์น˜ํ•˜๊ณ  ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

    ./gradlew clean build
  5. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ./gradlew preorder-eureka:bootRun
    ./gradlew preorder-gateway:bootRun
    ./gradlew preorder-user:bootRun
    ./gradlew preorder-item:bootRun
    ./gradlew preorder-order:bootRun
    ./gradlew preorder-payment:bootRun

(back to top)


API ๋ช…์„ธ

API ๋ช…์„ธ์˜ ๊ฒฝ์šฐ ๐Ÿ“—API ๋ช…์„ธ์„œ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(back to top)


ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜

ERD

image

ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ฒ˜

Image

CI/CD Flow

Image


๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ ์š”์•ฝ

๐Ÿ‘ค ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ

  • ํšŒ์›๊ฐ€์ž… ์‹œ ์ •๋ณด ์•”ํ˜ธํ™” ์ €์žฅ
  • ๋กœ๊ทธ์•„์›ƒ ์‹œ refresh token ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์ฒ˜๋ฆฌ๋กœ ์žฌ๋ฐœ๊ธ‰ ์ฐจ๋‹จ
  • ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ, ์ˆ˜์ •, ํƒˆํ‡ด ๊ธฐ๋Šฅ
  • ์œ„์‹œ๋ฆฌ์ŠคํŠธ ์ถ”๊ฐ€/์‚ญ์ œ ๋ฐ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐ”๋กœ ์ฃผ๋ฌธ ๊ฐ€๋Šฅ

๐Ÿ›’ ์ƒํ’ˆ/์ฃผ๋ฌธ/์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ด€๋ฆฌ

  • ํŒ๋งค์ž ์ƒํ’ˆ ๋“ฑ๋ก ๋ฐ ํŽ˜์ด์ง•/์ƒ์„ธ ์กฐํšŒ
  • ์ผ๋ฐ˜ ์ƒํ’ˆ ๋ฐ ์ˆ˜๋Ÿ‰ ํ•œ์ • ์ƒํ’ˆ ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ
  • ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ, ์ทจ์†Œ ๋ฐ ๋ฐ˜ํ’ˆ ์ฒ˜๋ฆฌ
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ + ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ๋ฐ”๋กœ ์ฃผ๋ฌธ ์—ฐ๊ฒฐ

๐Ÿ“ฆ ์žฌ๊ณ  ๊ด€๋ฆฌ

  • ์‹ค์‹œ๊ฐ„ ์žฌ๊ณ  ์กฐํšŒ, ์ฆ๊ฐ€/์ฐจ๊ฐ
  • Redis + Lua Script๋ฅผ ํ†ตํ•œ ๋™์‹œ์„ฑ ์ œ์–ด

๐Ÿ’ณ ๊ฒฐ์ œ ๋ฐ ์ •์‚ฐ ์ฒ˜๋ฆฌ

  • TossPayments / NicePayments API ์—ฐ๋™
  • Circuit Breaker + Retry๋กœ ์žฅ์•  ์‹œ ๋ณต์›๋ ฅ ํ™•๋ณด
  • ๊ฒฐ์ œ ์‹คํŒจ ์‹œ Kafka ๊ธฐ๋ฐ˜ ๋ณด์ƒ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ
  • ๊ฒฐ์ œ ์™„๋ฃŒ ํ›„ ์ •์‚ฐ ์ €์žฅ ๋ฐ ์Šค์ผ€์ค„๋ง ์ฒ˜๋ฆฌ

โœ… ํ…Œ์ŠคํŠธ

(back to top)


์„ฑ๋Šฅ ๊ฐœ์„ 

ํ•ญ๋ชฉ ์ฒ˜๋ฆฌ ๋‚ด์šฉ ๊ฐœ์„  ์ „ ๊ฐœ์„  ํ›„ ํ–ฅ์ƒ๋„
์ด๋ฉ”์ผ ์ธ์ฆ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ 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% ๊ฐ์†Œ

๐Ÿ”— ๐Ÿ“„ ์„ฑ๋Šฅ ๊ฐœ์„  ์ƒ์„ธ ๋ณด๊ธฐ

(back to top)


ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

๋ฌธ์ œ ์›์ธ ๋ฐ ํ˜„์ƒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ํšจ๊ณผ
์žฌ๊ณ  ๋™์‹œ์„ฑ ๋ฌธ์ œ ํŠธ๋žœ์žญ์…˜ ์ถฉ๋Œ๋กœ ์ดˆ๊ณผ ํŒ๋งค ๋ฐœ์ƒ Redis + Lua + ๋‚™๊ด€์  ๋ฝ ์ ์šฉ โœ… ์žฌ๊ณ  ์ดˆ๊ณผ 0๊ฑด ๋‹ฌ์„ฑ
Eureka ๋“ฑ๋ก ๋ˆ„๋ฝ Eureka ๊ธฐ๋™ ์ „ ๋‹ค๋ฅธ ์„œ๋น„์Šค ์‹คํ–‰ HealthCheck + Compose ์˜์กด์„ฑ ์„ค์ • โœ… ์„œ๋น„์Šค ์ธ์‹ ์•ˆ์ •ํ™”
Test ํ™˜๊ฒฝ ๋‚ด Embedded Redis ์ถฉ๋Œ ํ…Œ์ŠคํŠธ ์ค‘ ํฌํŠธ ์ค‘๋ณต ๋นˆ ํฌํŠธ ๋™์  ํ• ๋‹น ๋กœ์ง ๋„์ž… โœ… ํ•ด๋‹น ๋ฌธ์ œ๋กœ ์ธํ•œ ํ…Œ์ŠคํŠธ ์‹คํŒจ์œจ 0% ๋‹ฌ์„ฑ
Redis ์žฅ์•  ๋‹จ์ผ Redis ์žฅ์•  ์‹œ ์ „์ฒด ์ฃผ๋ฌธ ์‹คํŒจ Redis Sentinel + ์ปค๋„ฅ์…˜ ์žฌ์‹œ๋„ โœ… ์ฃผ๋ฌธ ์‹คํŒจ์œจ 100% โ†’ 0%
Kafka ์ด๋ฒคํŠธ ์†Œ๋น„ ๋ˆ„๋ฝ ์ค‘๋ณต/์žฅ์•  ์‹œ ์ด๋ฒคํŠธ ์žฌ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€ ProcessedEvent ํ…Œ์ด๋ธ” + DLQ ์ฒ˜๋ฆฌ โœ… ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ํ™•๋ณด
์ฃผ๋ฌธ ๋กค๋ฐฑ ๋ถˆ๊ฐ€ ๊ฒฐ์ œ ์‹คํŒจ ์‹œ ์žฌ๊ณ ๊ฐ€ ๋ณต๊ตฌ ์•ˆ๋จ SAGA ํŒจํ„ด + ๋ณด์ƒ ์ด๋ฒคํŠธ ๋„์ž… โœ… ์ „์ฒด ํ๋ฆ„ ๋ณต์›๋ ฅ ๊ฐ•ํ™”

๐Ÿ”— ๐Ÿ“„ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ์ƒ์„ธ ๋ณด๊ธฐ

(back to top)


๐Ÿง  ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •

๐Ÿ“ฆ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์ผ๊ด€์„ฑ

  • PostgreSQL โ†’ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ๊ณผ ๋™์‹œ์„ฑ ์ œ์–ด์— ๊ฐ•ํ•จ
  • ID ๊ฐ„์ ‘ ์ฐธ์กฐ โ†’ ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„, ๋†’์€ ์œ ์—ฐ์„ฑ ํ™•๋ณด
  • Outbox ํŒจํ„ด โ†’ DB ํŠธ๋žœ์žญ์…˜๊ณผ Kafka ์ด๋ฒคํŠธ์˜ ์ •ํ•ฉ์„ฑ ๋ณด์žฅ

๐Ÿ”— ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ๊ตฌ์กฐ

  • Feign Client โ†’ ์ง๊ด€์ ์ด๋ฉฐ Spring Cloud์™€ ํ†ตํ•ฉ ์šฉ์ด
  • Kafka ๋ฉ”์‹œ์ง• โ†’ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐ ์žฅ์•  ๊ฒฉ๋ฆฌ์— ์œ ๋ฆฌ

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™” / ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

  • Redis โ†’ ๋น ๋ฅธ ์‘๋‹ต์„ฑ๊ณผ ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ํ™•๋ณด
  • Batch Insert โ†’ ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ I/O ์ตœ์†Œํ™”
  • CompletableFuture โ†’ ์™ธ๋ถ€ ์„œ๋น„์Šค ๋ณ‘๋ชฉ ์ œ๊ฑฐ

๐Ÿ›ก ์žฅ์•  ๋Œ€์‘ ๋ฐ ํšŒ๋ณต ํƒ„๋ ฅ์„ฑ

  • Circuit Breaker โ†’ ์™ธ๋ถ€ ๊ฒฐ์ œ API ์žฅ์•  ์ „ํŒŒ ๋ฐฉ์ง€
  • Redis Sentinel + Docker โ†’ ์ž๋™ Failover ๊ตฌ์„ฑ์œผ๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ ํ™•๋ณด

โœ… ๊ธฐ์ˆ  ์˜์‚ฌ๊ฒฐ์ • ์ƒ์„ธ ๋ณด๊ธฐ

(back to top)


๊ธฐ์—ฌ

ํ˜น์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ์„ ์‚ฌํ•ญ์„ ๋ฐœ๊ฒฌํ•˜์…จ์„ ๊ฒฝ์šฐ, ๊ธฐ์—ฌํ•ด์ฃผ์‹œ๋ฉด ์ •๋ง ๊ฐ์‚ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/branch_name)
  3. Commit your Changes (git commit -m 'commit!')
  4. Push to the Branch (git push origin feature/branch_name)
  5. Open a Pull Request

(back to top)


์—ฐ๋ฝ์ฒ˜

Email - zimbote0411@gmail.com

Project Link: https://github.com/Jyoungjo/hanghae99_pre-order

(back to top)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages