ํํ๋จผํธ ์ ๊ณ ์๋น์คํ์์ ๋ถ์ฐ๋ฝ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ - Spring Redisson
์ด๋ ธํ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ๋ถ์ฐ๋ฝ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํฉ๋๋ค.
helloworld.kurly.com
1. RMS(Receiving Management System - ์ ๊ณ ๊ด๋ฆฌ ์์คํ ) ์ ๋์์ฑ ๋ฌธ์
- ์นดํ์นด๋ก ๋์์ ๋ค์ด์ค๋ ์ค๋ณต๋ ๋ฐ์ฃผ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ
- ๊ฒ์/๊ฒํ ์ด์ ๋ฑ๋ก ์ ๋๋ธ ํด๋ฆญ, ๋คํธ์ํฌ ์ด์๋ก ์ธํด ์ค๋ณต๋ ์์ฒญ์ด ๋์์ ๋ค์ด์ค๋ ๊ฒฝ์ฐ
- ์ด๋ ์ถ๊ณ ์ ์ฌ๋ฌ ์์ ์๊ฐ CTA๋ฅผ ๋์์ ํด๋ฆญํ์ฌ ์๋ชป๋ ์ฌ๊ณ ํธ๋์ญ์ ์ด ์์ฑ๋๋ ๊ฒฝ์ฐ
2. Redisson library ๋ฅผ ์ ์ ํ ์ด์
(1) Redisson Library ์ ์ฅ์
- Pub/Sub ๋ฐฉ์์ ์ด์ฉํด ๋ฝ์ด ํด์ ๋ ๊ฒฝ์ฐ ๋ฝ์ subscribe ํ์ฌ ๋ฝ ํ๋์ ์๋ํ์ฌ Redis ์ ๋ถํ๋ฅผ ์ค์ผ ์ ์๋ค.
- Lock interface ๋ฅผ ์ง์ํด retry, timeout ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
(2) Lettuce ์ ์ด์ฉํ ๋ถ์ฐ๋ฝ ๊ตฌํ์ ๋จ์
- ๋ถ์ฐ๋ฝ์ ์ง์ ๊ตฌํํด์ผ ํ๋ค.
- setnx, setex ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ์คํ๋ฝ ๋ฐฉ์์ด๋ฏ๋ก ์ง์์ ์ผ๋ก Redis ์๊ฒ ๋ฝ ํด์ ์ฌ๋ถ๋ฅผ ๋ฌผ์ด๋ด Redis ๋ถํ๊ฐ ์ปค์ง๋ค.
3. ๋ถ์ฐ ๋ฝ์ ์์ฝ๊ฒ ์ฌ์ฉํ๊ณ ์ ํ ๋ ธ๋ ฅ
- ๋น์ฆ๋์ค ๋ก์ง์ด ์ค์ผ๋์ง ์๊ฒ ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๋ค.
- waitTime, leaseTime ์ ์ปค์คํ ํ๊ฒ ์ง์ ํ๊ณ ์ถ๋ค.
- ๋ฝ ์ด๋ฆ(lock name) ์ ์ฌ์ฉ์๋ก ๋ถํฐ ์ปค์คํ ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค.
- ์ถ๊ฐ ์๊ตฌ์ฌํญ์ ๋ํด ๊ณตํต์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ถ๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Spring AOP ๋ฅผ ์ด์ฉํ ๋ถ์ฐ๋ฝ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ๋ก ํจ.
4. ์ปดํฌ๋ํธ ์ ๋ฆฌ
1. DistributedLockAop : @DistributedLock annotation ์ ๋งคํํ์ฌ ๋ถ์ฐ๋ฝ์ ์ค์ , ํด์ ํ๋ Aspect ํด๋์ค

2. CustomSpringELParser : SpelExpressionParser ๋ฅผ ์ด์ฉํด ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ฐ์ ธ์ key ๊ฐ์ spel ํ์์ ๋งคํํ์ฌ ๊ฐ์ ๋ฐํํ๋ ์ ํธ ํด๋์ค

3. AopForTransaction : Tx commit ์ดํ์ Lock ์ ํด์ ํ๊ธฐ ์ํ ์ปดํฌ๋ํธ

5. ๋ด์ฉ ์ ๋ฆฌ
- ๋ถ์ฐ ๋ฝ(Lock) ์ ๋ฝ์ ๋ํ ์ ๋ณด๋ฅผ ๊ณตํต์ ์ผ๋ก ๋ณด๊ดํ๋ ์์ญ์ ๋ณด๊ดํ์ฌ ์๊ณ ์์ญ์ ์ ๊ทผ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ.
- ๋ถ์ฐ๋ฝ์ ํด์ ํ ๋ ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ(Data Integrity) ์ ์ํด Tx commit ์ดํ ์์ ์ ๋ฝ์ ํด์ ํ๋ผ.

6. Sample Code
'๐ backend > spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋น๊ด์ ๋ฝ vs ๋๊ด์ ๋ฝ(In JPA) (0) | 2024.11.28 |
|---|---|
| MessageSourceAutoConfiguration ์ฝ๋ ๊ฒํ ํ๊ธฐ (0) | 2024.11.28 |
| Spring Batch ๊ธฐ๋ฐ ํ์ ์ญ์ ๋ฐฐ์น ์ฝ์ง ๊ธฐ๋ก (0) | 2024.09.03 |
| [Spring Batch] Job ์คํ ํ๋กํผํฐ, JobParameter, Scope (0) | 2024.08.26 |
| Spring Batch Architecture (0) | 2024.05.10 |