Record/ํ๊ณ ๋ก
24์๊ฐ ์๋ ์ง๊ธ ํ๊ณ ๋ก
seung_soos
2025. 1. 16. 21:03
๐ก ํ๋ก์ ํธ ๊ฐ์
๐ฏ ๋ชฉ์
- ์ง๊ธ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ์ฌ ์ ๋ฌด ํจ์จ์ฑ๊ณผ ์ ํ์ฑ์ ๋์์ ํฅ์
โ ๋ฌ์ฑํ ๋ชฉํ
๐ 24์๊ฐ ๋ฌด์ค๋จ ์ง๊ธ ํ๋ก์ธ์ค ๊ตฌ์ถ
- ์ค์ผ์ค๋ง ๊ธฐ๋ฐ์ผ๋ก ์์ ์ ์ด๊ณ ์ง์ ๊ฐ๋ฅํ ์๋ ์ง๊ธ ์์คํ ์ด์
๐ง ๊ธฐ์กด ๋ก์ง ๋ถ์ ๋ฐ ๊ตฌ์กฐ ๊ฐ์
- ๊ธฐ์กด v1 ์ง๊ธ ๋ก์ง์ ์ ๋ฉด ๋ถ์ํ์ฌ ์ง๊ธ ํ๋ฆ์ ์๋กญ๊ฒ ์ค๊ณ
- ์๊ธฐ ์ง๊ธ ์ ์ ๋ฌ์ ์ ์ฐ ๊ณ์ข ๋ฐ ์ ์ฉ ์ํ๋ฅผ ์ฌ๋์ด ์ง์ ๊ฒํ ํ๋ ๊ตฌ์กฐ๋ฅผ ์์คํ ์ด ์๋ ๊ฒ์ฆํ๋๋ก ๊ฐ์
- ์ด๋ก ์ธํด CXํ ๋ฆฌ์์ค ์์๊ฐ ์ฝ 50~70% ๊ฐ์ํ๋ ํจ๊ณผ ์ฒด๊ฐ
๐จ ๋ ๊ฑฐ์ ๊ตฌ์กฐ ํตํฉ
- ์ง๊ธ ํ๋ก์ธ์ค๊ฐ PHP, Node.js, Java์ ๋ถ์ฐ๋์ด ์๋ ๊ตฌ์กฐ๋ฅผ Java ๋จ์ผ ์๋ฒ๋ก ํตํฉ
- ๊ธฐ์กด์๋ Transaction ์ฒ๋ฆฌ๊ฐ ์์ด ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ฌธ์ ๊ฐ ์์์ง๋ง, ์๊ฒฉํ ํธ๋์ญ์ ์ ์ด๋ก ์์ ์ฑ ํ๋ณด
๐ ์ฑ๋ฅ ๊ฐ์
- ๋๊ธฐ ์ฒ๋ฆฌ → ๋ฉํฐ ์ค๋ ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก ์ ํํ์ฌ ์๋ ๊ฐ์
- ๊ธฐ์กด์๋ ์ ์ฒญ๊ฑด์ด N๊ฐ์ผ ๊ฒฝ์ฐ, ๊ฑด๋น ์ฝ 1๋ถ์ ํฌ๋กค๋ง ์๊ฐ์ด ์์๋์ด ์ ์ฒด ์ฒ๋ฆฌ ์๊ฐ์ด ์ ํ์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ตฌ์กฐ
- CompletableFuture๋ฅผ ํ์ฉํด ๋น๋๊ธฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ก ์ ํ, ๋ค์์ ์ ์ฒญ๊ฑด์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ฐ์
โ ๏ธ ์์ธ ์ํฉ ๋์
- ์ธ๋ถ ์์คํ ์ฐ๋ ์ค ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์์ธ์ ์ฒ ์ ํ ๋์
- PaymentWaitException, PaymentFailureException ๋ฑ์ Custom Exception์ ๋์ ํด ์์ธ ์ํฉ ๋ช ํํ
- ์ง๊ธ ๋จ๊ณ๋ณ STEP์ ๋์ ํด ๋ฌธ์ ์ง์ ์ ์ถ์ ๋ฐ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
๐ ๊ธด๊ธ ์ค๋จ ์ ์ด ๊ธฐ๋ฅ
- ์ง๊ธ ์ค๋จ์ด ํ์ํ ์ํฉ์ ๋๋นํด Redis์ ์ํ๊ฐ์ ์ค์ ํ๊ณ ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๋ก์ธ์ค์ ํ๋ฆ์ ๋์ ์ผ๋ก ์ ์ด
๐ง ์ด๋ ค์๊ณผ ํด๊ฒฐ ๊ณผ์
1. CompletableFuture์ JPA์ ์์์ฑ ๊ด๋ฆฌ
- ๋ฌธ์ :
- JPA์ ์์์ฑ ์ปจํ ์คํธ๋ ThreadLocal ๊ธฐ๋ฐ์ด๊ธฐ ๋๋ฌธ์ CompletableFuture.runAsync() ๋ด์์ EntityManager ์ ๊ทผ ๋ถ๊ฐ
- ์ด๋ก ์ธํด ๋น๋๊ธฐ ๋ก์ง ๋ด์์ JPA ๊ด๋ จ ์์
(save(), findById() ๋ฑ)์ ํธ์ถํ๋ฉด LazyInitializationException
์์ธ๊ฐ ๋ฐ์.
- ํด๊ฒฐ:
- JPA ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ(์กฐํ, ์ ์ฅ ๋ฑ)๋ ํ์ฌ ํธ๋์ญ์ ๋ด์ ๋ฉ์ธ ์ค๋ ๋์์ ๋ชจ๋ ์ฒ๋ฆฌ
- ์ดํ ํฌ๋กค๋ง ์์ ๋ง CompletableFuture๋ก ๋น๋๊ธฐ ๋ถ๋ฆฌ
2. ์ธ๋ถ ์์คํ ์ฐ๋ ์์ธ ์ฒ๋ฆฌ
- ๋ฌธ์ : ๊ฐ ๋จ๊ณ์์ ๋ฐ์ํ๋ ์์ธ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์
- ํด๊ฒฐ:
- Custom Exception์ ์ง๊ธ ๋จ๊ณ ๋ฐ ์์ธ ์ ๋ณด๋ฅผ ํฌํจ
- ์์ธ ๋ฐ์ ์์๋ ์ ์ฐํ๊ฒ ๋กค๋ฐฑ ์ฌ๋ถ ์ค์
(@Transactional(noRollbackFor = { PaymentWaitException.class }) ๋ฑ)
3. ํธ๋์ญ์ ๊ฒฝ๊ณ ๊ด๋ฆฌ
- ๋ฌธ์ : ํธ๋์ญ์ ์ ๋์ ๋ฐฉ์์ ๋ํ ๊ฒฝํ ๋ถ์กฑ์ผ๋ก Rollback ์ฌ๋ถ ํ๋จ์ด ์ด๋ ค์ ์
- ํด๊ฒฐ: ๋ค์ํ ์ํฉ์ ๊ฒช์ผ๋ฉฐ ํธ๋์ญ์ ์ ํน์ฑ๊ณผ ๋์ ์์ ์ ํ์ตํ๊ณ ์ ์ฉ
- ์ฐธ๊ณ ๋งํฌ: https://techblog.woowahan.com/2606/
๐งช ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑ
- ์ธ๋ถ ์ฐ๋์ ์ ์ธํ ๋ด๋ถ ๋ก์ง์ Testcontainer๋ฅผ ํ์ฉํ์ฌ ์ค์ ์ธํ๋ผ์ ์ ์ฌํ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ฑ
- ๋ก์ปฌ์์๋ Redis, DB, ๋ฑ์ ๊ตฌ์ฑ ์์๋ฅผ ํฌํจํ ํตํฉ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ
๊ด๋ จ๊ธฐ์ฌ : https://wowtale.net/2025/01/31/236617/