๐Ÿ‘จโ€๐Ÿ’ป ์•„ํ‚คํ…์ณ

image.png

๐Ÿ›  ์‚ฌ์šฉ ๊ธฐ์ˆ 

<aside> <img src="/icons/hammer_gray.svg" alt="/icons/hammer_gray.svg" width="40px" /> Java โ€ข Spring Boot โ€ข MySQL โ€ข Docker (Compose) โ€ข Spring Data JPA โ€ข Spring Security โ€ข Redis โ€ข Spring Cloud

</aside>

๐Ÿ’ฃ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

<aside> <img src="/icons/report_orange.svg" alt="/icons/report_orange.svg" width="40px" /> ์„ ์ฐฉ์ˆœ ๊ตฌ๋งค ์‹œ ์žฌ๊ณ  ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ

</aside>

์ฒ˜์Œ์—๋Š” Redis์˜ Redisson์„ ์‚ฌ์šฉํ•œ ๋ถ„์‚ฐ ๋ฝ์„ ํ†ตํ•ด ์„ ์ฐฉ์ˆœ ๊ตฌ๋งค ์‹œ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 10๊ฐœ์˜ ์žฌ๊ณ ๋ฅผ ๋Œ€์ƒ์œผ๋กœ 10,000๋ช…์˜ ๊ฐ€์ƒ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งค๋ฅผ ์‹œ๋„ํ–ˆ์„ ๋•Œ, ์žฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Redis์—์„œ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ Transactionalํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถ€์กฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— Pessimistic Lock์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. MySQL์ด ๊ธฐ๋ณธ์ ์œผ๋กœ Optimistic Lock์„ ์ง€์›ํ•˜์ง€๋งŒ, ์žฌ๊ณ  ๋ฐ ์ •์‚ฐ ๊ฐ™์€ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋น„๊ด€์  ๋ฝ์„ ํ†ตํ•ด ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ ๋™์‹œ ์ ‘๊ทผ์„ ์—„๊ฒฉํ•˜๊ฒŒ ํ†ต์ œํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์†์‹ค ๋ฐ ๋ฌด๊ฒฐ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Pessimistic Lock์„ ์ ์šฉํ•œ ํ›„, JMeter๋ฅผ ์‚ฌ์šฉํ•ด 10๊ฐœ์˜ ์žฌ๊ณ ๋ฅผ ๊ฐ€์ง„ ์ƒํ’ˆ์— ๋Œ€ํ•ด 10,000๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งค๋ฅผ ์‹œ๋„ํ•˜๋Š” ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, 10๊ฐœ์˜ ๊ตฌ๋งค ์„ฑ๊ณต๊ณผ 9,990๊ฐœ์˜ ๊ตฌ๋งค ์‹คํŒจ๊ฐ€ ๊ธฐ๋ก๋˜์—ˆ์œผ๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์žฌ๊ณ  ์ •ํ•ฉ์„ฑ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๊ณผ: ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์žฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ํ™•๋ณดํ•˜์—ฌ, ์•ˆ์ •์ ์ธ ์„ ์ฐฉ์ˆœ ๊ตฌ๋งค ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์š”ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ๋ฐ์ดํ„ฐ ์†์‹ค ์—†์ด ์ •ํ™•ํ•œ ์žฌ๊ณ  ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

<aside> <img src="/icons/report_orange.svg" alt="/icons/report_orange.svg" width="40px" /> MSA ๋ถ„๋ฆฌ ์‹œ ์ˆœํ™˜ ์ฐธ์กฐ์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

</aside>

Monolithic Architecture์—์„œ Microservices๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ, ๋กœ๊ทธ์ธ ํ›„ Spring Security๋ฅผ ํ†ตํ•œ JWT ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค์—์„œ JWT ๊ฐ’์˜ ์œ ํšจ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค:

  1. JWT ์ธ๊ฐ€ ์ฒ˜๋ฆฌ: JWT์˜ ์œ ํšจ์„ฑ ๊ฒ€์ฆ์€ Gateway๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. USER-SERVICE์—์„œ JWT๋ฅผ ์ƒ์„ฑํ•œ ํ›„, ์ด๋ฅผ HttpRequest๋ฅผ ํ†ตํ•ด ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ํ—ค๋” ๋ถ„๋ฆฌ ๋ฐฉ์‹: ORDER-SERVICE์™€ ๊ฐ™์€ ์‚ฌ์šฉ์ž ์ธ์ฆ์ด ํ•„์š”ํ•œ ์„œ๋น„์Šค์—์„œ๋Š” ์ „๋‹ฌ๋œ HttpRequest์˜ ํ—ค๋”๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ํŒ๋ณ„ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด JWT๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ๊ฐ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

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

๐ŸŽ† ๊ฒฐ๊ณผ / ์„ฑ๊ณผ

<aside> <img src="/icons/cursor-click_gray.svg" alt="/icons/cursor-click_gray.svg" width="40px" /> Redis Caching์„ ์ด์šฉํ•œ ์žฌ๊ณ  ๋ฐ์ดํ„ฐ ์ ‘๊ทผ

</aside>

PRODUCT-SERVICE์— Redis ์บ์‹œ๋ฅผ ์ ์šฉํ•˜์—ฌ ์ƒํ’ˆ ๋“ฑ๋ก ์‹œ productId๋ฅผ key๋กœ ํ•˜์—ฌ ํ•ด๋‹น ์ƒํ’ˆ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์บ์‹ฑํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ์ƒํ’ˆ ์กฐํšŒ ์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ์บ์‹ฑ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์ด ๋Œ€ํญ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๊ณผ : 10,000๊ฐœ์˜ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ, ํ‰๊ท  ์กฐํšŒ ์‹œ๊ฐ„์ด 301ms์—์„œ 1ms๋กœ ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ 99.66% ์ด์ƒ ๊ฐœ์„ ๋˜์–ด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

<aside> <img src="/icons/cursor-click_gray.svg" alt="/icons/cursor-click_gray.svg" width="40px" /> Spring Security๋ฅผ ์‚ฌ์šฉํ•œ JWT ํ† ํฐ ์ƒ์„ฑ ๋กœ๊ทธ์ธ ๋กœ๊ทธ์•„์›ƒ

</aside>