Python์ LRU ์บ์ ๊ตฌํ์ ์ดํด๋ณด์ธ์. ์ด ๊ฐ์ด๋์์๋ ์ ์ญ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํจ์จ์ ์ธ ์บ์ฑ ์๋ฃจ์ ๊ตฌ์ถ์ ๋ํ ์ด๋ก , ์ค์ ์์ ๋ฐ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ์ ๋ค๋ฃน๋๋ค.
Python ์บ์ ๊ตฌํ: LRU(Least Recently Used) ์บ์ ์๊ณ ๋ฆฌ์ฆ ๋ง์คํฐํ๊ธฐ
์บ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ์ ์ธ ์ต์ ํ ๊ธฐ์ ์ ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๋๋ API ํธ์ถ๊ณผ ๊ฐ์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์์ ์ ์ฅํจ์ผ๋ก์จ ์ด๋ฌํ ์์ ์ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ ์คํํ์ง ์์๋ ๋๋ฏ๋ก ์๋นํ ์๋ ํฅ์๊ณผ ๋ฆฌ์์ค ์๋น ๊ฐ์๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋์์๋ Python์์ LRU(Least Recently Used) ์บ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ ์์ธํ ์ดํด๋ณด๊ณ ๊ธฐ๋ณธ ์๋ฆฌ, ์ค์ ์์ ๋ฐ ์ ์ญ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํจ์จ์ ์ธ ์บ์ฑ ์๋ฃจ์ ๊ตฌ์ถ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์์ธํ ์ดํด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์บ์ ๊ฐ๋ ์ดํด
LRU ์บ์๋ฅผ ์์ธํ ์ดํด๋ณด๊ธฐ ์ ์ ์บ์ฑ ๊ฐ๋ ์ ๋ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ๊ตฌ์ถํด ๋ณด๊ฒ ์ต๋๋ค.
- ์บ์ฑ์ด๋ ๋ฌด์์ ๋๊น? ์บ์ฑ์ ๋ ๋น ๋ฅธ ๊ฒ์์ ์ํด ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ฅ ์์น(์บ์)์ ์ ์ฅํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ, ๋์คํฌ ๋๋ CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ)์ ์์ ์ ์์ต๋๋ค.
- ์บ์ฑ์ด ์ค์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์บ์ฑ์ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ๋ฐฑ์๋ ์์คํ (๋ฐ์ดํฐ๋ฒ ์ด์ค, API)์ ๋ํ ๋ถํ๋ฅผ ๋ฎ์ถ๋ฉฐ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ๋ถ์ฐ ์์คํ ๋ฐ ํธ๋ํฝ์ด ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํนํ ์ค์ํฉ๋๋ค.
- ์บ์ ์ ๋ต: ๋ค์ํ ์บ์ ์ ๋ต์ด ์์ผ๋ฉฐ ๊ฐ ์ ๋ต์ ๋ค์ํ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค. ์ธ๊ธฐ์๋ ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Write-Through: ๋ฐ์ดํฐ๋ ์บ์์ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง์ ๋์์ ๊ธฐ๋ก๋ฉ๋๋ค.
- Write-Back: ๋ฐ์ดํฐ๋ ์บ์์ ์ฆ์ ๊ธฐ๋ก๋๊ณ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง์๋ ๋น๋๊ธฐ์ ์ผ๋ก ๊ธฐ๋ก๋ฉ๋๋ค.
- Read-Through: ์บ์๋ ์ฝ๊ธฐ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ์บ์ ์ ์ค์ด ๋ฐ์ํ๋ฉด ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง์ ์ก์ธ์คํ๊ณ ๋ฐ์ดํฐ๊ฐ ํ์์ ์ผ๋ก ์บ์๋ฉ๋๋ค.
- ์บ์ ์ ๊ฑฐ ์ ์ฑ : ์บ์๋ ์ฉ๋์ด ์ ํ๋์ด ์์ผ๋ฏ๋ก ์บ์๊ฐ ๊ฐ๋ ์ฐผ์ ๋ ์ ๊ฑฐ(์ ๊ฑฐ)ํ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐ์ ํ๋ ์ ์ฑ ์ด ํ์ํฉ๋๋ค. LRU๋ ์ด๋ฌํ ์ ์ฑ ์ค ํ๋์ด๋ฉฐ ์์ธํ ์ดํด๋ณผ ๊ฒ์ ๋๋ค. ๋ค๋ฅธ ์ ์ฑ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- FIFO(์ ์ ์ ์ถ): ์บ์์์ ๊ฐ์ฅ ์ค๋๋ ํญ๋ชฉ์ด ๋จผ์ ์ ๊ฑฐ๋ฉ๋๋ค.
- LFU(์ต์ ๋น๋ ์ฌ์ฉ): ๊ฐ์ฅ ์ ๊ฒ ์ฌ์ฉ๋ ํญ๋ชฉ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
- ์์ ๊ต์ฒด: ์์ ํญ๋ชฉ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
- ์๊ฐ ๊ธฐ๋ฐ ๋ง๋ฃ: ํญ๋ชฉ์ ํน์ ๊ธฐ๊ฐ(TTL - Time To Live) ํ์ ๋ง๋ฃ๋ฉ๋๋ค.
LRU(Least Recently Used) ์บ์ ์๊ณ ๋ฆฌ์ฆ
LRU ์บ์๋ ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ํจ๊ณผ์ ์ธ ์บ์ ์ ๊ฑฐ ์ ์ฑ ์ ๋๋ค. ํต์ฌ ์์น์ ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ์ง ์์ ํญ๋ชฉ์ ๋จผ์ ์ญ์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ง๊ด์ ์ธ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํญ๋ชฉ์ด ์ต๊ทผ์ ์ก์ธ์ค๋์ง ์์๋ค๋ฉด ๊ฐ๊น์ด ์ฅ๋์ ํ์ํ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค. LRU ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ํญ๋ชฉ์ด ๋ง์ง๋ง์ผ๋ก ์ฌ์ฉ๋ ์๊ธฐ๋ฅผ ์ถ์ ํ์ฌ ๋ฐ์ดํฐ ์ก์ธ์ค์ ์ต์ ์ฑ์ ์ ์งํฉ๋๋ค. ์บ์๊ฐ ์ฉ๋์ ๋๋ฌํ๋ฉด ๊ฐ์ฅ ์ค๋์ ์ ์ก์ธ์คํ ํญ๋ชฉ์ด ์ ๊ฑฐ๋ฉ๋๋ค.
LRU ์๋ ๋ฐฉ์
LRU ์บ์์ ๊ธฐ๋ณธ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Get(๊ฒ์): ํค์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๊ฒ์ํ๊ธฐ ์ํด ์์ฒญ์ด ์ด๋ฃจ์ด์ง๋ฉด:
- ์บ์์ ํค๊ฐ ์์ผ๋ฉด(์บ์ ์ ์ค) ๊ฐ์ด ๋ฐํ๋๊ณ ํค-๊ฐ ์์ด ์บ์์ ๋(๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉ๋จ)์ผ๋ก ์ด๋๋ฉ๋๋ค.
- ํค๊ฐ ์์ผ๋ฉด(์บ์ ๋๋ฝ) ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์์ค์ ์ก์ธ์คํ๊ณ ๊ฐ์ ๊ฒ์ํ๊ณ ํค-๊ฐ ์์ด ์บ์์ ์ถ๊ฐ๋ฉ๋๋ค. ์บ์๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ์ง ์์ ํญ๋ชฉ์ด ๋จผ์ ์ ๊ฑฐ๋ฉ๋๋ค.
- Put(์ฝ์ /์ ๋ฐ์ดํธ): ์ ํค-๊ฐ ์์ด ์ถ๊ฐ๋๊ฑฐ๋ ๊ธฐ์กด ํค์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋๋ฉด:
- ํค๊ฐ ์ด๋ฏธ ์์ผ๋ฉด ๊ฐ์ด ์ ๋ฐ์ดํธ๋๊ณ ํค-๊ฐ ์์ด ์บ์์ ๋์ผ๋ก ์ด๋๋ฉ๋๋ค.
- ํค๊ฐ ์์ผ๋ฉด ํค-๊ฐ ์์ด ์บ์์ ๋์ ์ถ๊ฐ๋ฉ๋๋ค. ์บ์๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ์ง ์์ ํญ๋ชฉ์ด ๋จผ์ ์ ๊ฑฐ๋ฉ๋๋ค.
LRU ์บ์๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์ฃผ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ํ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํด์ ๋งต(์ฌ์ ): ํค๊ฐ ์๋์ง ํ์ธํ๊ณ ํด๋น ๊ฐ์ ๊ฒ์ํ๊ธฐ ์ํด ๋น ๋ฅธ ์กฐํ(ํ๊ท O(1))์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก: ์ฌ์ฉ ๋น๋์ ๋ฐ๋ผ ํญ๋ชฉ ์์๋ฅผ ์ ์งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ ํญ๋ชฉ์ด ๋์ ์๊ณ ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ์ง ์์ ํญ๋ชฉ์ด ์ฒ์์ ์์ต๋๋ค. ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ์์ชฝ ๋์์ ํจ์จ์ ์ธ ์ฝ์ ๋ฐ ์ญ์ ๋ฅผ ํ์ฉํฉ๋๋ค.
LRU์ ์ด์
- ํจ์จ์ฑ: ๊ตฌํ์ด ๋น๊ต์ ๊ฐ๋จํ๊ณ ์ข์ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ์ ์์ฑ: ๋ณํํ๋ ์ก์ธ์ค ํจํด์ ์ ์ ์ํฉ๋๋ค. ์์ฃผ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ ์บ์์ ๋จ์์๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
- ๊ด๋ฒ์ํ ์ ์ฉ ๊ฐ๋ฅ์ฑ: ๊ด๋ฒ์ํ ์บ์ฑ ์๋๋ฆฌ์ค์ ์ ํฉํฉ๋๋ค.
์ ์ฌ์ ์ธ ๋จ์
- ์ฝ๋ ์คํํธ ๋ฌธ์ : ์บ์๊ฐ ์ฒ์์ ๋น์ด ์๊ณ (์ฝ๋) ์ฑ์์ผ ํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ์ค๋์ฑ: ์ก์ธ์ค ํจํด์ด ๋งค์ฐ ๋ถ๊ท์นํ ๊ฒฝ์ฐ(์: ์ง์ญ์ฑ์ด ์๋ ๋ง์ ํญ๋ชฉ์ ์์ฃผ ์ก์ธ์ค) ์บ์๊ฐ ์ ์ฉํ ๋ฐ์ดํฐ๋ฅผ ๋๋ฌด ์ผ์ฐ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
Python์์ LRU ์บ์ ๊ตฌํ
Python์ LRU ์บ์๋ฅผ ๊ตฌํํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ์ค ์ฌ์ ๊ณผ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ์ฌ์ฉํ๊ณ Python์ ๋ด์ฅ `functools.lru_cache` ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํ์ฉํ๋ ๋ ๊ฐ์ง ์ฃผ์ ์ ๊ทผ ๋ฐฉ์์ ์ดํด๋ด ๋๋ค.
๊ตฌํ 1: ์ฌ์ ๋ฐ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก ์ฌ์ฉ
์ด ์ ๊ทผ ๋ฐฉ์์ ์บ์์ ๋ด๋ถ ์๋์ ๋ํ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์บ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ฌ์ฉ์ ์ ์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
class Node:
def __init__(self, key, value):
self.key = key
self.value = value
self.prev = None
self.next = None
class LRUCache:
def __init__(self, capacity: int):
self.capacity = capacity
self.cache = {}
self.head = Node(0, 0) # Dummy head node
self.tail = Node(0, 0) # Dummy tail node
self.head.next = self.tail
self.tail.prev = self.head
def _add_node(self, node: Node):
"""Inserts node right after the head."""
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def _remove_node(self, node: Node):
"""Removes node from the list."""
prev = node.prev
next_node = node.next
prev.next = next_node
next_node.prev = prev
def _move_to_head(self, node: Node):
"""Moves node to the head."""
self._remove_node(node)
self._add_node(node)
def get(self, key: int) -> int:
if key in self.cache:
node = self.cache[key]
self._move_to_head(node)
return node.value
return -1
def put(self, key: int, value: int) -> None:
if key in self.cache:
node = self.cache[key]
node.value = value
self._move_to_head(node)
else:
node = Node(key, value)
self.cache[key] = node
self._add_node(node)
if len(self.cache) > self.capacity:
# Remove the least recently used node (at the tail)
tail_node = self.tail.prev
self._remove_node(tail_node)
del self.cache[tail_node.key]
์ค๋ช :
- `Node` ํด๋์ค: ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก์ ๋ ธ๋๋ฅผ ๋ํ๋ ๋๋ค.
- `LRUCache` ํด๋์ค:
- `__init__(self, capacity)`: ์ง์ ๋ ์ฉ๋, ํค-๊ฐ ์(๋ ธ๋ ํฌํจ)์ ์ ์ฅํ๋ ์ฌ์ (`self.cache`), ๋ชฉ๋ก ์์ ์ ๋จ์ํํ๊ธฐ ์ํ ๋๋ฏธ ํค๋ ๋ฐ ํ ์ผ ๋ ธ๋๋ก ์บ์๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- `_add_node(self, node)`: ํค๋ ๋ฐ๋ก ๋ค์ ๋ ธ๋๋ฅผ ์ฝ์ ํฉ๋๋ค.
- `_remove_node(self, node)`: ๋ชฉ๋ก์์ ๋ ธ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- `_move_to_head(self, node)`: ๋ ธ๋๋ฅผ ๋ชฉ๋ก์ ๋งจ ์์ผ๋ก ์ด๋ํฉ๋๋ค(๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ํ์).
- `get(self, key)`: ํค์ ์ฐ๊ฒฐ๋ ๊ฐ์ ๊ฒ์ํฉ๋๋ค. ํค๊ฐ ์์ผ๋ฉด ํด๋น ๋ ธ๋๋ฅผ ๋ชฉ๋ก์ ๋งจ ์์ผ๋ก ์ด๋ํ๊ณ (์ต๊ทผ ์ฌ์ฉ์ผ๋ก ํ์) ํด๋น ๊ฐ์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด -1(๋๋ ์ ์ ํ ์ผํฐ๋ฌ ๊ฐ)์ ๋ฐํํฉ๋๋ค.
- `put(self, key, value)`: ํค-๊ฐ ์์ ์บ์์ ์ถ๊ฐํฉ๋๋ค. ํค๊ฐ ์ด๋ฏธ ์์ผ๋ฉด ๊ฐ์ ์ ๋ฐ์ดํธํ๊ณ ๋ ธ๋๋ฅผ ํค๋๋ก ์ด๋ํฉ๋๋ค. ํค๊ฐ ์์ผ๋ฉด ์ ๋ ธ๋๋ฅผ ๋ง๋ค๊ณ ํค๋์ ์ถ๊ฐํฉ๋๋ค. ์บ์๊ฐ ์ฉ๋์ ๋๋ฌํ๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ์ง ์์ ๋ ธ๋(๋ชฉ๋ก์ ๊ผฌ๋ฆฌ)๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
์ฌ์ฉ ์:
cache = LRUCache(2)
cache.put(1, 1)
cache.put(2, 2)
print(cache.get(1)) # returns 1
cache.put(3, 3) # evicts key 2
print(cache.get(2)) # returns -1 (not found)
cache.put(4, 4) # evicts key 1
print(cache.get(1)) # returns -1 (not found)
print(cache.get(3)) # returns 3
print(cache.get(4)) # returns 4
๊ตฌํ 2: `functools.lru_cache` ๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉ
Python์ `functools` ๋ชจ๋์ ๊ตฌํ์ ํฌ๊ฒ ๋จ์ํํ๋ ๋ด์ฅ ๋ฐ์ฝ๋ ์ดํฐ์ธ `lru_cache`๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๋ฐ์ฝ๋ ์ดํฐ๋ ์บ์ ๊ด๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ๊ฐ๊ฒฐํ๊ณ ์ข ์ข ์ ํธ๋๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค.
from functools import lru_cache
@lru_cache(maxsize=128) # You can adjust the cache size (e.g., maxsize=512)
def get_data(key):
# Simulate an expensive operation (e.g., database query, API call)
print(f"Fetching data for key: {key}")
# Replace with your actual data retrieval logic
return f"Data for {key}"
# Example Usage:
print(get_data(1))
print(get_data(2))
print(get_data(1)) # Cache hit - no "Fetching data" message
print(get_data(3))
์ค๋ช :
- `from functools import lru_cache`: `lru_cache` ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- `@lru_cache(maxsize=128)`: `get_data` ํจ์์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
maxsize๋ ์บ์์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค.maxsize=None์ธ ๊ฒฝ์ฐ LRU ์บ์๋ ์ ํ ์์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค. ์์ ์บ์๋ ํญ๋ชฉ์ ์ ์ฉํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ์กฐ๊ฑด๊ณผ ์์ ๋ฐ์ดํฐ ์ฌ์ฉ๋์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋ฆฌ์ ์ธ maxsize๋ฅผ ์ค์ ํ์ญ์์ค. ๊ธฐ๋ณธ๊ฐ์ 128์ ๋๋ค. - `def get_data(key):`: ์บ์ํ ํจ์์ ๋๋ค. ์ด ํจ์๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ๋ํ๋ ๋๋ค.
- ๋ฐ์ฝ๋ ์ดํฐ๋ ์
๋ ฅ ์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก `get_data`์ ๋ฐํ ๊ฐ์ ์๋์ผ๋ก ์บ์ํฉ๋๋ค(์ด ์์์๋
key). - `get_data`๊ฐ ๋์ผํ ํค๋ก ํธ์ถ๋๋ฉด ํจ์๋ฅผ ๋ค์ ์คํํ๋ ๋์ ์บ์๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ฉ๋๋ค.
`lru_cache` ์ฌ์ฉ์ ์ด์ :
- ๋จ์์ฑ: ์ต์ํ์ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค.
- ๊ฐ๋ ์ฑ: ์บ์ฑ์ ๋ช ์์ ์ด๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ํจ์จ์ฑ: `lru_cache` ๋ฐ์ฝ๋ ์ดํฐ๋ ์ฑ๋ฅ์ ๋งค์ฐ ์ต์ ํ๋์ด ์์ต๋๋ค.
- ํต๊ณ: ๋ฐ์ฝ๋ ์ดํฐ๋ `cache_info()` ๋ฉ์๋๋ฅผ ํตํด ์บ์ ์ ์ค, ๋๋ฝ ๋ฐ ํฌ๊ธฐ์ ๋ํ ํต๊ณ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์บ์ ํต๊ณ ์ฌ์ฉ ์:
print(get_data.cache_info())
print(get_data(1))
print(get_data(1))
print(get_data.cache_info())
์ด๋ ๊ฒ ํ๋ฉด ์บ์ ์ ์ค ์ ํ์ ์บ์ ํต๊ณ๊ฐ ์ถ๋ ฅ๋์ด ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ฏธ์ธ ์กฐ์ ์ ํ ์ ์์ต๋๋ค.
๋น๊ต: ์ฌ์ + ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก ๋ `lru_cache`
| ๊ธฐ๋ฅ | ์ฌ์ + ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก | functools.lru_cache |
|---|---|---|
| ๊ตฌํ ๋ณต์ก์ฑ | ๋ ๋ณต์กํจ(์ฌ์ฉ์ ์ ์ ํด๋์ค ์์ฑ ํ์) | ๊ฐ๋จํจ(๋ฐ์ฝ๋ ์ดํฐ ์ฌ์ฉ) |
| ์ ์ด | ์บ์ ๋์์ ๋ํ ๋ ์ธ๋ถํ๋ ์ ์ด | ๋ ์ ์ ์ ์ด(๋ฐ์ฝ๋ ์ดํฐ์ ๊ตฌํ์ ์์กด) |
| ์ฝ๋ ๊ฐ๋ ์ฑ | ์ฝ๋๊ฐ ์ ๊ตฌ์ฑ๋์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ | ๊ฐ๋ ์ฑ์ด ๋๊ณ ๋ช ์์ ์ |
| ์ฑ๋ฅ | ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๊ด๋ฆฌ๋ก ์ธํด ์ฝ๊ฐ ๋๋ฆด ์ ์์ต๋๋ค. `lru_cache` ๋ฐ์ฝ๋ ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ๋งค์ฐ ํจ์จ์ ์ ๋๋ค. | ๊ณ ๋๋ก ์ต์ ํ๋จ; ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ด๋ ์ฑ๋ฅ |
| ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ | ์์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ด๋ฆฌ ํ์ | ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ์ง๋ง maxsize์ ์ ์ํ์ญ์์ค. |
๊ถ์ฅ ์ฌํญ: ๋๋ถ๋ถ์ ์ฌ์ฉ ์ฌ๋ก์์ `functools.lru_cache` ๋ฐ์ฝ๋ ์ดํฐ๋ ๋จ์์ฑ, ๊ฐ๋ ์ฑ ๋ฐ ์ฑ๋ฅ์ผ๋ก ์ธํด ์ ํธ๋๋ ์ ํ์ ๋๋ค. ๊ทธ๋ฌ๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ๋ํ ๋งค์ฐ ์ธ๋ถํ๋ ์ ์ด๊ฐ ํ์ํ๊ฑฐ๋ ํน์ํ ์๊ตฌ ์ฌํญ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ + ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก ๊ตฌํ์ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๊ณ ๊ธ ๊ณ ๋ ค ์ฌํญ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
์บ์ ๋ฌดํจํ
์บ์ ๋ฌดํจํ๋ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์์ค๊ฐ ๋ณ๊ฒฝ๋ ๋ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ํ๋ก์ธ์ค์ ๋๋ค. ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๋ช ๊ฐ์ง ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- TTL(Time-To-Live): ์บ์๋ ํญ๋ชฉ์ ๋ํ ๋ง๋ฃ ์๊ฐ์ ์ค์ ํฉ๋๋ค. TTL์ด ๋ง๋ฃ๋๋ฉด ์บ์ ํญ๋ชฉ์ ์ ํจํ์ง ์์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๊ณ ์ก์ธ์คํ ๋ ์๋ก ๊ณ ์ณ์ง๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๋ฐ์ดํฐ์ ์ ๋ฐ์ดํธ ๋น๋์ ํ์ฉ ๊ฐ๋ฅํ ๋ถ์ค ์์ค์ ๊ณ ๋ คํ์ญ์์ค.
- ์ฃผ๋ฌธํ ๋ฌดํจํ: ๊ธฐ๋ณธ ๋ฐ์ดํฐ๊ฐ ์์ ๋ ๋(์: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ฝ๋๊ฐ ์ ๋ฐ์ดํธ๋ ๋) ์บ์ ํญ๋ชฉ์ ๋ฌดํจํํ๋ ๋ ผ๋ฆฌ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ ๋๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ข ์ข ๋ฌ์ฑ๋ฉ๋๋ค.
- Write-Through ์บ์ฑ(๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง): Write-Through ์บ์ฑ์ ์ฌ์ฉํ๋ฉด ์บ์์ ๋ํ ๋ชจ๋ ์ฐ๊ธฐ๊ฐ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ์ฅ์(๋ฐ์ดํฐ๋ฒ ์ด์ค, API)์๋ ์ฐ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฆ๊ฐ์ ์ธ ์ผ๊ด์ฑ์ด ์ ์ง๋์ง๋ง ์ฐ๊ธฐ ๋๊ธฐ ์๊ฐ์ด ๋์ด๋ฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ๋ฌดํจํ ์ ๋ต์ ์ ํํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ๋น๋์ ํ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๋ถ์ค ์์ค์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์บ์๊ฐ ๋ค์ํ ์์ค(์: ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ๋ ์ฌ์ฉ์, ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค, ์ธ๋ถ API ์ ๋ฐ์ดํธ)์ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์บ์ ํฌ๊ธฐ ์กฐ์
์ต์ ์ ์บ์ ํฌ๊ธฐ(`lru_cache`์ maxsize)๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ, ๋ฐ์ดํฐ ์ก์ธ์ค ํจํด ๋ฐ ์บ์๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ๊ฐ์ ์์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์บ์๊ฐ ๋๋ฌด ์์ผ๋ฉด ์บ์ ๋๋ฝ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ์ฌ ์บ์ฑ ๋ชฉ์ ์ด ๋ฌด์ํด์ง๋๋ค. ์บ์๊ฐ ๋๋ฌด ํฌ๋ฉด ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๊ณ ์บ์๊ฐ ์ง์์ ์ผ๋ก ๊ฐ๋น์ง ์์ง๋๊ฑฐ๋ ์์
์งํฉ์ด ์๋ฒ์ ๋ฌผ๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ณผํ๋ ๊ฒฝ์ฐ ์ ์ฒด ์์คํ
์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค.
- ์บ์ ์ ์ค/๋๋ฝ ๋น์จ ๋ชจ๋ํฐ๋ง: `cache_info()`(
lru_cache์ ๊ฒฝ์ฐ) ๋๋ ์ฌ์ฉ์ ์ง์ ๋ก๊น ๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์บ์ ์ ์ค๋ฅ ์ ์ถ์ ํฉ๋๋ค. ๋ฎ์ ์ ์ค๋ฅ ์ ์์ ์บ์ ๋๋ ์บ์์ ๋นํจ์จ์ ์ธ ์ฌ์ฉ์ ๋ํ๋ ๋๋ค. - ๋ฐ์ดํฐ ํฌ๊ธฐ ๊ณ ๋ ค: ์บ์๋ ๋ฐ์ดํฐ ํญ๋ชฉ์ด ํฐ ๊ฒฝ์ฐ ๋ ์์ ์บ์ ํฌ๊ธฐ๊ฐ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
- ์คํ ๋ฐ ๋ฐ๋ณต: ๋จ์ผ "๋ง๋ฒ" ์บ์ ํฌ๊ธฐ๋ ์์ต๋๋ค. ๋ค์ํ ํฌ๊ธฐ๋ก ์คํํ๊ณ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉํ ์ต์ ์ ์ง์ ์ ์ฐพ์ผ์ญ์์ค. ํ์ค์ ์ธ ์ํฌ๋ก๋์์ ๋ค์ํ ์บ์ ํฌ๊ธฐ๋ก ์ฑ๋ฅ์ด ์ด๋ป๊ฒ ๋ณํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ถํ ํ ์คํธ๋ฅผ ์ํํ์ญ์์ค.
- ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ ์กฐ๊ฑด: ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ์๊ณ ์์ด์ผ ํฉ๋๋ค. ํนํ ๋ฆฌ์์ค ์ ํ์ด ์๋ ํ๊ฒฝ(์: ํด๋ผ์ฐ๋ ๊ธฐ๋ฅ ๋๋ ์ปจํ ์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์ )์์ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ฐฉ์งํ์ฌ ์ฑ๋ฅ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ ํ์ฉ๋ฅ ์ ๋ชจ๋ํฐ๋งํ์ฌ ์บ์ฑ ์ ๋ต์ด ์๋ฒ ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง ์๋์ง ํ์ธํ์ญ์์ค.
์ค๋ ๋ ์์
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉํฐ์ค๋ ๋์ธ ๊ฒฝ์ฐ ์บ์ ๊ตฌํ์ด ์ค๋ ๋ ์์ ์ธ์ง ํ์ธํ์ญ์์ค. ์ฆ, ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ฐ์ดํฐ ์์ ๋๋ ๊ฒฝ์ ์กฐ๊ฑด์ ์ผ์ผํค์ง ์๊ณ ๋์์ ์บ์์ ์ก์ธ์คํ๊ณ ์์ ํ ์ ์์ต๋๋ค. `lru_cache` ๋ฐ์ฝ๋ ์ดํฐ๋ ์ค๊ณ์ ์ค๋ ๋ ์์ ์ด์ง๋ง ์์ฒด ์บ์๋ฅผ ๊ตฌํํ๋ ๊ฒฝ์ฐ ์ค๋ ๋ ์์ ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์ ์ ์ ๊ตฌํ์์ ์บ์์ ๋ด๋ถ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ๋ณดํธํ๊ธฐ ์ํด `threading.Lock` ๋๋ `multiprocessing.Lock`์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๋ฐ์ดํฐ ์์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค๋ ๋๊ฐ ์ด๋ป๊ฒ ์ํธ ์์ฉํ ์ง ์ ์คํ๊ฒ ๋ถ์ํ์ญ์์ค.
์บ์ ์ง๋ ฌํ ๋ฐ ์๊ตฌ ์ ์ฅ
๊ฒฝ์ฐ์ ๋ฐ๋ผ ์บ์ ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ ๋๋ ๋ค๋ฅธ ์ ์ฅ ๋ฉ์ปค๋์ฆ์ ์๊ตฌ ์ ์ฅํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ฒ๋ฅผ ๋ค์ ์์ํ ํ ์บ์๋ฅผ ๋ณต์ํ๊ฑฐ๋ ์ฌ๋ฌ ํ๋ก์ธ์ค์์ ์บ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์บ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ๊ฐ๋ฅํ ํ์์ผ๋ก ๋ณํํ๋ ค๋ฉด ์ง๋ ฌํ ๊ธฐ์ (์: JSON, pickle)์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ํ์ผ, ๋ฐ์ดํฐ๋ฒ ์ด์ค(Redis ๋๋ Memcached์ ๊ฐ์) ๋๋ ๊ธฐํ ์ ์ฅ ์๋ฃจ์ ์ ์ฌ์ฉํ์ฌ ์บ์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ ์ ์์ต๋๋ค.
์ฃผ์: ์ ๋ขฐํ ์ ์๋ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ ํผํด์ ๋ณด์ ์ทจ์ฝ์ ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ์ ๊ณตํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋๋ ์ญ์ง๋ ฌํ์ ํนํ ์ฃผ์ํ์ญ์์ค.
๋ถ์ฐ ์บ์ฑ
๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ถ์ฐ ์บ์ฑ ์๋ฃจ์ ์ด ํ์ํ ์ ์์ต๋๋ค. Redis ๋๋ Memcached์ ๊ฐ์ ๋ถ์ฐ ์บ์๋ ์ฌ๋ฌ ์๋ฒ์ ์บ์๋ฅผ ๋ถ์ฐํ์ฌ ์ํ์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค. ์ข ์ข ์บ์ ์ ๊ฑฐ, ๋ฐ์ดํฐ ์๊ตฌ ์ ์ฅ ๋ฐ ๊ณ ๊ฐ์ฉ์ฑ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ถ์ฐ ์บ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์บ์ ์๋ฒ๋ก ์คํ๋ก๋ํ์ฌ ๊ธฐ๋ณธ ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ์์ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค.
Python๊ณผ ๋ถ์ฐ ์บ์๋ฅผ ํตํฉํ๋ ค๋ฉด ํน์ ์บ์ ๊ธฐ์ ์ ๋ํ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(`Redis์ ๋ํ redis-py`, `Memcached์ ๋ํ pymemcache`)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ์ข ํฌํจ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์บ์ ์๋ฒ์ ๋ํ ์ฐ๊ฒฐ์ ๊ตฌ์ฑํ๊ณ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ API๋ฅผ ์ฌ์ฉํ์ฌ ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฒ์ํฉ๋๋ค.
์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์บ์ฑ
์บ์ฑ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ด์์ ๋๋ค. LRU ์บ์๋ฅผ ๋ค์ํ ์์ค์์ ์ ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์บ์ฑ: ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํฉ๋๋ค.
- API ์๋ต ์บ์ฑ: ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ API ํธ์ถ ๋น์ฉ์ ์ค์ด๊ธฐ ์ํด ์ธ๋ถ API์ ์๋ต์ ์บ์ํฉ๋๋ค.
- ํ ํ๋ฆฟ ๋ ๋๋ง ์บ์ฑ: ํ ํ๋ฆฟ์ ๋ ๋๋ง๋ ์ถ๋ ฅ์ ์บ์ํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ ์์ฑํ์ง ์๋๋ก ํฉ๋๋ค. Django ๋ฐ Flask์ ๊ฐ์ ํ๋ ์์ํฌ๋ ์ข ์ข ์บ์ ๊ณต๊ธ์(์: Redis, Memcached)์ ํตํฉ๋ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ๋ด์ฅํ๊ณ ์ ๊ณตํฉ๋๋ค.
- CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ) ์บ์ฑ: ์๋ ์๋ฒ์์ ์ง๋ฆฌ์ ์ผ๋ก ๋ฉ๋ฆฌ ๋จ์ด์ง ์ฌ์ฉ์์ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ธฐ ์ํด CDN์์ ์ ์ ์์ฐ(์ด๋ฏธ์ง, CSS, JavaScript)์ ์ ๊ณตํฉ๋๋ค. CDN์ ์ ์ญ ์ฝํ ์ธ ์ ์ก์ ํนํ ํจ๊ณผ์ ์ ๋๋ค.
์ต์ ํํ๋ ค๋ ํน์ ๋ฆฌ์์ค์ ์ ํฉํ ์บ์ฑ ์ ๋ต(์: ๋ธ๋ผ์ฐ์ ์บ์ฑ, ์๋ฒ์ธก ์บ์ฑ, CDN ์บ์ฑ)์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ๋ง์ ์ต์ ์น ํ๋ ์์ํฌ๋ ์บ์ฑ ์ ๋ต๊ณผ ์บ์ ๊ณต๊ธ์(์: Redis ๋๋ Memcached)์์ ํตํฉ์ ์ํ ๋ด์ฅ ์ง์ ๋ฐ ์ฌ์ด ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
LRU ์บ์๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์๋๋ฆฌ์ค์์ ์ฌ์ฉ๋ฉ๋๋ค.
- ์น ์๋ฒ: ์๋ต ์๊ฐ์ ๊ฐ์ ํ๊ณ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํด ์์ฃผ ์ก์ธ์คํ๋ ์น ํ์ด์ง, API ์๋ต ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํฉ๋๋ค. ๋ง์ ์น ์๋ฒ(์: Nginx, Apache)์๋ ์บ์ฑ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ ์์คํ ์ LRU ๋ฐ ๊ธฐํ ์บ์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ(์: ๋ฒํผ ํ)์์ ์์ฃผ ์ก์ธ์คํ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ์บ์ํฉ๋๋ค.
- ์ด์ ์ฒด์ : ์ด์ ์ฒด์ ๋ ํ์ผ ์์คํ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ๋์คํฌ ๋ธ๋ก ์บ์ฑ๊ณผ ๊ฐ์ ๋ค์ํ ๋ชฉ์ ์ผ๋ก ์บ์ฑ์ ์ฌ์ฉํฉ๋๋ค.
- ์ด๋ฏธ์ง ์ฒ๋ฆฌ: ์ด๋ฏธ์ง ๋ณํ ๋ฐ ํฌ๊ธฐ ์กฐ์ ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํฉ๋๋ค.
- ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN): CDN์ ์บ์ฑ์ ํ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์ง๋ฆฌ์ ์ผ๋ก ๋ ๊ฐ๊น์ด ์๋ฒ์์ ์ ์ ์ฝํ ์ธ (์ด๋ฏธ์ง, ๋น๋์ค, CSS, JavaScript)๋ฅผ ์ ๊ณตํ์ฌ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ํ์ด์ง ๋ก๋ ์๊ฐ์ ๊ฐ์ ํฉ๋๋ค.
- ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ: ๋ชจ๋ธ ํ๋ จ ๋๋ ์ถ๋ก ์ค์ ์ค๊ฐ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํฉ๋๋ค(์: TensorFlow ๋๋ PyTorch์์).
- API ๊ฒ์ดํธ์จ์ด: API๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด API ์๋ต์ ์บ์ํฉ๋๋ค.
- ์ ์ ์๊ฑฐ๋ ํ๋ซํผ: ์ ํ ์ ๋ณด, ์ฌ์ฉ์ ๋ฐ์ดํฐ ๋ฐ ์ผํ ์นดํธ ์ธ๋ถ ์ ๋ณด๋ฅผ ์บ์ํ์ฌ ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ์์ ๋ฏธ๋์ด ํ๋ซํผ: ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ฌ์ฉ์ ํ์๋ผ์ธ, ํ๋กํ ๋ฐ์ดํฐ ๋ฐ ๊ธฐํ ์์ฃผ ์ก์ธ์คํ๋ ์ฝํ ์ธ ๋ฅผ ์บ์ํฉ๋๋ค. Twitter ๋ฐ Facebook๊ณผ ๊ฐ์ ํ๋ซํผ์ ์บ์ฑ์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
- ๊ธ์ต ์ ํ๋ฆฌ์ผ์ด์ : ๊ฑฐ๋ ์์คํ ์ ์๋ต์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ค์๊ฐ ์์ฅ ๋ฐ์ดํฐ ๋ฐ ๊ธฐํ ๊ธ์ต ์ ๋ณด๋ฅผ ์บ์ํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ด์ ์์ : ๊ธ๋ก๋ฒ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ LRU ์บ์๋ฅผ ํ์ฉํ์ฌ ์์ฃผ ์ก์ธ์คํ๋ ์ ํ ์นดํ๋ก๊ทธ, ์ฌ์ฉ์ ํ๋กํ ๋ฐ ์ผํ ์นดํธ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋๊ธฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ฌ ํนํ ์ ์ ์๊ฑฐ๋ ํ๋ซํผ์ด ๋ค์ํ ์ธํฐ๋ท ์๋์ ์ง๋ฆฌ์ ์์น๋ฅผ ๊ฐ์ง ์ฌ์ฉ์์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ ๋ถ๋๋ฝ๊ณ ๋น ๋ฅธ ๋ธ๋ผ์ฐ์ง ๋ฐ ๊ตฌ๋งค ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ ๋ฐ ์ต์ ํ
LRU ์บ์๋ ์ผ๋ฐ์ ์ผ๋ก ํจ์จ์ ์ด์ง๋ง ์ต์ ์ ์ฑ๋ฅ์ ์ํด ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ์ธก๋ฉด์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ํ: ๋ ผ์๋ ๋ฐ์ ๊ฐ์ด ์ฌ์ฉ์ ์ ์ LRU ๊ตฌํ์ ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ(์ฌ์ ๋ฐ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก)์ ์ ํ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํด์ ๋งต์ ๋น ๋ฅธ ์กฐํ๋ฅผ ์ ๊ณตํ์ง๋ง ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ชฉ๋ก์์ ์ฝ์ ๋ฐ ์ญ์ ์ ๊ฐ์ ์์ ์ ๋น์ฉ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
- ์บ์ ๊ฒฝํฉ: ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์บ์์ ์ก์ธ์คํ๊ณ ์์ ํ๋ ค๊ณ ์๋ํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ๊ฒฝํฉ์ด ๋ฐ์ํ์ฌ ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค. ์ ์ ํ ์ ๊ธ ๋ฉ์ปค๋์ฆ(`threading.Lock`์ ๊ฐ์) ๋๋ ์ ๊ธ ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- ์บ์ ํฌ๊ธฐ ์กฐ์ (์ฌ๊ฒํ ): ์์์ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด ์ต์ ์ ์บ์ ํฌ๊ธฐ๋ฅผ ์ฐพ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์บ์๊ฐ ๋๋ฌด ์์ผ๋ฉด ์ฆ์ ๋ฏธ์ค๊ฐ ๋ฐ์ํฉ๋๋ค. ์บ์๊ฐ ๋๋ฌด ํฌ๋ฉด ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๊ณ ๊ฐ๋น์ง ์์ง์ผ๋ก ์ธํด ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค. ์บ์ ์ ์ค/๋๋ฝ ๋น์จ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ง๋ ฌํ ์ค๋ฒํค๋: ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํํด์ผ ํ๋ ๊ฒฝ์ฐ(์: ๋์คํฌ ๊ธฐ๋ฐ ์บ์ฑ) ์ง๋ ฌํ ํ๋ก์ธ์ค์ ์ฑ๋ฅ ์ํฅ์ ๊ณ ๋ คํ์ญ์์ค. ๋ฐ์ดํฐ ๋ฐ ์ฌ์ฉ ์ฌ๋ก์ ํจ์จ์ ์ธ ์ง๋ ฌํ ํ์(์: JSON, ํ๋กํ ์ฝ ๋ฒํผ)์ ์ ํํ์ญ์์ค.
- ์บ์ ์ธ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ: ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ ์์๋ก ์์ฃผ ์ก์ธ์คํ๋ ๊ฒฝ์ฐ ์บ์ฑ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ํจ์จ์ฑ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
ํ๋กํ์ผ๋ง ๋ฐ ๋ฒค์น๋งํน
ํ๋กํ์ผ๋ง ๋ฐ ๋ฒค์น๋งํน์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์บ์ ๊ตฌํ์ ์ต์ ํํ๋ ๋ฐ ํ์์ ์ ๋๋ค. Python์ ์บ์ ์์ ์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ `cProfile` ๋ฐ `timeit`๊ณผ ๊ฐ์ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์บ์ ํฌ๊ธฐ์ ๋ค์ํ ๋ฐ์ดํฐ ์ก์ธ์ค ํจํด์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ญ์์ค. ๋ฒค์น๋งํน์๋ ํ์ค์ ์ธ ์ํฌ๋ก๋์์ ๋ค์ํ ์บ์ ๊ตฌํ(์: ์ฌ์ฉ์ ์ ์ LRU ๋ `lru_cache`)์ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
๊ฒฐ๋ก
LRU ์บ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. LRU ์๊ณ ๋ฆฌ์ฆ, ์ฌ์ฉ ๊ฐ๋ฅํ Python ๊ตฌํ(`lru_cache` ๋ฐ ์ฌ์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ชฉ๋ก์ ์ฌ์ฉํ๋ ์ฌ์ฉ์ ์ ์ ๊ตฌํ) ๋ฐ ์ฃผ์ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ์ ์ดํดํ๋ ๊ฒ์ ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
์ฃผ์ ๋ด์ฉ:
- ์ฌ๋ฐ๋ฅธ ๊ตฌํ ์ ํ: ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋จ์์ฑ๊ณผ ์ฑ๋ฅ์ผ๋ก ์ธํด `functools.lru_cache`๊ฐ ์ต์์ ์ต์ ์ ๋๋ค.
- ์บ์ ๋ฌดํจํ ์ดํด: ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์บ์ ๋ฌดํจํ ์ ๋ต์ ๊ตฌํํฉ๋๋ค.
- ์บ์ ํฌ๊ธฐ ์กฐ์ : ์บ์ ์ ์ค/๋๋ฝ ๋น์จ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ์ฌ ์บ์ ํฌ๊ธฐ๋ฅผ ์ต์ ํํฉ๋๋ค.
- ์ค๋ ๋ ์์ ๊ณ ๋ ค: ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉํฐ์ค๋ ๋์ธ ๊ฒฝ์ฐ ์บ์ ๊ตฌํ์ด ์ค๋ ๋ ์์ ์ธ์ง ํ์ธํฉ๋๋ค.
- ํ๋กํ์ผ๋ง ๋ฐ ๋ฒค์น๋งํน: ํ๋กํ์ผ๋ง ๋ฐ ๋ฒค์น๋งํน ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์บ์ ๊ตฌํ์ ์ต์ ํํฉ๋๋ค.
์ด ๊ฐ์ด๋์ ์ ์๋ ๊ฐ๋ ๊ณผ ๊ธฐ์ ์ ๋ง์คํฐํจ์ผ๋ก์จ LRU ์บ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ์ ์ธ๊ณ ๊ณ ๊ฐ์๊ฒ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๋ ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ถ๊ฐ ํ์:
- ๋์ฒด ์บ์ ์ ๊ฑฐ ์ ์ฑ (FIFO, LFU ๋ฑ)์ ํ์ํฉ๋๋ค.
- ๋ถ์ฐ ์บ์ฑ ์๋ฃจ์ (Redis, Memcached) ์ฌ์ฉ์ ์กฐ์ฌํฉ๋๋ค.
- ์บ์ ์๊ตฌ ์ ์ฅ์ ์ํ ๋ค์ํ ์ง๋ ฌํ ํ์์ ์คํํฉ๋๋ค.
- ์บ์ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ์บ์ ๋ถํ ๊ณผ ๊ฐ์ ๊ณ ๊ธ ์บ์ ์ต์ ํ ๊ธฐ์ ์ ์ฐ๊ตฌํฉ๋๋ค.