<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 ๊ฐ์ ์ ํจ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ ์ฉํ์ต๋๋ค:
์ฑ๊ณผ: ์ด ์ ๊ทผ ๋ฐฉ์์ ํตํด 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>