์ด ํ๋ก์ ํธ๋ ํ๋์ ์จ์ ํ ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์ ํ์ํ ํต์ฌ ๊ธฐ์ ์ ์ง์ค์ ์ผ๋ก ํ์ตํ๊ณ ๊ตฌํํ๊ธฐ ์ํ ํ๋ก์ ํธ์
๋๋ค.
๐ Core Technologies
1. ๋์์ฑ ์ ์ด
2. ์ธ๋ฑ์ฑ
3. ์บ์ฑ
1. ๐ ๋์์ฑ ์ ์ด - ์ผํ๋ชฐ ์กฐํ์ ๋์์ฑ ์ ์ด (Lock ์ ์ฉ)
์ผํ๋ชฐ ์กฐํ์ ์ฆ๊ฐ์์ ๋ฐ์ํ๋ ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํ ๊ณผ์ ์ ๋ํด์ ์ ๋ฆฌํ์ต๋๋ค.
Synchronized -> DB Lock(Pessimistic, Optimistic) -> Redis ๋ถ์ฐ Lock (Lettuce, Redisson) ๋ชจ๋ ์ ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๊ณ ๋น๊ต ๋ถ์ํ ๊ณผ์ ์ ๋ค๋ฃน๋๋ค.
- ๋จ์ผ ํ๋ก์ธ์ค์์๋ ๋์ํ์ง๋ง ๋ฉํฐ ์๋ฒ ํ๊ฒฝ์์๋ ๋ณด์ฅ๋์ง ์์
- ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅํ์ง๋ง, ์ฑ๋ฅ ์ ํ ๋ฐ์ (๋ณ๋ ฌ ์ฒ๋ฆฌ ์ ํ)
๋ฐฉ์ | ํน์ง | ์ฅ์ | ๋จ์ |
---|---|---|---|
๋น๊ด์ ๋ฝ (Pessimistic Lock) | DB ์์ฒด์์ ํธ๋์ญ์
๋ฝ ์ฌ์ฉ (SELECT ... FOR UPDATE ) |
์ถฉ๋ ๋ฐฉ์ง ํจ๊ณผ์ | ๋ฝ์ผ๋ก ์ธํด ์ฑ๋ฅ ์ ํ ๊ฐ๋ฅ |
๋๊ด์ ๋ฝ (Optimistic Lock) | @Version ํ๋ ํ์ฉ (์ถฉ๋ ๋ฐ์ ์ ์ฌ์๋) |
๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ | ์ถฉ๋์ด ์ฆ์ผ๋ฉด ์ฌ์๋ ๋น์ฉ ๋ฐ์ |
๋ฐฉ์ | ํน์ง | ์ฅ์ | ๋จ์ |
---|---|---|---|
Lettuce | SET NX ๋ฐฉ์ |
๊ฐ๋จํ ๊ตฌํ | Spin Lock ๋ฐฉ์์ผ๋ก Redis ๋ถํ ๊ฐ๋ฅ |
Redisson | Pub-Sub ๊ธฐ๋ฐ | ํจ์จ์ ์ธ ๋ฝ ํด์ ๊ฐ์ง | ์ถ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ |
-
Synchronized๋ ์ฑ๋ฅ ์ ํ ๋ฐ ๋จ์ผ ์๋ฒ ํ๊ฒฝ์์๋ง ๋์ํ๋ฏ๋ก ๊ฐ๊ธ์ ์ฌ์ฉ์ ํผํด์ผ ํ๋ค.
-
DB ์๋ฒ๊ฐ ํ ๋๋ผ๋ฉด ๋น๊ด์ ๋ฝ(Pessimistic Lock)์ด ์ ์ ํ์ง๋ง, ๋ฐ๋๋ฝ ๋ฐ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ๋๊ด์ ๋ฝ(Optimistic Lock)์ ์ถ๊ฐ ์ค์ ์ด ๋ง์ ๋ณต์กํ๊ณ , ๋น๋ฒํ ์ถฉ๋์ด ์์๋๋ค๋ฉด ๋น๊ด์ ๋ฝ์ ์ ํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
-
DB ์๋ฒ๊ฐ ์ฌ๋ฌ ๋๋ผ๋ฉด ๋ถ์ฐ ๋ฝ์ด ํ์ํ๋ฉฐ, Redisson์ ํ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ค.
- Lettuce๋ Spin Lock ๋ฐฉ์์ผ๋ก Redis ๋ถํ๊ฐ ์ปค์ง ์ ์์ด ์ฃผ์๊ฐ ํ์ํ๋ค.
๐ ์์ธํ ๊ตฌํ ๊ณผ์ ๊ณผ ์ฝ๋ ์ค๋ช ์ด ๊ถ๊ธํ๋ค๋ฉด?
2. ๐ ์ธ๋ฑ์ฑ - ์ผํ๋ชฐ ๋ถ๋ถ ์ผ์น ๊ฒ์ ์ต์ ํ: ์๋ 7๋ฐฐ ๊ฐ์
๋ฌธ์ ์ : QueryDSL์์
MATCH ... AGAINST
๊ตฌ๋ฌธ์ ์ง์ํ์ง ์๋๋ค.
๊ฐ์ :CustomFunction
+NGRAM
๊ธฐ๋ฐ ์ธ๋ฑ์ค ์ฌ์ฉ
๊ฐ์ ๊ฒฐ๊ณผ : 137 ms -> 20 ms ์ฝ 7๋ฐฐ ์๋ ๊ฐ์
๐ ์กฐ๊ธ ๋ ์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ๋ค๋ฉด?
3. ๐พ ์บ์ฑ - ๐ ์ผํ๋ชฐ ๋ญํน ์ต์ ํ: DB์์ Redis๊น์ง
์ผํ๋ชฐ ์์๋ฅผ ์ค์๊ฐ์ผ๋ก ๋น ๋ฅด๊ฒ ์กฐํํ๊ธฐ ์ํด DB ์กฐํ โ ์บ์ฑ ์ ์ฉ โ Redis ์ต์ ํ๊น์ง ๋จ๊ณ๋ณ ์ ๊ทผ๋ฒ์ ์ ์ฉํ์ต๋๋ค. ์ด ๊ณผ์ ์์ ์กฐํ ์๋, ๋ฐ์ดํฐ ์ ํฉ์ฑ, ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ์ต๋๋ค.
์ผํ๋ชฐ ๋ญํน์ ์กฐํํ๋ API์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ณผ์ ์์ ์บ์ฑ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค๊ณ๊ฐ ์ค์ํ ์ด์ ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค.
- ์ด๊ธฐ ๋ฐฉ์: ๋จ์ํ DB์์ ๋ฐ์ดํฐ๋ฅผ ์กฐํ
- ๋ฌธ์ ์ : ํธ๋ํฝ ์ฆ๊ฐ ์ DB ๋ถํ๊ฐ ์ฌํด์ง๊ณ ์ฑ๋ฅ ์ ํ ๋ฐ์
- ํด๊ฒฐ์ฑ : Spring Cache, Redis๋ฅผ ๋์ ํ์ฌ ์กฐํ ์๋๋ฅผ ๊ฐ์
- ์ต์ ํ: Redis Sorted Set + Hash๋ฅผ ํ์ฉํ์ฌ ์ฑ๋ฅ ํฅ์ & ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ
- DB์์
ORDER BY viewCount DESC LIMIT 100
์ ์ฌ์ฉํด ๋ญํน ์กฐํ - ์ฅ์ : ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ํ ์ ์์
- ๋จ์ : ํธ๋ํฝ ์ฆ๊ฐ ์ DB ๋ถํ ์ฌํ โ ์ฑ๋ฅ ์ ํ ๋ฐ์
- V1-1: Spring Cache (๋ก์ปฌ ์บ์) ์ ์ฉ โ ์๋ ๊ฐ์ , ์๋ฒ ๊ฐ ๋ฐ์ดํฐ ๋ถ์ผ์น ๊ฐ๋ฅ
- V1-2: Redis ์ ์ฉ โ ๋ถ์ฐ ์บ์๋ก ์ฑ๋ฅ ํฅ์. TTL์ ํ์ฉํด ์ต์ ๋ฐ์ดํฐ ์ ์ง
- V1-3:
@Cacheable
&@CachePut
ํ์ฉ โ ์กฐํ์ ์ด๋ทฐ์ง ๋ฐฉ์ง
- ์บ์๋ ๋ฐ์ดํฐ๋ ์ต์ ์ํ๊ฐ ์๋ ๊ฐ๋ฅ์ฑ์ด ์์
- ์กฐํ์๊ฐ ์ฆ๊ฐํ ๋ ๋์์ฑ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ
- ๊ธฐ์กด ๋ฆฌ์คํธ ๊ธฐ๋ฐ ์บ์ฑ์ ๋ฌธ์ : ๋ฐ์ดํฐ ์ฝ์
ยท์ญ์ ์ ์์ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ์ฐ์ฐ ๋น์ฉ ์ฆ๊ฐ
(O(N))
- ํด๊ฒฐ์ฑ
:
Redis Sorted Set(ZSet)
+Hash
์ฌ์ฉ Sorted Set
: ์กฐํ์๋ฅผ ์ ์(score)๋ก ์ ์ฅํ์ฌ ์๋ ์ ๋ ฌHash
: ์ผํ๋ชฐ ์ ๋ณด๋ฅผ Key-Value ํํ๋ก ์ ์ฅํ์ฌ ๋น ๋ฅธ ์กฐํ ๊ฐ๋ฅ- ์กฐํ์ ์ฆ๊ฐ ๋ก์ง ์ต์ ํ โ
incrementScore()
์ฌ์ฉ - ์ ๋ ฌ ๋น์ฉ ๊ฐ์
(O(log N))
- ํธ๋์ญ์
์ ์ฉ (
MULTI/EXEC
):Redis
๊ฐ ์ฑ๊ธ ์ค๋ ๋ ๋ชจ๋ธ์ด๊ธฐ์ ๋ณตํฉ ์ฐ์ฐ์ ํธ๋์ญ์ ์ ํ์ฉํ๋ฉด ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ ๊ฐ๋ฅ
- ๋ฒํฌ ์
๋ฐ์ดํธ (
CASE-WHEN
ํ์ฉ) โ 10๋ถ ๋จ์๋ก DB์ ์ผ๊ด ๋ฐ์
๋ฌธ์ | ํด๊ฒฐ๋ฐฉ๋ฒ |
---|---|
DB ๋ถํ ์ฆ๊ฐ | Redis ์บ์ฑ ๋์
(Spring Cache & Redis ) |
๋ฆฌ์คํธ ๊ธฐ๋ฐ ์ ์ฅ์ ๋นํจ์จ์ฑ | Sorted Set + Hash ์กฐํฉ์ผ๋ก ๊ฐ์ |
์กฐํ์ ์ฆ๊ฐ ์ ๋์์ฑ ๋ฌธ์ | Sorted Set ํ์ฉ ๋ฐ Redis ์์ฒด Atomic ์ฐ์ฐ ํ์ฉ |
์บ์ฑ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ฌธ์ | TTL ์ค์ ๋ฐ 10๋ถ ๋จ์ ๋ฒํฌ ์ ๋ฐ์ดํธ |
๐ ์์ธํ ๊ตฌํ ๊ณผ์ ๊ณผ ์ฝ๋ ์ค๋ช ์ด ๊ถ๊ธํ๋ค๋ฉด?
๐ ํ์ฅ | ํ์ | ํ์ | ํ์ |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
์์๋น | ๊ฐ์ฑ์ฑ | ๊น์ ์ฐ | ์ค์ฃผ์ |