๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Back
NestJs
40-Cache

1. ์บ์‹ฑ

์บ์‹ฑ์ด ์™œ ํ•„์š”ํ•œ๊ฐ€?


1.1 ์บ์‹ฑ์˜ ์‚ฌ์šฉ์ฒ˜

  • ๋žญํ‚น ์‹œ์Šคํ…œ ์ตœ์‹  ์˜ํ™”, ์ธ๊ธฐ ์˜ํ™” ๋“ฑ
  • ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋ฐ์ดํ„ฐ ์„ธ์…˜ ์ •๋ณด ์ €์žฅ, ํ† ํฐ ๊ฒ€์ฆ ํ”„๋กœ์„ธ์Šค ์Šคํ‚ต, ํ† ํฐ ๋ฐด
  • ๋ณ€ํ™”๊ฐ€ ์ ์€ ๋ฐ์ดํ„ฐ ์บ์‹ฑ ์˜ํ™” ์ƒ์„ธ๋‚ด์šฉ
  • ์™ธ๋ถ€ API ์บ์‹ฑ ์™ธ๋ถ€ API ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•ด์„œ ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ ๋น„์šฉ ์ ˆ๊ฐ
  • Rate Limiting, Throttling ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ํšŸ์ˆ˜๋ฅผ ์บ์‹ฑํ•œ ํ›„ ํŠน์ • ํšŸ์ˆ˜๋ฅผ ๋„˜์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ ํ•  ์ˆ˜ ์žˆ๋‹ค

1.2 ์บ์‹ฑ์˜ ์žฅ์ 

  • ํผํฌ๋จผ์Šค ํ–ฅ์ƒ : ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ๊ณผ๋ถ€ํ•˜๋ฅผ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค
  • Scalability : ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๋•Œ๋ณด๋‹ค ํ›จ์”ฌ ๋†’์€ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ๋‹น ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋น„์šฉ ์ ˆ๊ฐ : ๋น„์‹ผ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹ฑ ํ•ด๋‘์–ด์„œ ๋น„์šฉ์ ˆ๊ฐ ํšจ๊ณผ๋ฅผ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค
  • UX ๊ฐœ์„  : ํผํฌ๋จผ์Šค๊ฐ€ ์ข‹์•„์ง€๋ฉฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ UX ๊ฐœ์„ ์ด ๋œ๋‹ค

1.3 ์บ์‹ฑ์˜ ๋‹จ์ 

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

2. Redis๋ฅผ ํ™œ์šฉํ•œ ์บ์‹ฑ

2.1 Monolithic Architecture

Monolithic Architecture๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํ•˜๋‚˜์˜ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ํฌํ•จ๋œ ๋‹จ์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด ํ•จ๊ป˜ ๋ฐฐํฌ๋˜๊ณ  ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

Monolithic Architecture์˜ ์žฅ์ 

  • ๋‹จ์ˆœ์„ฑ: ๊ฐœ๋ฐœ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๊ฐ„๋‹จํ•˜๋‹ค.
  • ์„ฑ๋Šฅ: ๋ชจ๋“ˆ ๊ฐ„์˜ ํ†ต์‹ ์ด ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.
  • ๋””๋ฒ„๊น…: ๋‹จ์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•˜๋‹ค.

Monolithic Architecture์˜ ๋‹จ์ 

  • ํ™•์žฅ์„ฑ: ํŠน์ • ๋ชจ๋“ˆ๋งŒ ํ™•์žฅํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ์œ ์ง€๋ณด์ˆ˜: ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค.
  • ๋ฐฐํฌ: ์ž‘์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ๋ฐฐํฌํ•ด์•ผ ํ•œ๋‹ค.

2.2 Microservice Architecture

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(Microservice Architecture)

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

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์˜ ์ฃผ์š” ํŠน์ง•

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

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์˜ ์žฅ์ 

  • ์œ ์—ฐ์„ฑ: ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋„์ž…ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  • ํ™•์žฅ์„ฑ: ํŠน์ • ์„œ๋น„์Šค๋งŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด, ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‹ ๋ขฐ์„ฑ: ํ•œ ์„œ๋น„์Šค์˜ ์žฅ์• ๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋น ๋ฅธ ๋ฐฐํฌ: ๋…๋ฆฝ์ ์ธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์˜ ๋‹จ์ 

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

2.3 Redis Store

1
import type { RedisClientOptions } from 'redis'
2
import * as redisStore from 'cache-manager-redis-store'
3
import { Module } from '@nestjs/common'
4
import { CacheModule } from '@nestjs/cache-manager'
5
import { AppController } from './app.controller'
6
7
@Module({
8
imports: [
9
CacheModule.register<RedisClientOptions>({
10
store: redisStore,
11
host: 'localhost',
12
port: 6379,
13
}),
14
],
15
controllers: [AppController],
16
})
17
export class AppModule {}