JiwonDev

Cache#2 ์บ์‹œ์— ๋Œ€ํ•œ ์ดํ•ด

by JiwonDev

๐Ÿ“Œ Cache

Cache๋Š” ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ, ๋ฐ์ด๋‚˜ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด๋†“๋Š” ์ž„์‹œ ์ €์žฅ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค. ํ•œ๊ธ€๋กœ๋Š” ๊ณ ์†์™„์ถฉ๊ธฐ์–ต๊ธฐ..์ง€๋งŒ ์•„๋ฌด๋„ ๊ทธ๋ ‡๊ฒŒ ์•ˆ๋ถ€๋ฅธ๋‹ค

์„ฑ๋Šฅํ–ฅ์ƒ์„ ์œ„ํ•ด ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑ(์ €์žฅ)ํ•˜์—ฌ ๊ฐ’์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ๋ณดํ†ต ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ์บ์‹ฑ ์—ฌ๋ถ€๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

 

์—ฌ๋Ÿฌ ๋ถ„์•ผ์—์„œ ๋‹ค์–‘ํ•œ ์˜๋ฏธ์˜ Cache๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€๋งŒ,  ์Šคํ”„๋ง์—์„œ ๋งํ•˜๋Š” ์บ์‹œ ์ถ”์ƒํ™”๋Š” Java Method์˜ ๋ฐ˜ํ™˜๊ฐ’ ์บ์‹ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ ์Šคํ”„๋ง์˜ @Cacheable ์–ด๋…ธํ…Œ์ด์…˜์„ ํด๋ž˜์Šค์— ๋‹ฌ๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์— ์บ์‹œ๊ฐ€ ์ ์šฉ๋œ๋‹ค.

 

 

๐Ÿ“Œ Cache ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผํ•  ์ 

1. ์บ์‹œ๋Š” ๋งŒ๋Šฅ์ด ์•„๋‹ˆ๋‹ค.

- ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์€ ์„ฑ๋Šฅ์˜ ํ–ฅ์ƒ๊ณผ ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฐฉ์ง€์ด๋‹ค. ์ž์ฃผ ์กฐํšŒ๋˜๋Š” ๊ณณ์— ์‚ฌ์šฉํ•ด์•ผ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

- ์บ์‹œ๋Š” ๋ฐ˜๋ณต์ ์œผ๋กœ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ฃผ๋Š” ์ƒํ™ฉ์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค. ๋งค๋ฒˆ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๋œ๋‹ค๋ฉด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค

- ์บ์‹œ์˜ ์œ ํšจ์„ฑ/์œ ํšจ์‹œ๊ฐ„(TTL, Time to Live)๋„ ์ž˜ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค. ์บ์‹œ ๋•Œ๋ฌธ์— ์ตœ์‹ ์ด ์•„๋‹Œ ์˜› ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ œ๊ณตํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์บ์‹œ๋ฅผ ์•„๋ฌด๋ฆฌ ๋–ก์น ํ•ด๋ด์•ผ, ์บ์‹œ ์ ์ค‘๋ฅ (Cache Hit Raito)๊ฐ€ ๋‚ฎ๋‹ค๋ฉด ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

 

 

2. Local Cache ์™€ Global Cache 

๋กœ์ปฌ ์บ์‹œ๋Š” ๋ฉ”๋ชจ๋ฆฌ, ์ฆ‰ ๋‚ด๋ถ€ ์ €์žฅ์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ ์„œ๋ฒ„๊ฐ„์˜ ์บ์‹œ ๊ณต์œ ๊ฐ€ ์–ด๋ ต๋‹ค.

๊ธ€๋กœ๋ฒŒ ์บ์‹œ๋Š” ์„œ๋ฒ„ ์™ธ๋ถ€์— ์บ์‹œ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์„œ๋ฒ„๊ฐ„์˜ ์บ์‹œ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‚˜ ๋„คํŠธ์›Œํฌ I/O๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

 

์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•œ ๊ทธ๋ฆผ์ด๋‹ค. ์‹ค์ œ ๋™์ž‘์€ ๊ตฌ์„ฑํ•˜๊ธฐ ๋‚˜๋ฆ„

๋‹จ์ˆœํžˆ '์†๋„'๋งŒ ์ƒ๊ฐํ•œ๋‹ค๋ฉด ๋กœ์ปฌ์บ์‹œ๊ฐ€ ์ข‹์•„๋ณด์ผ ์ˆ˜ ์žˆ์œผ๋‚˜ ๋กœ์ปฌ์บ์‹œ๋Š” Scale-Out ์— ์ทจ์•ฝํ•˜๋‹ค.

- ๋กœ์ปฌ ์žฅ๋น„์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์บ์‹œ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก Was ์ธ์Šคํ„ด์Šค ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ฒŒ ๋œ๋‹ค.

- ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์‚ฐ(Sharding)ํ•˜์—ฌ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค. Scale-Out ์‹œ ์ „์ฒด๋ฅผ ๋ณต์‚ฌ(Replication) ํ•ด์•ผํ•œ๋‹ค.

- ์บ์‹œ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ์กฐํšŒ์—์„œ ์„œ๋ฒ„๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ด๋ฏธ ์บ์‹œ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ, ์ „์ฒด ์„œ๋ฒ„์— ๋ณ€๊ฒฝ์„ ์ „ํŒŒํ•ด์•ผํ•œ๋‹ค.

 

Global Cache๋Š” ๋„คํŠธ์›Œํฌ I/O์— ๋”ฐ๋ฅธ ์ง€์—ฐ์‹œ๊ฐ„์ด ์ƒ๊ธฐ์ง€๋งŒ, ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„๋ฅผ ๊ณ ๋ คํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์ •๋‹ต์€ ์—†๋‹ค. ๋‚ด ์„œ๋ฒ„๊ฐ€ Scale-Outํ•˜์ง€ ์•Š๊ณ , ์ถ”ํ›„ ๋Š˜์–ด๋‚˜๋ด์•ผ 2๊ฐœ ์ •๋„๋ผ๋ฉด๋Œ€๋ผ๋ฉด ๋กœ์ปฌ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํ›จ์”ฌ ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌผ๋ก  ๊ธฐ๋Šฅ์ด๋‚˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์บ์‹œ ๋ฐฉ๋ฒ•์„ ์„ž์–ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์Šคํ”„๋ง์˜ ์บ์‹œ ์ถ”์ƒํ™”๋Š” ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

 

3. ์šด์˜ ์„œ๋ฒ„์— ์บ์‹œ ์ ์šฉ ์‹œ ํ™•์ธํ•ด์•ผํ•  ์ฒดํฌ๋ฆฌ์ŠคํŠธ ( ๊ด€๋ จ ๊ธ€ ๋งํฌ )

  • โ˜€๏ธ ์บ์‹œ ํžˆํŠธ์œจ (Cache hit ratio)๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์ž.
    ์นด๋‚˜๋ฆฌ ๋ฐฐํฌํ•˜์—ฌ ๋จผ์ € hit, miss ํ™•์ธ ํ›„ ์œ ํšจ๊ธฐ๊ฐ„(TTL)์ด๋‚˜ ์บ์‹œ ํฌ๊ธฐ๋“ค์„ ๊ณ ๋ คํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง์œผ๋กœ ์ง์ ‘ ํ™•์ธํ•˜์ž.
    ์˜ˆ๋ฅผ ๋“ค์–ด where in ์ ˆ๋กœ ์กฐํšŒํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ์บ์‹œ ํžˆํŠธ์œจ์ด ์—„์ฒญ ๋‚ฎ์•„ ์บ์‹œ๋ฅผ ๋ถ™์ด๋Š”๊ฒŒ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

    ์ด ๋• ์บ์‹œ์—์„œ ๋จผ์ € ์กฐํšŒํ•œ ํ›„, ์—†๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๋”ฐ๋กœ ์กฐํšŒ/ ์บ์‹œ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ด ์บ์‹œ ์ ์ค‘๋ฅ ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
     
  • โ˜€๏ธ global cache๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์บ์‹œ ๋•Œ๋ฌธ์— ์ž˜๋ชป๋œ ์˜› ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๊ณต๋˜๋Š”๊ฑด ์•„๋‹Œ์ง€ ํ™•์ธํ•˜์ž.

  • โ˜€๏ธ ์„ธ์…˜์ฒ˜๋Ÿผ Scale-Out ๋œ ๋ชจ๋“  ์„œ๋ฒ„๊ฐ€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผํ•˜๋Š”๊ฑด ์•„๋‹Œ์ง€ ํ™•์ธํ•˜์ž
    ๋ฌผ๋ก  global cache๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ์ œ์—†์ง€๋งŒ, ์„œ๋ฒ„ ์‚ฌ์šฉ๋Ÿ‰์ด ์ •๋ง ๋งŽ์€ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.
    ์ •ํ•ฉ์„ฑ์ด ์—„์ฒญ๋‚˜๊ฒŒ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ, local cache์˜ TTL์„ ์งง๊ฒŒํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

    ๋งŒ์•ฝ ์ •ํ•ฉ์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด ์ด๋ฒคํŠธ ๋ฒ„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์›๋ณธ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋–„, ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
    (zookeeper, kafka ๊ฐ™์€ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ์„œ๋ฒ„์—์„œ ์ด๋ฒคํŠธ ๊ตฌ๋… -> local cache ๊ฐฑ์‹ )

  • โ˜€๏ธ ๋ฐ์ดํ„ฐ์— ๋งŒ๋ฃŒ์ผ์‹œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ์บ์‹œ๊นŒ์ง€ ๋ฐ˜์˜๋˜๋Š”์ง€ ์ž˜ ์ฑ™๊ฒจ์•ผํ•œ๋‹ค. ( ex 12์›” 31์ผ 23์‹œ 59๋ถ„๊นŒ์ง€๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ)
    ์˜ˆ๋ฅผ ๋“ค์–ด DB ์ฟผ๋ฆฌ๋กœ endData < '202212312359' ๊นŒ์ง€ ๋™์ž‘ํ•˜๊ฒŒ ํ•ด๋†“๊ณ , ์ดํ›„ ๋ณ€๊ฒฝํ•˜๋Š” ๋กœ์ง์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.
    ์ด ๋•Œ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ๋˜์—ˆ์ง€๋งŒ, ์บ์‹œ๋Š” ๋งŒ๋ฃŒ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์—ฌ์ „ํžˆ ์ด์ „ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์บ์‹œ ๋ฐ์ดํ„ฐ๋„ ํ™•์ธํ•ด์•ผํ•œ๋‹ค.

    ๋ฐ˜๋Œ€๋กœ 1์›” 1์ผ 0์‹œ 0๋ถ„๋ถ€ํ„ฐ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์บ์‹œ TTL์„ ๊ณ ๋ คํ•ด์„œ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค.

  • โ˜€๏ธ ๊ฐ ์บ์‹œ์— ๋Œ€ํ•œ ์„ค์ •(๋งŒ๋ฃŒ์ •์ฑ…, TTL, ์บ์‹œํฌ๊ธฐ..) ๋“ฑ์€ ๋ฌธ์„œํ™”ํ•˜์—ฌ ์ผ๊ด„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค.
    ex) batch ๋กœ ๊ฐฑ์‹ ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, ๋ฐฐ์น˜ ์ฃผ๊ธฐ์˜ 20~30% ์ •๋„๋กœ TTL์„ ์„ค์ •์„ ๊ถŒ์žฅํ•œ๋‹ค.

  • โ˜€๏ธ ์บ์‹œ๊ฐ’ ๋ณ€์กฐ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.
    ๋กœ์ปฌ ์บ์‹œ์˜ ๊ฒฝ์šฐ, ์บ์‹œ๋œ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋‹ค๊ฐ€ ๋‚ด๋ถ€ ๊ฐ’์„ ์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค. -> ๋กœ์ปฌ ์บ์‹œ์•ˆ์˜ ๊ฐ’๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค
    ์บ์‹œ๊ฐ’์€ ๊ฐ€๋Šฅํ•˜๋ฉด ๋ถˆ๋ณ€ํ•œ ๊ฐ์ฒด๋กœ ์‚ฌ์šฉํ•˜์ž. (๋ฌผ๋ก  Json์œผ๋กœ Serialization ํ•˜์—ฌ ์บ์‹ฑํ•œ ํ›„, ์‚ฌ์šฉํ•  ๋•Œ Deserialization ํ•˜๋ฉด ๊ดœ์ฐฎ์Œ)


..๊ณ„์†ํ•ด์„œ ๋‚ด์šฉ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •..

'๐ŸŒฑ Spring Framework' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Cache#1 ์Šคํ”„๋ง์˜ ์บ์‹œ ์ถ”์ƒํ™”(@Cacheable)  (4) 2022.08.28

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ