๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

๋กœ์ปฌ ์บ์‹œ(Guava, Caffeine Cache) ๋ถ„์‚ฐ ์บ์‹œ(Redis, Memcached), ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์บ์‹œ, ์บ์‹ฑ ์ „๋žต ๋ณธ๋ฌธ

DB/Database (๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)

๋กœ์ปฌ ์บ์‹œ(Guava, Caffeine Cache) ๋ถ„์‚ฐ ์บ์‹œ(Redis, Memcached), ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์บ์‹œ, ์บ์‹ฑ ์ „๋žต

9taetae9 2025. 9. 21. 14:39
728x90

1. ์บ์‹ฑ, ์บ์‹œ

1.1. ์บ์‹ฑ์˜ ๋ชฉ์ 

 ์บ์‹ฑ(Caching)์˜ ์ฃผ๋ชฉ์ ์€ "์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด ๋†“์€ ์ž„์‹œ ์žฅ์†Œ"๋ฅผ ๋งˆ๋ จํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ์ง€์—ญ์„ฑ(Data Locality) ์›์น™, ์ฆ‰ ํ•œ๋ฒˆ ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์— ๋‹ค์‹œ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” ๊ฒฝํ—˜์  ๋ฒ•์น™์— ๊ทผ๊ฑฐํ•œ๋‹ค.  

 ์บ์‹ฑ์˜ ์ง์ ‘์ ์ธ ๊ฐ€์น˜๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋””์Šคํฌ(SSD, HDD) ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜๊ตฌ ์ €์žฅ๋˜์ง€๋งŒ, ๋””์Šคํฌ ์ ‘๊ทผ์€ ๋ฉ”๋ชจ๋ฆฌ(RAM) ์ ‘๊ทผ์— ๋น„ํ•ด ์†๋„๊ฐ€ ํ˜„์ €ํžˆ ๋А๋ฆฌ๋‹ค. ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ RAM์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋ฐ€๋ฆฌ์ดˆ ๋ฏธ๋งŒ์˜ ์ดˆ์ €์ง€์—ฐ(ultra-low latency) ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „๋ฐ˜์ ์ธ ์‘๋‹ต ์†๋„๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„ ํ•œ๋‹ค.  

 ๊ทธ๋Ÿฌ๋‚˜ ์บ์‹ฑ์ด ๋‹จ์ˆœํžˆ ์†๋„ ๊ฐœ์„ ์—๋งŒ ์ด์ ์ด ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํ˜„๋Œ€ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์บ์‹ฑ์€ ๋น„์šฉ ์ตœ์ ํ™”์™€ ์‹œ์Šคํ…œ ์•ˆ์ •์„ฑ์„ ์œ„ํ•œ ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜ ์ „๋žต์œผ๋กœ ์ž์ฃผ ์ด์šฉ๋œ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ API์™€ ๊ฐ™์€ ๋А๋ฆฐ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ์ง€ ๊ณ„์ธต์— ๋Œ€ํ•œ ์ ‘๊ทผ ํšŸ์ˆ˜๋ฅผ ์ค„์ž„์œผ๋กœ์จ, ์„œ๋ฒ„์˜ ๋ถ€ํ•˜๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋ถˆํ•„์š”ํ•œ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ ˆ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ง์ ‘์ ์ธ ์ธํ”„๋ผ ๋น„์šฉ ์ ˆ๊ฐ์œผ๋กœ ์ด์–ด์ง€๋ฉฐ, ํŠนํžˆ ์ฒ˜๋ฆฌ๋Ÿ‰(IOPS)์ด๋‚˜ ๋ฐ์ดํ„ฐ ์ „์†ก๋Ÿ‰์— ๋”ฐ๋ผ ์š”๊ธˆ์ด ๋ถ€๊ณผ๋˜๋Š” ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๊ทธ ํšจ๊ณผ๊ฐ€ ๋”์šฑ ์ปค์ง„๋‹ค.  

 ๋˜ํ•œ ์บ์‹ฑ์€ ์‹œ์Šคํ…œ์˜ ํ™•์žฅ์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๊ฒฐ์ •์ ์ธ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ข…์ข… ์‹œ์Šคํ…œ ์ „์ฒด์˜ ๋ณ‘๋ชฉ ์ง€์ ์ด ๋œ๋‹ค. ์บ์‹œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ 'ํ•ซ์ŠคํŒŸ'(ํŠน์ • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ์ง‘์ค‘๋˜๋Š” ํ˜„์ƒ)์„ ์ œ๊ฑฐํ•˜๊ณ  ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ํŠธ๋ž˜ํ”ฝ ๊ธ‰์ฆ์— ํšจ๊ณผ์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์บ์‹ฑ์€ ๋‹จ์ˆœํžˆ ์„ฑ๋Šฅ์„ ๋ณด์กฐํ•˜๋Š” ๊ธฐ์ˆ ์„ ๋„˜์–ด, ์‹œ์Šคํ…œ์˜ ๋น„์šฉ ๊ตฌ์กฐ์™€ ์•ˆ์ •์„ฑ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ทผ๋ณธ์ ์ธ ์•„ํ‚คํ…์ฒ˜ ๋ ˆ๋ฒจ์˜ ์˜์‚ฌ๊ฒฐ์ •์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.   

 

1.2. ์บ์‹œ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ์›๋ฆฌ: Hit์™€ Miss

์บ์‹œ์˜ ๋™์ž‘์€ 'Cache Hit'์™€ 'Cache Miss' ๋‘ ๊ฐ€์ง€ ์ƒํƒœ๋กœ ์š”์•ฝ๋œ๋‹ค.

 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์กด์žฌํ•˜์—ฌ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ 'Cache Hit'๋ผ๊ณ  ํ•œ๋‹ค. ๋ฐ˜๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์กด์žฌํ•˜์ง€ ์•Š์•„ ์›๋ณธ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ(ex: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)๊นŒ์ง€ ๊ฐ€์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ 'Cache Miss'๋ผ๊ณ  ํ•œ๋‹ค.  

 ์บ์‹ฑ ์ „๋žต์˜ ํ•ต์‹ฌ ๋ชฉํ‘œ๋Š” 'Cache Hit Rate'(์บ์‹œ ํžˆํŠธ์œจ)๋ฅผ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํžˆํŠธ์œจ์ด ๋†’์„์ˆ˜๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋” ๋น ๋ฅธ ์‘๋‹ต ์†๋„๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์›๋ณธ ์ €์žฅ์†Œ์˜ ๋ถ€ํ•˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋ฏธ์Šค์œจ์ด ๋†’์œผ๋ฉด ์บ์‹œ์˜ ์ด์ ์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ , ์˜คํžˆ๋ ค ์บ์‹œ๋ฅผ ํ™•์ธํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ๋งŒ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.  

 

2. ๋กœ์ปฌ ์บ์‹œ(Local Cache)

2.1. ๋กœ์ปฌ ์บ์‹œ์˜ ํŠน์ง•

 ๋กœ์ปฌ ์บ์‹œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ ์ž์ฒด ๋ฆฌ์†Œ์Šค, ์ฆ‰ ๋ฉ”๋ชจ๋ฆฌ(RAM)๋‚˜ ๋””์Šคํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์บ์‹ฑ ๋ฐฉ์‹์ด๋‹ค. ์บ์‹œ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค ๋‚ด์— ์กด์žฌํ•˜๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์™„์ „ํžˆ ๊ฐ™์ด ํ•œ๋‹ค.  

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

 

Java ํ™˜๊ฒฝ์—์„œ๋Š” ๋กœ์ปฌ ์บ์‹œ์˜ ์ €์žฅ ๊ณต๊ฐ„์„ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  • On-Heap ์ €์žฅ์†Œ: JVM ํž™ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(GC)์˜ ๋Œ€์ƒ์ด ๋˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ๊ณผ์ •์ด ํ•„์š” ์—†์–ด ์ ‘๊ทผ ์†๋„๊ฐ€ ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค.  
  • Off-Heap ์ €์žฅ์†Œ: JVM ํž™ ์™ธ๋ถ€์˜ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•œ๋‹ค. GC์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์•„ GC๋กœ ์ธํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฝ์„ ๋•Œ ์ง๋ ฌํ™” ๋ฐ ์—ญ์ง๋ ฌํ™” ๊ณผ์ •์ด ํ•„์š”ํ•˜์—ฌ On-Heap ๋ฐฉ์‹๋ณด๋‹ค๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ๋‹ค.  

2.2. ๋กœ์ปฌ ์บ์‹œ์˜ ๋‹จ์ 

๋‹จ์ˆœํ•จ๊ณผ ๋น ๋ฅธ ์†๋„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋กœ์ปฌ ์บ์‹œ๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ ์‹œ ์—ฌ๋Ÿฌ ์น˜๋ช…์ ์ธ ๋‹จ์ ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ: ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋กœ ํ™•์žฅ(Scale-out)๋œ ํ™˜๊ฒฝ์—์„œ ๋กœ์ปฌ ์บ์‹œ๋Š” ์‹ฌ๊ฐํ•œ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•œ๋‹ค. ๊ฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ์ ์ธ ์บ์‹œ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ ์บ์‹œ๋Š” ๊ฐฑ์‹ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์–ด๋–ค ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋˜๋А๋ƒ์— ๋”ฐ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์ด ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ์˜ ์‹ ๋ขฐ์„ฑ์„ ํ•ด์น˜๋Š” ์‹ฌ๊ฐํ•œ ๊ฒฐํ•จ์ด๋‹ค.  
  • ๋ฐ์ดํ„ฐ ํœ˜๋ฐœ์„ฑ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ: ๋กœ์ปฌ ์บ์‹œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค์— ์ข…์†์ ์ด๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žฌ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ์žฅ์• ๋กœ ์ธํ•ด ์ข…๋ฃŒ๋˜๋ฉด ์บ์‹œ๋œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ํ•จ๊ป˜ ์†Œ์‹ค๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ์„œ๋น„์Šค ์žฌ์‹œ์ž‘ ์งํ›„ ๋ชจ๋“  ์š”์ฒญ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ชฐ๋ฆฌ๋Š” '์บ์‹œ ์Šคํƒฌํ”ผ๋“œ(Cache Stampede)' ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ณผ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.  
  • ํ™•์žฅ์„ฑ์˜ ํ•œ๊ณ„: ๋กœ์ปฌ ์บ์‹œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— ๋ถ„์‚ฐ(Sharding)ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๊ตฌ์กฐ์ ์œผ๋กœ ์–ด๋ ต๊ณ , ์˜ค์ง ๋ณต์ œ(Replication)๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ์บ์‹œํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAS) ์ž์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ ์š”๊ตฌ๋Ÿ‰์ด ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, ์ˆ˜์ง์  ํ™•์žฅ(Scale-up)์— ํฌ๊ฒŒ ์˜์กดํ•˜๊ฒŒ ๋œ๋‹ค.
  • ์ž์› ๋‚ญ๋น„: ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ค‘๋ณตํ•ด์„œ ์ €์žฅํ•˜์—ฌ, ๋ฉ”๋ชจ๋ฆฌ ์ž์›์˜ ๋‚ญ๋น„๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.  

 ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์€ ๋กœ์ปฌ ์บ์‹œ ์ž์ฒด์˜ ๊ฒฐํ•จ์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ๊ธฐ์ˆ ์„ ๊ทธ ์„ค๊ณ„ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์— ์ ์šฉํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฐ๊ณผ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋กœ์ปฌ ์บ์‹œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์ „์—๋Š” ํ˜„์žฌ ์‹œ์Šคํ…œ์˜ ์•„ํ‚คํ…์ฒ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฏธ๋ž˜์˜ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ๊นŒ์ง€ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ์‹คํ–‰์ด ๋ณด์žฅ๋˜๋Š” ํ™˜๊ฒฝ, ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ๋ฐฐ์น˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋…๋ฆฝ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ์—์„œ๋Š” ๋กœ์ปฌ ์บ์‹œ๊ฐ€ ์—ฌ์ „ํžˆ ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์„ ํƒ์ผ ์ˆ˜ ์žˆ๋‹ค.

2.3. Java ์ฃผ์š” ๋กœ์ปฌ ์บ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: Guava Cache, Caffeine Cache

Java ์ง„์˜์—์„œ ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋กœ์ปฌ ์บ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Google์˜ Guava Cache์™€ ์ด๋ฅผ ๊ณ„์Šนํ•œ Caffeine Cache์ด๋‹ค.

  • Guava Cache: Google์˜ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Guava์— ํฌํ•จ๋œ ์บ์‹œ ๊ตฌํ˜„์ฒด์ด๋‹ค. CacheBuilder ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ๋นŒ๋” ํŒจํ„ด์œผ๋กœ ์œ ์—ฐํ•˜๊ฒŒ ์บ์‹œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํฌ๊ธฐ ๊ธฐ๋ฐ˜ ์ œ๊ฑฐ, ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋งŒ๋ฃŒ(์ƒ์„ฑ ํ›„, ์ ‘๊ทผ ํ›„), ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋“ฑ ํ•„์ˆ˜์  ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ํŠนํžˆ   LoadingCache ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์บ์‹œ ๋ฏธ์Šค๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ •์˜๋œ ๋กœ์ง์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ๋กœ๋“œํ•ด์ฃผ๋Š” ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.  
  • Caffeine Cache: Guava Cache๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋” ๋†’์€ ์„ฑ๋Šฅ์„ ๋ชฉํ‘œ๋กœ ์„ค๊ณ„๋œ ๋กœ์ปฌ ์บ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. Java 8 ์ด์ƒ ํ™˜๊ฒฝ์„ ์š”๊ตฌํ•˜๋ฉฐ, Guava Cache์˜ API์™€ ๊ฑฐ์˜ ํ˜ธํ™˜๋˜์–ด ๊ธฐ์กด Guava ์‚ฌ์šฉ์ž๋“ค์ด ์‰ฝ๊ฒŒ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ์ˆ˜ ์žˆ๋‹ค. Caffeine์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€   TinyLFU(Tiny Least Frequently Used)๋ผ๋Š” ๋…์ฐฝ์ ์ธ ์บ์‹œ ์ œ๊ฑฐ ์ •์ฑ…์„ ์ฑ„ํƒํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ์ „ํ†ต์ ์ธ LRU(Least Recently Used)์™€ LFU(Least Frequently Used) ์ •์ฑ…์˜ ์žฅ์ ์„ ๊ฒฐํ•ฉํ•˜์—ฌ, ์ ‘๊ทผ ๋นˆ๋„์™€ ์ตœ๊ทผ์„ฑ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•จ์œผ๋กœ์จ ์ตœ์ ์— ๊ฐ€๊นŒ์šด ๋†’์€ ์บ์‹œ ํžˆํŠธ์œจ์„ ๋‹ฌ์„ฑํ•œ๋‹ค. ๋˜ํ•œ, ๋น„๋™๊ธฐ ๋กœ๋”ฉ, ๋งŒ๋ฃŒ๋œ ๋ฐ์ดํ„ฐ์˜ ๋น„๋™๊ธฐ ๋ฆฌํ”„๋ ˆ์‹œ ๋“ฑ Guava๋ณด๋‹ค ๋ฐœ์ „๋œ ๊ธฐ๋Šฅ์„ ๋‹ค์ˆ˜ ์ œ๊ณตํ•˜๋ฉฐ, Spring Framework 4.3 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๊ณต์‹ ์บ์‹œ ๊ตฌํ˜„์ฒด๋กœ ์ฑ„ํƒ๋˜์–ด ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.  

๋‹ค์Œ์€ Caffeine์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ๋กœ์ปฌ ์บ์‹œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์˜ˆ์ œ ์ฝ”๋“œ์ด๋‹ค.

import com.github.benmanes.caffeine.cache.Caffeine;
import com.github.benmanes.caffeine.cache.LoadingCache;
import java.util.concurrent.TimeUnit;

public class CaffeineExample {
    public static void main(String args) {
        // Caffeine ์บ์‹œ ๋นŒ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
        LoadingCache<String, String> cache = Caffeine.newBuilder()
               .maximumSize(100) // ์บ์‹œ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์•„์ดํ…œ ์ˆ˜
               .expireAfterWrite(10, TimeUnit.MINUTES) // ์•„์ดํ…œ์ด ์“ฐ์—ฌ์ง„ ํ›„ 10๋ถ„ ๋’ค ๋งŒ๋ฃŒ
               .refreshAfterWrite(1, TimeUnit.MINUTES) // ์•„์ดํ…œ์ด ์“ฐ์—ฌ์ง„ ํ›„ 1๋ถ„๋งˆ๋‹ค ๋น„๋™๊ธฐ ๋ฆฌํ”„๋ ˆ์‹œ
               .build(key -> loadDataFromDatabase(key)); // Cache Miss ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ๋กœ์ง ์ •์˜

        // ๋ฐ์ดํ„ฐ ์กฐํšŒ
        String value = cache.get("some-key");
        System.out.println("Cached Value: " + value);
    }

    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    private static String loadDataFromDatabase(String key) {
        System.out.println("Loading data for key: " + key);
        return "Data for " + key;
    }
}

์ด ์ฝ”๋“œ์—์„œ build() ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ๋žŒ๋‹ค ํ•จ์ˆ˜๋Š” CacheLoader ์—ญํ• ์„ ํ•˜์—ฌ, cache.get("some-key") ํ˜ธ์ถœ ์‹œ ์บ์‹œ์— ํ•ด๋‹น ํ‚ค๊ฐ€ ์—†์œผ๋ฉด loadDataFromDatabase() ๋ฉ”์„œ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ ํ›„ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค.  

 

3. ๋ถ„์‚ฐ ์บ์‹œ(Distributed Cache)

3.1. ๋ถ„์‚ฐ ์บ์‹œ์˜ ์•„ํ‚คํ…์ฒ˜์™€ ํŠน์ง•

๋ถ„์‚ฐ ์บ์‹œ(Distributed Cache)๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์™€๋Š” ๋…๋ฆฝ๋œ ๋ณ„๋„์˜ ์„œ๋ฒ„(๋˜๋Š” ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ)์— ์บ์‹œ ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ด ๊ณต์œ  ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.  

 

์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜๋Š” ๋กœ์ปฌ ์บ์‹œ์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋ณด์žฅ: ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์ค‘์•™์˜ ๋‹จ์ผ ์บ์‹œ ์ €์žฅ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋ฏ€๋กœ, ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ์›์ฒœ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋–ค ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋“  ํ•ญ์ƒ ๋™์ผํ•œ ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.  
  • ๋†’์€ ํ™•์žฅ์„ฑ๊ณผ ๊ฐ€์šฉ์„ฑ: ๋ถ„์‚ฐ ์บ์‹œ๋Š” ์ˆ˜ํ‰์  ํ™•์žฅ(Scale-out)์— ๋งค์šฐ ์šฉ์ดํ•˜๋‹ค. ๋ฐ์ดํ„ฐ ์–‘์ด ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•˜๋ฉด ์บ์‹œ ์„œ๋ฒ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์šฉ๋Ÿ‰๊ณผ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์„ ํ˜•์ ์œผ๋กœ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๋ฐ์ดํ„ฐ ๋ณต์ œ(Replication)๋‚˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง(Clustering) ๊ตฌ์„ฑ์„ ํ†ตํ•ด ํŠน์ • ์บ์‹œ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์šด์˜๋˜๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ(High Availability)์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.  
  • ๋ฐ์ดํ„ฐ ์˜์†์„ฑ: ์บ์‹œ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค์™€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์žฌ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ๋ฐฐํฌ๊ฐ€ ์ด๋ฃจ์–ด์ ธ๋„ ์บ์‹œ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค. Redis์™€ ๊ฐ™์€ ์ผ๋ถ€ ์†”๋ฃจ์…˜์€ ์Šค๋ƒ…์ƒท์ด๋‚˜ ๋กœ๊ทธ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ์˜์†์„ฑ ์˜ต์…˜์„ ์ œ๊ณตํ•˜์—ฌ, ์บ์‹œ ์„œ๋ฒ„ ์ž์ฒด์˜ ์žฅ์• ์—๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ๋‹ค.  

3.2. ๋ถ„์‚ฐ ์บ์‹œ์˜ ๋‹จ์ 

๋ถ„์‚ฐ ์บ์‹œ๋Š” ๋งŽ์€ ์ด์ ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ทธ์— ์ƒ์‘ํ•˜๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ๋„คํŠธ์›Œํฌ ์ง€์—ฐ: ๋ชจ๋“  ์บ์‹œ ์ ‘๊ทผ์€ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์ˆ˜๋ฐ˜ํ•œ๋‹ค. ์ด๋Š” ์•„๋ฌด๋ฆฌ ๋น ๋ฅธ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ด๋ผ๋„ ๋กœ์ปฌ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๋ณด๋‹ค๋Š” ํ•„์—ฐ์ ์œผ๋กœ ๋А๋ฆด ์ˆ˜๋ฐ–์— ์—†๋‹ค. ๋˜ํ•œ ๋„คํŠธ์›Œํฌ ์ƒํƒœ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์˜ ๋ณ€๋™์„ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.  
  • ์šด์˜ ๋ณต์žก์„ฑ ๋ฐ ๋น„์šฉ: ๋ณ„๋„์˜ ์บ์‹œ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ฉฐ, ์žฅ์• ์— ๋Œ€๋น„ํ•˜๋Š” ๋“ฑ ์ถ”๊ฐ€์ ์ธ ์šด์˜ ๋ถ€๋‹ด์ด ๋ฐœ์ƒํ•œ๋‹ค. ์บ์‹œ ์„œ๋ฒ„ ์ž์ฒด๊ฐ€ ๋˜ ๋‹ค๋ฅธ ์žฅ์•  ํฌ์ธํŠธ(Single Point of Failure)๊ฐ€ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ณ ๊ฐ€์šฉ์„ฑ ๊ตฌ์„ฑ์ด ํ•„์ˆ˜์ ์ด๋ฉฐ ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ์˜ค๋ฒ„ํ—ค๋“œ: ๊ฐ์ฒด์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†กํ•˜๋ ค๋ฉด, ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ง๋ ฌํ™”(Serialization)์™€ ์ด๋ฅผ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณต์›ํ•˜๋Š” ์—ญ์ง๋ ฌํ™”(Deserialization) ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ด ๊ณผ์ •์€ CPU ์ž์›์„ ์†Œ๋ชจํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.  

3.3. ๋Œ€ํ‘œ์ ์ธ ๋ถ„์‚ฐ ์บ์‹œ ์†”๋ฃจ์…˜: Redis vs Memcached

๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ถ„์‚ฐ ์บ์‹œ ์†”๋ฃจ์…˜์€ Redis์™€ Memcached์ด๋‹ค. ๋‘ ์†”๋ฃจ์…˜ ๋ชจ๋‘ ๊ณ ์„ฑ๋Šฅ ์ธ๋ฉ”๋ชจ๋ฆฌ ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋ผ๋Š” ๊ณตํ†ต์ ์„ ๊ฐ€์ง€์ง€๋งŒ, ๊ทผ๋ณธ ๋ชฉ์ ๊ณผ ์•„ํ‚คํ…์ฒ˜์—์„œ ๋šœ๋ ทํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 Memcached๋Š” 'ํœ˜๋ฐœ์„ฑ, ๋‹จ์ˆœ์„ฑ, ๋น ๋ฅธ ์†๋„'๋ผ๋Š” ์บ์‹œ ๋ณธ์—ฐ์˜ ์—ญํ• ์— ์ถฉ์‹คํ•œ ์†”๋ฃจ์…˜์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ€ํ•˜ ๊ฒฝ๊ฐ์ด ์ฃผ๋œ ๋ชฉํ‘œ์ด๊ณ , ์›๋ณธ ๋ฐ์ดํ„ฐ๋กœ ์ฆ‰์‹œ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋‹จ์ˆœํ•œ ํ‚ค-๊ฐ’ ์บ์‹ฑ๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด Memcached์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์•„ํ‚คํ…์ฒ˜์™€ ๋‹จ์ˆœ์„ฑ์ด ๋” ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.  

 Redis๋Š” ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ์˜์†์„ฑ, ๊ณ ๊ฐ€์šฉ์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ๋‹จ์ˆœํ•œ '์บ์‹œ'๋ฅผ ๋„˜์–ด '๋‹ค๋ชฉ์  ๊ณ ์† ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ'๋กœ์„œ์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋žญํ‚น ์‹œ์Šคํ…œ, ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ๋ฉ”์‹œ์ง€ ํ ๋“ฑ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋ณด์กด์ด ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” Redis๊ฐ€ ๊ฑฐ์˜ ์œ ์ผํ•œ ์„ ํƒ์ง€๋‹ค.  

๊ธฐ๋Šฅ/ํŠน์ง• Redis Memcached
์ž๋ฃŒ๊ตฌ์กฐ Strings, Lists, Sets, Sorted Sets, Hashes, Bitmaps ๋“ฑ ๋‹ค์–‘ํ•จ ๋‹จ์ˆœ Key-Value (Strings)๋งŒ ์ง€์›
์Šค๋ ˆ๋”ฉ ๋ชจ๋ธ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ (I/O Multiplexing). Race Condition ์šฐ๋ ค๊ฐ€ ์ ์Œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์•„ํ‚คํ…์ฒ˜. ๋‹ค์ค‘ ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋†’์€ ์ฒ˜๋ฆฌ๋Ÿ‰(Throughput) ๋‹ฌ์„ฑ
์˜์†์„ฑ RDB(์Šค๋ƒ…์ƒท), AOF(๋กœ๊ทธ ํŒŒ์ผ) ๋ฐฉ์‹์˜ ๋””์Šคํฌ ์ €์žฅ ์ง€์› ์ง€์›ํ•˜์ง€ ์•Š์Œ. ์ˆœ์ˆ˜ ์ธ๋ฉ”๋ชจ๋ฆฌ ํœ˜๋ฐœ์„ฑ ์บ์‹œ
๋ณต์ œ/๊ณ ๊ฐ€์šฉ์„ฑ Master-Slave ๋ณต์ œ, Sentinel์„ ํ†ตํ•œ ์ž๋™ Failover, Cluster๋ฅผ ํ†ตํ•œ ์ƒค๋”ฉ ๋ฐ ๊ณ ๊ฐ€์šฉ์„ฑ ๋‚ด์žฅ ์ง€์› ์ž์ฒด ๊ธฐ๋Šฅ ์—†์Œ. ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Consistent Hashing)๋‚˜ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ ํ•„์š”
ํŠธ๋žœ์žญ์…˜ MULTI/EXEC ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•œ ์›์ž์  ์—ฐ์‚ฐ ์ง€์› ์ง€์›ํ•˜์ง€ ์•Š์Œ
Pub/Sub ๋‚ด์žฅ๋œ ๋ฐœํ–‰/๊ตฌ๋… ๋ฉ”์‹œ์ง• ๊ธฐ๋Šฅ ์ œ๊ณต ์ง€์›ํ•˜์ง€ ์•Š์Œ
๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (jemalloc).
๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ ์žˆ์Œ
Slab Allocator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๊ณ  ์žฌ์‚ฌ์šฉ. ๋‹จํŽธํ™”๊ฐ€ ์ ์Œ
์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ๋ณตํ•ฉ ๋ฐ์ดํ„ฐ ์บ์‹ฑ, ๋žญํ‚น ๋ณด๋“œ, ๋ฉ”์‹œ์ง€ ํ, ์„ธ์…˜ ์Šคํ† ์–ด, ์‹ค์‹œ๊ฐ„ ๋ถ„์„ ๋“ฑ ๋‹ค๋ชฉ์  ๋‹จ์ˆœ ๊ฐ์ฒด/๋ฌธ์ž์—ด ์บ์‹ฑ, DB ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์บ์‹ฑ ๋“ฑ ์ˆœ์ˆ˜ ์บ์‹ฑ ๋ชฉ์ 

4. ์บ์‹ฑ ์ „๋žต๊ณผ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ

์บ์‹œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฝ๊ณ  ์“ธ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ „๋žต, ์ฆ‰ '์บ์‹ฑ ํŒจํ„ด'์„ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

4.1. ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํŒจํ„ด

  • Cache-Aside (Lazy Loading): ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ณด์ˆ˜์ ์ด๊ณ  ์•ˆ์ „ํ•œ ํŒจํ„ด์ด๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ์ง์ ‘ ์ œ์–ดํ•˜๋ฉฐ, ์บ์‹œ๋Š” ์กฐํšŒ ์†๋„ ๊ฐœ์„  ๋ณด์กฐ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค.
Cache-Aside

Cache Hit ์‹œ๋‚˜๋ฆฌ์˜ค 

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•ด ๋จผ์ € ์บ์‹œ๋ฅผ ํ™•์ธํ•œ๋‹ค. (Application → Cache (read request))
  2. Cache Hit ์‹œ, ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (cache hit: read from cache → Application)

Cache Miss ์‹œ๋‚˜๋ฆฌ์˜ค

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์œ„ํ•ด ๋จผ์ € ์บ์‹œ๋ฅผ ํ™•์ธํ•œ๋‹ค. (Application → Cache (read request))
  2. Cache Miss (cache miss: (Cache → Application))
  3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค. (Application → Storage (read request))
  4. ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. (read from storage (Storage → Application))
  5. ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. (write to cache (Application → Cache))
  • ์žฅ์ : ์‹ค์ œ๋กœ ์š”์ฒญ๋˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์บ์‹œ์— ์ €์žฅ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์บ์‹œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์˜ ์—ฐ์†์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ : ์ตœ์ดˆ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์‹œ์—๋Š” ํ•ญ์ƒ Cache Miss๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๋ฉฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์บ์‹œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌดํšจํ™”(invalidate)ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.  
Read-Through
    • Read-Through: ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์ฑ…์ž„์„ ์บ์‹œ์—๊ฒŒ ์œ„์ž„ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.
      1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•ญ์ƒ ์บ์‹œ์—๋งŒ ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
      2. Cache Hit ์‹œ, ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      3. Cache Miss์‹œ, ์บ์‹œ๊ฐ€ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ์บ์‹œ์— ์ €์žฅํ•œ ํ›„, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • ์žฅ์ : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์กด์žฌ๋ฅผ ์ธ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋กœ์ง์ด ์บ์‹œ์— ์ง‘์ค‘๋˜์–ด ์ผ๊ด€์„ฑ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.  
      • ๋‹จ์ : ์บ์‹œ ์†”๋ฃจ์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ด์•ผ ํ•˜๋ฉฐ, ์บ์‹œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์กฐํšŒ ์ž์ฒด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ ธ ์„œ๋น„์Šค ์ „์ฒด์˜ ์žฅ์• ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.  
Write-Through
  • Write-Through: ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ์ตœ์šฐ์„ ์œผ๋กœ ๊ณ ๋ คํ•˜๋Š” ํŒจํ„ด์œผ๋กœ, ์ฃผ๋กœ ๊ธˆ์œต ๊ฑฐ๋ž˜์™€ ๊ฐ™์ด ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์ด ์š”๊ตฌ๋˜๋Š” ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜๋‹ค.
    1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ์ดํ„ฐ๋ฅผ ์“ธ ๋•Œ, ๋จผ์ € ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ด๋‹ค.
    2. ์บ์‹œ์— ์“ฐ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด, ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋„ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์“ด๋‹ค. ๋‘ ์ž‘์—…์ด ๋ชจ๋‘ ์„ฑ๊ณตํ•ด์•ผ ์“ฐ๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋œ๋‹ค.
    • ์žฅ์ : ์บ์‹œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ ๋™๊ธฐํ™”๋˜๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๋งค์šฐ ๋†’๋‹ค.  
    • ๋‹จ์ : ๋ชจ๋“  ์“ฐ๊ธฐ ์ž‘์—…์ด ์บ์‹œ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋‘ ๊ณณ์—์„œ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ, ์“ฐ๊ธฐ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค.  
Write-Back (Write-Behind)
  • Write-Back (Write-Behind): ์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด์œผ๋กœ, ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ๋ณด๋‹ค๋Š” ์“ฐ๊ธฐ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ํ›จ์”ฌ ์ค‘์š”ํ•œ ํŠน์ • ๋„๋ฉ”์ธ(ex: ๋Œ€๋Ÿ‰์˜ ๋กœ๊ทธ ์ˆ˜์ง‘, ์‹ค์‹œ๊ฐ„ ํ†ต๊ณ„ ์ง‘๊ณ„)์— ์‚ฌ์šฉ๋œ๋‹ค.
    1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์—๋งŒ ์“ด๋‹ค.
    2. ์บ์‹œ๋Š” ์“ฐ๊ธฐ ์š”์ฒญ์„ ํŠน์ • ๋ฒ„ํผ์— ๋ชจ์•„๋‘์—ˆ๋‹ค๊ฐ€, ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ฑฐ๋‚˜ ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ผ๊ด„ ๊ธฐ๋ก(batch write)ํ•œ๋‹ค.
    • ์žฅ์ : ์“ฐ๊ธฐ ์ž‘์—…์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฆ‰์‹œ ์™„๋ฃŒ๋˜๋ฏ€๋กœ ์‘๋‹ต ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์“ฐ๊ธฐ ๋ถ€ํ•˜๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.  
    • ๋‹จ์ : ์บ์‹œ์—๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ก๋œ ์ƒํƒœ์—์„œ ์บ์‹œ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜๊ตฌ์ ์œผ๋กœ ์œ ์‹ค๋  ์œ„ํ—˜์ด ์กด์žฌํ•œ๋‹ค.  
Write-Around
  • Write-Around: ์“ฐ๊ธฐ ์ž‘์—…์ด ์žฆ์ง€๋งŒ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ์ฝํž ํ™•๋ฅ ์ด ๋‚ฎ์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•œ ํŒจํ„ด์ด๋‹ค.
    1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์“ฐ๊ธฐ ์ž‘์—…์„ ์บ์‹œ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ง์ ‘ ์ˆ˜ํ–‰ํ•œ๋‹ค. (์œ„ ๊ทธ๋ฆผ์˜ 1๋ฒˆ ์ž‘์—…)
    2. ์ฝ๊ธฐ ์ž‘์—…์€ Cache-Aside ํŒจํ„ด์„ ๋”ฐ๋ฅธ๋‹ค. (์œ„ ๊ทธ๋ฆผ์˜ 2,3,4๋ฒˆ ์ž‘์—…)
    • ์žฅ์ : ์“ฐ๊ธฐ ์ž‘์—…์ด ๋น ๋ฅด๊ณ , ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์บ์‹œ ํšจ์œจ์„ ๋†’์ธ๋‹ค.  
    • ๋‹จ์ : ๋ฐ์ดํ„ฐ๋ฅผ ์“ด ์งํ›„์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์œผ๋ ค๊ณ  ํ•˜๋ฉด ๋ฐ˜๋“œ์‹œ Cache Miss๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ, ์ผ์‹œ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜๋ฅผ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋œ๋‹ค.  

4.2. ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ์˜ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ์ฑ…

๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ์ˆœํ•œ ์บ์‹ฑ ํŒจํ„ด๋งŒ์œผ๋กœ๋Š” ํ•ด๊ฒฐํ•˜๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•œ๋‹ค.

4.2.1 ์บ์‹œ ์‡„๋„ (Cache Stampede / Thundering Herd)

์ธ๊ธฐ ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์บ์‹œ๊ฐ€ ๋งŒ๋ฃŒ๋˜๋Š” ์ˆœ๊ฐ„, ์ˆ˜๋งŽ์€ ์š”์ฒญ์ด ๋™์‹œ์— Cache Miss๋ฅผ ์ผ์œผํ‚ค๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ชฐ๋ ค๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์— ๊ณผ๋ถ€ํ•˜๋ฅผ ์ฃผ๋Š” ํ˜„์ƒ์ด๋‹ค.

  • ๋ฌธ์ œ ์ƒํ™ฉ
Cache ๋งŒ๋ฃŒ ์‹œ์ ์— ๋Œ€๋Ÿ‰์˜ ๋™์‹œ ์š”์ฒญ ๋ฐœ์ƒ
↓
๋ชจ๋“  ์š”์ฒญ์ด DB๋กœ ์ง์ ‘ ์ „์†ก
↓
DB ๊ณผ๋ถ€ํ•˜ ๋ฐ ์‘๋‹ต ์ง€์—ฐ
  • ๋ฐœ์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค
    • ์ธ๊ธฐ ์ƒํ’ˆ ์ •๋ณด๊ฐ€ ์บ์‹œ์—์„œ ๋งŒ๋ฃŒ๋  ๋•Œ
    • ํŠธ๋ Œ๋”ฉ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ๋Œ€๋Ÿ‰ ์กฐํšŒ
    • ํ”„๋กœ๋ชจ์…˜ ์‹œ๊ฐ„ ๋“ฑ ํŠน์ • ์‹œ์ ์˜ ์ง‘์ค‘ ์š”์ฒญ
  • ํ•ด๊ฒฐ์ฑ… 1 (Jitter ์ถ”๊ฐ€): ์บ์‹œ ๋งŒ๋ฃŒ ์‹œ๊ฐ„(TTL)์— ์งง์€ ๋žœ๋ค ์‹œ๊ฐ„(Jitter)์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ์—ฌ๋Ÿฌ ์บ์‹œ ํ•ญ๋ชฉ์ด ๋™์‹œ์— ๋งŒ๋ฃŒ๋˜์ง€ ์•Š๋„๋ก ์‹œ์ ์„ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ์ „๋žต์ด๋‹ค.  
  • ํ•ด๊ฒฐ์ฑ… 2 (๋ถ„์‚ฐ ๋ฝ ์ ์šฉ): Redisson(Redis ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ๋ฝ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ) ๋“ฑ ๋ถ„์‚ฐ ๋ฝ์„ ํ™œ์šฉํ•˜์—ฌ ๋‹จ ํ•œ๋ฒˆ์˜ ์“ฐ๊ธฐ ์ž‘์—…๋งŒ ํ—ˆ์šฉ ์‹œํ‚ค๊ธฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

4.2.2. ์บ์‹œ ๊ด€ํ†ต (Cache Penetration)

์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•…์˜์ ์ด๊ฑฐ๋‚˜ ๋น„์ •์ƒ์ ์ธ ์š”์ฒญ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜์—ฌ, ๋งค๋ฒˆ Cache Miss๋ฅผ ์ผ์œผํ‚ค๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ถˆํ•„์š”ํ•œ ์กฐํšŒ ๋ถ€ํ•˜๋ฅผ ๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

  • ํ•ด๊ฒฐ์ฑ… (Null ๊ฐ’ ์บ์‹ฑ): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์กฐํšŒ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๋ฅผ ์บ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ํ‚ค์— ๋Œ€ํ•ด "NULL"์ด๋ผ๋Š” ํŠน์ˆ˜ํ•œ ๊ฐ’์„ ์งง์€ TTL๋กœ ์บ์‹ฑํ•ด๋‘๋ฉด, ์ดํ›„ ๋™์ผํ•œ ํ‚ค์— ๋Œ€ํ•œ ์š”์ฒญ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊นŒ์ง€ ๋„๋‹ฌํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ์—์„œ ์ฐจ๋‹จ๋œ๋‹ค.

5. ์•„ํ‚คํ…์ฒ˜๋ณ„ ์บ์‹ฑ ์ „๋žต ์„ ํƒ

๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜์™€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŠน์„ฑ์„ ๊ฐ€์ง€๋ฏ€๋กœ, ๊ทธ์— ๋งž๋Š” ์บ์‹ฑ ์ ‘๊ทผ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.

5.1. ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜์—์„œ์˜ ์บ์‹ฑ

๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜์˜ ํฐ ๋ฐฐํฌ ๋‹จ์œ„๋กœ ๋ฌถ์—ฌ ์žˆ๋Š” ๊ตฌ์กฐ์ด๋‹ค.   

 
  • ์ดˆ๊ธฐ ๋ฐ ์†Œ๊ทœ๋ชจ ๋‹จ๊ณ„: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋‹จ์ผ ์„œ๋ฒ„์—์„œ ์šด์˜๋˜๋Š” ๊ฒฝ์šฐ, ๋กœ์ปฌ ์บ์‹œ๋Š” ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ์„ ํƒ์ด๋‹ค.
  • ์ˆ˜ํ‰ ํ™•์žฅ ๋‹จ๊ณ„: ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€๋กœ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€๋กœ ํ™•์žฅ(Scale-out)ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด, ๋กœ์ปฌ ์บ์‹œ์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ถ„์‚ฐ ์บ์‹œ(ex: Redis)๋ฅผ ๋„์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์„ธ์…˜ ์ •๋ณด๋‚˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์ „ํ™˜ ๊ฒฝ๋กœ์ด๋‹ค.

5.2. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ์˜ ์บ์‹ฑ

 ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋Š” ๊ฐ ๊ธฐ๋Šฅ์ด ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ณ , ์„œ๋น„์Šค๋ณ„๋กœ ์ž์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ง€๋ฉฐ, API๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์ด ํ™˜๊ฒฝ์—์„œ ์บ์‹ฑ์€ ์„œ๋น„์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„์™€ ์‹œ์Šคํ…œ ์ „์ฒด์˜ ์•ˆ์ •์„ฑ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์–‘๋‚ ์˜ ๊ฒ€์ด ๋  ์ˆ˜ ์žˆ๋‹ค.  

 ์ž˜๋ชป๋œ ์บ์‹ฑ ์ „๋žต, ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๊ฐ€ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ ๊ณต์œ  ๋ถ„์‚ฐ ์บ์‹œ๋ฅผ ์ง์ ‘ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐฉ์‹์€ ์ด ์บ์‹œ๋ฅผ ์ƒˆ๋กœ์šด ํ˜•ํƒœ์˜ '๊ณต์œ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค'๋กœ ๋งŒ๋“ค์–ด ์„œ๋น„์Šค ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ ์„œ๋น„์Šค์˜ ์บ์‹œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฑฐ๋‚˜, ์žฅ์• ๋ฅผ ์ „ํŒŒํ•˜๋Š” ์›์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ์„œ๋น„์Šค์˜ ๋…๋ฆฝ์„ฑ๊ณผ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๋Š” ์บ์‹ฑ ํŒจํ„ด์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

  • ์„œ๋น„์Šค๋ณ„ ๋กœ์ปฌ ์บ์‹œ: ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ž์ฒด ๋ฐ์ดํ„ฐ ์ค‘ ๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋งค์šฐ ๋‚ฎ์€ ๋ฐ์ดํ„ฐ(ex: ์„ค์ •๊ฐ’, ๊ตญ๊ฐ€ ์ฝ”๋“œ ๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ)๋ฅผ ์บ์‹ฑํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ๊ฐ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค ๋‚ด์— ์บ์‹œ๋ฅผ ๋‘์–ด ์™ธ๋ถ€ API ํ˜ธ์ถœ ์—†์ด ๊ฐ€์žฅ ๋น ๋ฅธ ์‘๋‹ต์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.  
  • ๊ณต์œ  ๋ถ„์‚ฐ ์บ์‹œ (Sidecar Cache): ์„œ๋น„์Šค๊ฐ€ ๋‹ค๋ฅธ ์„œ๋น„์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•  ๋•Œ, ํ•ด๋‹น ์„œ๋น„์Šค์˜ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์–ป์€ ์‘๋‹ต์„ ์ž์ฒด์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ถ„์‚ฐ ์บ์‹œ์— ์ €์žฅํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์ด๋Š” ์„œ๋น„์Šค ๊ฐ„์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  API ๊ณ„์•ฝ์„ ์กด์ค‘ํ•˜๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ, ํ˜ธ์ถœ ๋Œ€์ƒ ์„œ๋น„์Šค์— ์ผ์‹œ์ ์ธ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋กœ ์‘๋‹ต์„ ๊ณ„์†ํ•  ์ˆ˜ ์žˆ์–ด, ์žฅ์•  ์ „ํŒŒ๋ฅผ ๋ง‰๊ณ  ์‹œ์Šคํ…œ์˜ ํšŒ๋ณตํƒ„๋ ฅ์„ฑ(Resilience)์„ ๋†’์ด๋Š” ๋ฐ ๊ธฐ์—ฌํ•œ๋‹ค.   
  • ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€: ํ•œ ์„œ๋น„์Šค์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ์„œ๋น„์Šค๋“ค์—๊ฒŒ ๋ณ€๊ฒฝ ์‚ฌ์‹ค์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฉ”์‹œ์ง€ ํ(ex: Kafka, RabbitMQ)๋ฅผ ํ™œ์šฉํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์บ์‹œ ๋ฌดํšจํ™” ์ด๋ฒคํŠธ๋ฅผ ์ „ํŒŒํ•˜๋Š” ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

5.3. ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์บ์‹ฑ ์ „๋žต: ๋‹ˆ์–ด ์บ์‹œ(Near-Cache)

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์บ์‹ฑ์€ ๋กœ์ปฌ ์บ์‹œ์˜ ๋น ๋ฅธ ์†๋„์™€ ๋ถ„์‚ฐ ์บ์‹œ์˜ ์ผ๊ด€์„ฑ ๋ฐ ๋Œ€์šฉ๋Ÿ‰์ด๋ผ๋Š” ์žฅ์ ์„ ๋ชจ๋‘ ์ทจํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด์ด๋‹ค. ๋‹ˆ์–ด ์บ์‹œ(Near-Cache)๋ผ ํ•œ๋‹ค.  

  • ๋™์ž‘ ๋ฐฉ์‹
    1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ ๊ฐ€์žฅ ๋จผ์ € ๋กœ์ปฌ ์บ์‹œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    2. ๋กœ์ปฌ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด(๋กœ์ปฌ ์บ์‹œ Miss), ๋ถ„์‚ฐ ์บ์‹œ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
    3. ๋ถ„์‚ฐ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด(๋ถ„์‚ฐ ์บ์‹œ Hit), ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋กœ์ปฌ ์บ์‹œ์— ์ €์žฅํ•œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    4. ๋ถ„์‚ฐ ์บ์‹œ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด(๋ถ„์‚ฐ ์บ์‹œ Miss), ์›๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜์—ฌ ๋ถ„์‚ฐ ์บ์‹œ์™€ ๋กœ์ปฌ ์บ์‹œ์— ๋ชจ๋‘ ์ €์žฅํ•œ ํ›„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.  
  • ์žฅ์ : ์ž์ฃผ ์ ‘๊ทผํ•˜๋Š” 'ํ•ซ(Hot)' ๋ฐ์ดํ„ฐ๋Š” ๋กœ์ปฌ ์บ์‹œ์—์„œ ๋„คํŠธ์›Œํฌ ์ง€์—ฐ ์—†์ด ์ดˆ๊ณ ์†์œผ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋™์‹œ์— ๋ถ„์‚ฐ ์บ์‹œ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์˜์†์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ์ „์ฒด์ ์ธ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ๊ณผ ๋ถ„์‚ฐ ์บ์‹œ์— ๊ฐ€ํ•ด์ง€๋Š” ๋ถ€ํ•˜๋ฅผ ํฌ๊ฒŒ ์ค„์—ฌ์ฃผ๋ฉฐ, ์„œ๋ฒ„ ์žฌ์‹œ์ž‘์œผ๋กœ ๋กœ์ปฌ ์บ์‹œ๊ฐ€ ๋น„์›Œ์ง€๋”๋ผ๋„ ๋ถ„์‚ฐ ์บ์‹œ ๋•๋ถ„์— ๋น ๋ฅด๊ฒŒ ์บ์‹œ๋ฅผ ์›Œ๋ฐ์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.  
  • ๊ณผ์ œ: ๊ฐ€์žฅ ํฐ ๊ณผ์ œ๋Š” ๋กœ์ปฌ ์บ์‹œ ๊ฐ„์˜ ๋™๊ธฐํ™”์ด๋‹ค. ๋ถ„์‚ฐ ์บ์‹œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ, ๋ชจ๋“  ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์˜ ๋กœ์ปฌ ์บ์‹œ์— ์žˆ๋Š” ๊ตฌ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฌดํšจํ™”ํ•  ๊ฒƒ์ธ๊ฐ€์˜ ๋ฌธ์ œ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Redis์˜ Pub/Sub ๊ธฐ๋Šฅ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค์— ์บ์‹œ ๋ฌดํšจํ™” ๋ฉ”์‹œ์ง€๋ฅผ ์ „ํŒŒํ•˜๋Š” '๋ฐฑํ”Œ๋ ˆ์ธ(backplane)' ์ฑ„๋„์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.  

6. ์–ด๋–ค ์บ์‹œ๋ฅผ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€?

6.1. ์„ ํƒ์„ ์œ„ํ•œ ํ•ต์‹ฌ ์งˆ๋ฌธ

์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์งˆ๋ฌธ๋“ค์„ ์Šค์Šค๋กœ์—๊ฒŒ ๋˜์ ธ๋ณด์•„์•ผ ํ•œ๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ ๊ณ„ํš์€ ๋ฌด์—‡์ธ๊ฐ€? ํ˜„์žฌ ๋‹จ์ผ ์„œ๋ฒ„๋กœ ์šด์˜ ์ค‘์ด๋ฉฐ, ๊ฐ€๊นŒ์šด ๋ฏธ๋ž˜์—๋„ ์ˆ˜ํ‰ ํ™•์žฅ ๊ณ„ํš์ด ์—†๋Š”๊ฐ€? ์•„๋‹ˆ๋ฉด ์ดˆ๊ธฐ๋ถ€ํ„ฐ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์„ ์—ผ๋‘์— ๋‘๊ณ  ์žˆ๋Š”๊ฐ€?
  2. ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ ์š”๊ตฌ ์ˆ˜์ค€์€ ์–ด๋А ์ •๋„์ธ๊ฐ€? ๊ธˆ์œต ์ •๋ณด์ฒ˜๋Ÿผ 1์ดˆ์˜ ๋ถˆ์ผ์น˜๋„ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฐ•๋ ฅํ•œ ์ผ๊ด€์„ฑ์ด ํ•„์š”ํ•œ๊ฐ€? ์•„๋‹ˆ๋ฉด ์†Œ์…œ ๋ฏธ๋””์–ด ํ”ผ๋“œ์ฒ˜๋Ÿผ ๋ช‡ ์ดˆ ์ •๋„์˜ ์ง€์—ฐ์ด ํ—ˆ์šฉ๋˜๋Š” ์ตœ์ข…์  ์ผ๊ด€์„ฑ์œผ๋กœ ์ถฉ๋ถ„ํ•œ๊ฐ€?
  3. ์ฃผ์š” ์›Œํฌ๋กœ๋“œ๋Š” ์ฝ๊ธฐ ์ค‘์‹ฌ์ธ๊ฐ€, ์“ฐ๊ธฐ ์ค‘์‹ฌ์ธ๊ฐ€? ๋ฐ์ดํ„ฐ ์กฐํšŒ(Read)๊ฐ€ ์••๋„์ ์œผ๋กœ ๋งŽ์€๊ฐ€, ์•„๋‹ˆ๋ฉด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ(Write)์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๋Š”๊ฐ€?  
  4. ๋ฐ์ดํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š”๊ฐ€? ํ•œ๋ฒˆ ์บ์‹ฑ๋˜๋ฉด ๊ฑฐ์˜ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ์ˆ˜์‹œ๋กœ ๊ฐฑ์‹ ๋˜๋Š” ๋™์ ์ธ ๋ฐ์ดํ„ฐ์ธ๊ฐ€?  
  5. ์šด์˜ ๋ฐ ๊ด€๋ฆฌ ์—ญ๋Ÿ‰๊ณผ ์˜ˆ์‚ฐ์€ ์ถฉ๋ถ„ํ•œ๊ฐ€? ๋ณ„๋„์˜ ์บ์‹œ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  24/7 ์œ ์ง€๋ณด์ˆ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๋ ฅ๊ณผ ๋น„์šฉ์„ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

6.2. ์˜์‚ฌ๊ฒฐ์ • ๋งคํŠธ๋ฆญ์Šค

 ์œ„ ์งˆ๋ฌธ๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ ์บ์‹ฑ ์ „๋žต์˜ ํŠน์ง•์„ ์š”์•ฝํ•œ ์•„๋ž˜์˜ ์˜์‚ฌ๊ฒฐ์ • ๋งคํŠธ๋ฆญ์Šค๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ „๋žต์„ ๊ณ ๋ฏผํ•ด ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์˜์‚ฌ๊ฒฐ์ • ์š”์†Œ ๋กœ์ปฌ ์บ์‹œ (Local Cache) ๋ถ„์‚ฐ ์บ์‹œ (Distributed Cache) ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์บ์‹œ (Hybrid Cache)
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ทœ๋ชจ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์— ์ตœ์  ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค, ๋ถ„์‚ฐ/๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค, ํŠนํžˆ ์„ฑ๋Šฅ์— ๋งค์šฐ ๋ฏผ๊ฐํ•œ ๋Œ€๊ทœ๋ชจ ํ™˜๊ฒฝ
๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ๋‚ฎ์Œ (์ธ์Šคํ„ด์Šค ๊ฐ„ ๋ถˆ์ผ์น˜ ๋ฐœ์ƒ) ๋†’์Œ (์ค‘์•™ ์ €์žฅ์†Œ๋กœ ์ผ๊ด€์„ฑ ๋ณด์žฅ) ๋†’์Œ (๋ถ„์‚ฐ ์บ์‹œ๋ฅผ ํ†ตํ•ด ์ผ๊ด€์„ฑ ๋ณด์žฅ, ๋กœ์ปฌ ์บ์‹œ ๋™๊ธฐํ™” ํ•„์š”)
์„ฑ๋Šฅ (์ง€์—ฐ์‹œ๊ฐ„) ๋งค์šฐ ๋‚ฎ์Œ (๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์Œ) ๋‚ฎ์Œ (๋„คํŠธ์›Œํฌ ์ง€์—ฐ ๋ฐœ์ƒ) ๋งค์šฐ ๋‚ฎ์Œ (๋กœ์ปฌ ์บ์‹œ Hit) / ๋‚ฎ์Œ (๋ถ„์„  ์บ์‹œ Hit)
๋ฐ์ดํ„ฐ ํœ˜๋ฐœ์„ฑ ๋†’์Œ (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘ ์‹œ ์†Œ์‹ค) ๋‚ฎ์Œ (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋…๋ฆฝ์ , ์˜์†์„ฑ ์˜ต์…˜ ๊ฐ€๋Šฅ) ๋‚ฎ์Œ (๋ถ„์‚ฐ ์บ์‹œ ๋ฐ์ดํ„ฐ๋Š” ๋ณด์กด๋จ)
์šด์˜ ๋ณต์žก๋„ ๋งค์šฐ ๋‚ฎ์Œ (๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€๋กœ ๊ตฌํ˜„) ๋†’์Œ (๋ณ„๋„ ์ธํ”„๋ผ ๊ตฌ์ถ• ๋ฐ ๊ด€๋ฆฌ ํ•„์š”) ๋งค์šฐ ๋†’์Œ (๋กœ์ปฌ/๋ถ„์‚ฐ ์บ์‹œ ๊ด€๋ฆฌ ๋ฐ ๋™๊ธฐํ™” ๊ตฌํ˜„ ํ•„์š”)
๋น„์šฉ ๋งค์šฐ ๋‚ฎ์Œ (์ถ”๊ฐ€ ๋น„์šฉ ์—†์Œ) ๋†’์Œ (๋ณ„๋„ ์„œ๋ฒ„/์„œ๋น„์Šค ๋น„์šฉ ๋ฐœ์ƒ) ๋งค์šฐ ๋†’์Œ (๋ถ„์‚ฐ ์บ์‹œ + ์ถ”๊ฐ€ ๊ฐœ๋ฐœ/์šด์˜ ๋ฆฌ์†Œ์Šค)

 

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ:

https://medium.com/@ovkravindu95/in-process-cache-vs-centralized-cache-in-java-applications-4328d45c857b

 

In-Process Cache vs. Centralized Cache in Java Applications

Caching is a crucial technique for enhancing the performance of Java applications by storing frequently accessed data in a faster storage…

medium.com

https://blog.bytebytego.com/p/a-crash-course-in-caching-part-2

 

A Crash Course in Caching - Part 2

This is part 2 of the Crash Course in Caching series. Distributed cache A distributed cache stores frequently accessed data in memory across multiple nodes. The cached data is partitioned across many nodes, with each node only storing a portion of the cach

blog.bytebytego.com

https://toss.tech/article/cache-traffic-tip

 

์บ์‹œ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€์ด๋“œ - DB ๊ณผ๋ถ€ํ•˜ ๋ฐฉ์ง€ ์‹ค์ „ ํŒ

๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผํ•  ์œ„ํ—˜ ์ƒํ™ฉ๊ณผ ์˜ˆ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

toss.tech

https://dev.to/randazraik/microservices-caching-demystified-strategies-topologies-and-best-practices-43ad

 

Microservices Caching: Strategies, Topologies, and Best Practices

This article offers a thorough look at caching in microservices from the fundamental to more advanced...

dev.to

https://dev.to/mahmoud_nawwar_2024/hybrid-cache-strategy-in-spring-boot-a-guide-to-redisson-and-caffeine-integration-19g

 

Hybrid Cache Strategy in Spring Boot: A Guide to Redisson and Caffeine Integration

Introduction: The Need for Hybrid Caching In modern application development, performance...

dev.to

https://www.ibm.com/docs/ko/wxs/8.6.1?topic=topology-local-in-memory-cache

 

๋กœ์ปฌ ์ธ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ WebSphere® eXtreme Scale ์„ ๋กœ์ปฌ (๋น„๋ถ„์‚ฐ) ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ ์บ์‹œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์‚ฌ๋ก€์—์„œ ํŠนํžˆ, ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ก์„ธ์Šคํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋™์‹œ

www.ibm.com

 

728x90