[Redis] Spring boot ์—์„œ Redis๋กœ ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ

Cache๋ž€?

๋‚˜์ค‘์— ํ•  ์š”์ฒญ ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅ ํ•ด ๋‘์—ˆ๋‹ค๊ฐ€ ๋น ๋ฅด๊ฒŒ ์„œ๋น„์Šค ํ•ด ์ฃผ๋Š” ๊ฒƒ

  • Look aside Cache(์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์“ฐ๋Š” ๋ฐฉ์‹)
    • DB๋ฅผ ๊ฐ€๊ธฐ ์ „์— Cache์— ๋จผ์ € ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ํ•ด๋ณธ๋‹ค.
    • ๋งŒ์•ฝ Cache์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ , ์—†๋‹ค๋ฉด DB๋ฅผ ์ฝ์€ ํ›„ Cache์— ์ €์žฅ & ๊ฒฐ๊ณผ ๋ฆฌํ„ด
  • Write Back(๋กœ๊ทธ๋ฅผ DB์— ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ, ์“ฐ๊ธฐ ์—ฐ์‚ฐ์ด ๋งŽ์€ ๊ฒฝ์šฐ)
    • ์บ์‹œ์— ๋จผ์ € ์ €์žฅํ–ˆ๋‹ค๊ฐ€, ํŠน์ • ์‹œ์ ๋งˆ๋‹ค DB์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹
    • ex. ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„(๋ฐฐ์น˜ ์ž‘์—…) - DB insert ์ฟผ๋ฆฌ๋ฅผ 1๋ฒˆ์”ฉ * 500๋ฒˆ >> insert์ฟผ๋ฆฌ 500๊ฐœ ํ•ฉ์นœ ๊ฒƒ * 1๋ฒˆ
    • ๋‹จ์ : ์žฅ์• ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์งˆ ์œ„ํ—˜์ด ์žˆ๋‹ค. ์™œ๋ƒ๋ฉด ๋ฆฌ๋ถ€ํŒ… ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ

 

์บ์‹œ๊ฐ€ ๋˜๋Š” ๋Œ€์ƒ๋“ค

- ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ์˜ ์ •๋ณด 

- ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ์ •๋ณด 

- ์ •๋ณด์˜ ๋ณ€๊ฒฝ์ฃผ๊ธฐ๊ฐ€ ๋นˆ๋ฒˆํ•˜์ง€ ์•Š๊ณ , ๋‹จ์œ„์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ์ •๋ณด 

- ์ •๋ณด์˜ ์ตœ์‹ ํ™”๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ด๋ค„์ง€์ง€์•Š์•„๋„ ์„œ๋น„์Šค์— ์˜ํ–ฅ์ด ์ ์€ ์ •๋ณด

 

 

์บ์‹ฑ ์ „๋žต (Caching Strategies)

๋ณดํ†ต ๋ ˆ๋””์Šค๋ฅผ cache๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋ ˆ๋””์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•˜๋ƒ์— ๋”ฐ๋ผ ์‹œ์Šคํ…œ ์ „์ฒด ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค. ๊ทธ๋ž˜์„œ ๋ ˆ๋””์Šค๋ฅผ ์–ด๋””์— ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜ํ•  ์ง€์— ๋Œ€ํ•œ ์ „๋žต์„ ์„ธ์›Œ์•ผ ํ•˜๋Š”๋ฐ ์ด๋ฅผ, ์บ์‹ฑ ์ „๋žต(Caching Strategies)์ด๋ผ๊ณ  ํ•œ๋‹ค.

์บ์‹ฑ ์ „๋žต์€ ๋ฐ์ดํ„ฐ์˜ ์œ ํ˜•๊ณผ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํŒจํ„ด์„ ์ž˜ ๊ณ ๋ คํ•ด์„œ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค. ํฌ๊ฒŒ ์ฝ๊ธฐ ์ „๋žต๊ณผ ์“ฐ๊ธฐ ์ „๋žต์œผ๋กœ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

 

๋จผ์ € ์ฝ๊ธฐ ์ „๋žต๋ถ€ํ„ฐ ์•Œ์•„๋ณด์ž.

 

์ฝ๊ธฐ ์ „๋žต (Read Strategies)

 

Look-aside (Lazy Loading) ์ „๋žต : ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ์ž‘์—…์ด ๋งŽ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ „๋žต์ด๋ฉฐ, ๋ ˆ๋””์Šค๋ฅผ ์บ์‹œ๋กœ ์“ธ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.

 

๋จผ์ € ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„๋•Œ, ์บ์‹œ๋ฅผ ํ™•์ธํ•˜์—ฌ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜จ๋‹ค. ๋งŒ์•ฝ ๋ ˆ๋””์Šค์— ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด DB์— ์ ‘๊ทผํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์™€ ๋ ˆ๋””์Šค์— ์ €์žฅํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ์บ์‹œ์—๋Š” ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ง€์—ฐ๋กœ๋”ฉ(Lazy Loading)์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ๋ ˆ๋””์Šค ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์‹œ์Šคํ…œ์ด ๋‹ค์šด๋˜์ง€ ์•Š๊ณ , DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๋Œ€์‹  ์บ์‹œ๋กœ ๋ถ™์–ด์žˆ๋˜ ์ปค๋„ฅ์…˜์ด ๋งŽ์ด ์žˆ์—ˆ๋‹ค๋ฉด ๊ทธ ์ปค๋„ฅ์…˜์ด ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ถ™๊ธฐ ๋•Œ๋ฌธ์— DB์— ๋งŽ์€ ํŠธ๋ž˜ํ”ฝ์ด ํ•œ๊บผ๋ฒˆ์— ๋ชฐ๋ฆด ์ˆ˜ ์žˆ๋‹ค. 

 

Look-aside ์˜ ๋ฌธ์ œ์ ์€ CUD'์—ฐ์‚ฐ์„ ํ•˜๋Š” ๊ฒฝ์šฐ, DB์™€ Cache data ์‚ฌ์ด์˜ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. DB์—๋Š” ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ Cache Data์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. 

์ด ๋ฌธ์ œ๋Š” ์บ์‹œ์›Œ๋ฐ(Cache Warming)์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์บ์‹œ์›Œ๋ฐ(Cache Warming) ์ด๋ž€?

๋ฏธ๋ฆฌ cache๋กœ db์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ€์–ด ๋„ฃ์–ด๋‘๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ๋น„์Šค ์ดˆ๊ธฐ์— ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์‹œ ๋Œ€๋Ÿ‰์˜ cache miss ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜๊ฐ€ ๊ธ‰์ฆ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

์“ฐ๊ธฐ ์ „๋žต (Write Strategies)

 

์“ฐ๊ธฐ ์ „๋žต์—๋Š” 2๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

 

Write-around : DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  Cache miss๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•œ๋‹ค. ์ด ๊ฒฝ์šฐ์—” cache ๋‚ด์˜ ๋ฐ์ดํ„ฐ์™€ DB ๋‚ด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. 

์™œ๋ƒํ•˜๋ฉด, ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ• ๋•Œ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ , ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋Š” ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ ์บ์‹ฑ์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. 

 

Write-through : DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ cache์—๋„ ํ•จ๊ป˜ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. cache๋Š” ํ•ญ์ƒ ์ตœ์‹  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ๋‹จ๊ณ„(DB์— ์ €์žฅ, ์บ์‹œ์— ์ €์žฅ) ๊ฑฐ์ณ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋Œ€์ ์œผ๋กœ ๋Š๋ฆฌ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋„ ๋ฌด์กฐ๊ฑด ์บ์‹œ์— ๋„ฃ์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ข…์˜ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋ฅผ ์ดˆ๋ž˜ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š” Expire time์„ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

Redis๋ฅผ ์„ ํƒํ•œ ์ด์œ 

1. ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๋‹ค.

  • ๋‹จ์ˆœํ•œ key-value ๊ตฌ์กฐ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ง€์›

2. ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์คŒ. 

  • ํ‰๊ท  ์ž‘์—…์†๋„ < 1 ms
  • ์ดˆ๋‹น ์ˆ˜๋ฐฑ๋งŒ ๊ฑด์˜ ์ž‘์—… ๊ฐ€๋Šฅ ⇒ ์ง€์—ฐ์‹œ๊ฐ„ ๊ฐ์†Œ, ์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ๊ฐ€

3. ๋ ˆํผ๋Ÿฐ์Šค ์ž๋ฃŒ๊ฐ€ ๋งŽ์Œ.

  • Spring Cache, Caffeine ๋“ฑ ๋‹ค๋ฅธ ์บ์‹ฑ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ Redis ๊ด€๋ จ ์ž๋ฃŒ๊ฐ€ ์••๋„์ ์œผ๋กœ ๋งŽ์Œ

4. ์›๊ฒฉ ์บ์‹œ

  • ์—ฌ๋Ÿฌ ๋…ธ๋“œ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด ์ผ๊ด€๋œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ์ข‹์Œ

 

Redis ์บ์‹œ ํ™œ์„ฑํ™”๋ฅผ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜

  • @EnableCaching
    • SpringBoot์—๊ฒŒ ์บ์‹ฑ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ „๋‹ฌ
    • SpringBoot Starter class์— ์ ์šฉ
  • @Cacheable
    • DB์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  Cache์— ์ €์žฅํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
    • DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์— ์ ์šฉ
  • @CachePut
    • DB์˜ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์„ ๋•Œ Redis Cache์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ
    • DB์—์„œ PUT/PATCH์™€ ๊ฐ™์€ ์—…๋ฐ์ดํŠธ์—์„œ ์‚ฌ์šฉ
  • @CacheEvict
    • DB์˜ ๋ฐ์ดํ„ฐ ์‚ญ์ œ๊ฐ€ ์žˆ์„ ๋•Œ Redis Cache์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ
    • DB์—์„œ DELETE์™€ ๊ฐ™์€ ์‚ญ์ œ์—์„œ ์‚ฌ์šฉ

 

์ด์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์ž. 

๋ณธ ์˜ˆ์‹œ๋Š” Redis๊ฐ€ ์„ค์น˜๋œ ํ™˜๊ฒฝ์„ ๊ฐ€์ •ํ•˜์—ฌ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค๋ฅธ ๋กœ์ง์˜ ์บ์‹ฑ์ฒ˜๋ฆฌ๋„ ์ง„ํ–‰ํ• ๊ฑฐ์ง€๋งŒ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๊ณ ์‹ถ์—ˆ๋˜ ๋ถ€๋ถ„์ด ์žˆ๋‹ค. 

๋ฐ”๋กœ ์ด ๋ถ€๋ถ„์ด๋‹ค. 

 

token์„ ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์š”์ฒญ์ด ์˜ค๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ jwt filter๋ฅผ ํƒ€๊ฒŒ๋˜๋Š”๋ฐ ์ด๋•Œ member ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค PrincipalDetails๋ฅผ ๋งŒ๋“ค์–ด SecurityContextHolder์— ๋„ฃ์–ด์ค€๋‹ค. 

 

ํ”„๋กœ์ ํŠธ ํŠน์„ฑ์ƒ 90% ์ด์ƒ์˜ api๊ฐ€ ํ—ค๋”์— token์„ ํ•„์š”๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์ด์งˆ ์‹œ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๊ฝค๋‚˜ ์ด๋ค„์งˆ ๊ฒƒ์œผ๋กœ ์ง์ž‘๋œ๋‹ค. 

 

 

 

์‚ฌ์šฉ๋ฒ•์€ ์ •๋ง ๊ฐ„๋‹จํ•˜๋‹ค.

 

๋จผ์ € RedisConfig ํŒŒ์ผ์— cacheManager๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์ž. 

// ์บ์‹ฑ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋นˆ ๋“ฑ๋ก
@Bean
public CacheManager authCacheManager(RedisConnectionFactory cf) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
            .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
            .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())) // Value Serializer ๋ณ€๊ฒฝ
            .entryTtl(Duration.ofMinutes(30L)); // ์บ์‹œ ์ˆ˜๋ช… 30๋ถ„

    return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(cf).cacheDefaults(redisCacheConfiguration).build();
}

 

entryTtl ๋ถ€๋ถ„์— ์บ์‹œ๋ฅผ ์–ผ๋งˆ๋™์•ˆ ๊ฐ–๊ณ  ์žˆ์„ ๊ฒƒ์ธ์ง€ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์šฐ์„ ์€ 30๋ถ„์œผ๋กœ ์žก์•„๋‘๊ณ  ์ง„ํ–‰ํ–ˆ๋‹ค. 

๋˜ @EnableCaching์„ ๋“ฑ๋กํ•ด์ค˜์•ผ Cache๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‚˜๋Š” RedisConfig์— ๋“ฑ๋กํ•ด์ฃผ์—ˆ๋‹ค.

 

 

loadUserByUsername ๋ฉ”์†Œ๋“œ ์œ„์— @Cacheable ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ์šฉํ•ด์ค€๋‹ค.

cacheManager๋Š” RedisConfig์—์„œ ๋“ฑ๋กํ–ˆ๋˜ ๋นˆ ์ด๋ฆ„์ด๋‹ค. 

cacheNames๋ฅผ loginMember๋กœ ์žก์•˜๊ณ  key๋ฅผ phone์œผ๋กœ ์žก์•˜๊ธฐ ๋•Œ๋ฌธ์— phone์˜ ๊ฐ’์ด 01012345678 ์ด์—ˆ๋‹ค๋ฉด redis์—” loginMember::01012345678 ๋กœ key๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. 

๋‚˜์ค‘์— redis-cli ์—์„œ ํ™•์ธํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.

@Override
@Cacheable(cacheNames = "loginMember", key = "#phone", condition = "#phone != null", cacheManager = "authCacheManager")
public PrincipalDetails loadUserByUsername(String phone) throws UsernameNotFoundException {
    log.info("loadUserByUsername ์‹คํ–‰");
    Member findMember = memberRepository.findByPhone(phone)
            .orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
    MemberDto memberDto = MemberDto.builder()
            .id(findMember.getId())
            .role(findMember.getRole())
            .build();
    return new PrincipalDetails(memberDto);
}

 

 

Redis ์บ์‹œ๋ฅผ ์ ์šฉํ•˜๊ณ  ์ฒ˜์Œ token ์กฐํšŒ๊ฐ€ ํฌํ•จ๋˜๋Š” api ์š”์ฒญ์„ ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด member ์กฐํšŒ ๋กœ์ง์ด ๋‚˜๊ฐ„๋‹ค. ์ฆ‰, redis์— ์บ์‹ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ cache miss๊ฐ€ ์ผ์–ด๋‚œ ๊ฒƒ์ด๋‹ค. ๋™์‹œ์— redis์— ๋“ฑ๋กํ•ด์ค€๋‹ค. 

 

 

์กฐ๊ธˆ ์ „์— ๋กœ๊ทธ์ธํ•œ ์œ ์ €๋กœ ์ธ์ฆ์ด ํ•„์š”๋กœํ•˜๋Š” api ์š”์ฒญ์„ ํ•ด๋ณด๋ฉด? ๋ณ„๋„์˜ ์ฟผ๋ฆฌ ์—†์ด ์ธ์ฆ์„ ์™„๋ฃŒํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

 

redis์—” ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜์–ด ์žˆ์„๊นŒ?

{cacheNames::key} ๊ฐ’ ํ˜•ํƒœ๋กœ ์ž˜ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. 

 

get ์œผ๋กœ ์กฐํšŒํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž˜ ์ €์žฅ๋˜์–ด ์žˆ๋Š”๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ ์ ์ด ์ƒ๊ฒผ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ ๋งŽ์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ํ˜„์žฌ ๋กœ๊ทธ์ธํ•œ memberId๋ฅผ ๋ฐ›์•„์™€ member๋ฅผ ์กฐํšŒํ•˜๊ณ ์žˆ๋‹ค. 

 

์ด ๋ถ€๋ถ„๋„ member ์กฐํšŒ ๋กœ์ง๋„ Redis๋กœ ์บ์‹ฑ์ฒ˜๋ฆฌ ํ•˜๋ฉด ์•ˆ ๋˜๋‚˜.. ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ Redis๋กœ member๋ฅผ ์กฐํšŒ ์‹œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์•ˆ์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. 

๋˜ ์•„๋ž˜ ์‚ฌ์ง„ ์ฒ˜๋Ÿผ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์™ธ๋ถ€ ์บ์‹œ์— ์ €์žฅํ•˜๋ฉด ์ ˆ๋Œ€!! ์•ˆ๋œ๋‹ค๊ณ  ํ•œ๋‹ค..!

 

 

 

 

 

๋ฒˆ์™ธ

๋ฒˆ์™ธ๋กœ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค๊ณผ ์–˜๊ธฐํ•˜๋‹ค ์˜๋ฌธ์ธ ์ ์ด ์ƒ๊ฒผ๋‹ค.

JWT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ,์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ jwt filter์—์„œ loadUserByUsername ๊ฐ™์€ ํšŒ์› ์ฟผ๋ฆฌ๋ฅผ  ๋‚ ๋ ค ํ™•์ธํ•ด์•ผ ํ•˜๋Š”๊ฐ€?? ํ•„์š” ์—†๋Š”๊ฐ€?? ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. 

 

๋‚˜๋Š” ๋กœ๊ทธ์ธ์ด ๋˜์–ด ํ† ํฐ์„ ์ด๋ฏธ ๋ฐœ๊ธ‰ํ•œ ์ƒํ™ฉ์ด๋”๋ผ๋„ ์ด๋ฏธ ํšŒ์›์ด ํƒˆํ‡ดํ–ˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ DB์— ์žˆ๋Š” ํšŒ์›์— ๋Œ€ํ•œ ํ† ํฐ์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ๋กœ์ง์€ ํ•„์š”ํ•˜๋‹ค ์ƒ๊ฐํ•˜๋Š”๋ฐ.. 

 

์กฐ๊ธˆ ๋” ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค. 

 

 

์ฐธ๊ณ : https://www.youtube.com/watch?v=92NizoBL4uA