{"id":2684,"date":"2026-10-24T09:18:27","date_gmt":"2026-10-24T09:18:27","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=2684"},"modified":"2026-10-24T09:20:53","modified_gmt":"2026-10-24T09:20:53","slug":"%ec%ba%90%ec%8b%9c-%ec%84%a4%ea%b3%84-cache-aside-write-through-write-behind%ec%99%80-%ec%ba%90%ec%8b%9c-%ec%a0%95%ed%95%a9%ec%84%b1","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=2684","title":{"rendered":"Redis \uce90\uc2dc \uc124\uacc4 #Cache-Aside, Write-Through, Write-Behind\uc640 \uce90\uc2dc \uc815\ud569\uc131"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\uce90\uc2dc(Cache)\ub780?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc(Cache)\ub294 \uc790\uc8fc \uc870\ud68c\ud558\ub294 \ub370\uc774\ud130\ub97c \ub354 \ube60\ub974\uac8c \uc81c\uacf5\ud558\uae30 \uc704\ud574 \uc784\uc2dc\ub85c \uc800\uc7a5\ud558\ub294 \ub370\uc774\ud130 \uc800\uc7a5\uc18c\ub2e4. \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\ubcf5\uc801\uc73c\ub85c \uc811\uadfc\ud558\ub294 \ube44\uc6a9\uc744 \uc904\uc774\uace0, \uc751\ub2f5 \uc2dc\uac04\uc744 \ub2e8\ucd95\ud558\uba70, \uc2dc\uc2a4\ud15c \uc804\uccb4\uc758 \ucc98\ub9ac\ub7c9\uc744 \ub192\uc774\ub294 \ub370 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc73c\ub85c \uce90\uc2dc\ub294 \uba54\ubaa8\ub9ac \uae30\ubc18 \uc800\uc7a5\uc18c\uc778 Redis\ub97c \ud65c\uc6a9\ud55c\ub2e4. \uba54\ubaa8\ub9ac \uc811\uadfc\uc740 \ub514\uc2a4\ud06c \uae30\ubc18 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc870\ud68c\ubcf4\ub2e4 \ube60\ub974\uba70, \ub124\ud2b8\uc6cc\ud06c\ub97c \ud1b5\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc811\uadfc\uacfc \ucffc\ub9ac \uc2e4\ud589 \ube44\uc6a9\ub3c4 \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c \ud50c\ub808\uc774\uc5b4\uc758 \ud504\ub85c\ud544\uc744 \uc870\ud68c\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uac00 \uc5c6\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uc694\uccad\uc774 \ubc18\ubcf5\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ud074\ub77c\uc774\uc5b8\ud2b8\n    |\n    v\n\uac8c\uc784 \uc11c\ubc84\n    |\n    v\nMySQL \uc870\ud68c\n    |\n    v\n\ud50c\ub808\uc774\uc5b4 \ud504\ub85c\ud544 \ubc18\ud658<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3d9\uc77c\ud55c \ud50c\ub808\uc774\uc5b4\uc758 \ud504\ub85c\ud544\uc744 \uc218\ucc9c \ubc88 \uc870\ud68c\ud558\ub354\ub77c\ub3c4 \ub9e4\ubc88 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc811\uadfc\ud574\uc57c \ud55c\ub2e4. \uc0ac\uc6a9\uc790\uac00 \ub9ce\uc544\uc9c0\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc77d\uae30 \ubd80\ud558\uac00 \uc9d1\uc911\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\ub97c \ub3c4\uc785\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ud074\ub77c\uc774\uc5b8\ud2b8\n    |\n    v\n\uac8c\uc784 \uc11c\ubc84\n    |\n    v\nRedis \uc870\ud68c\n    |\n    +-- \uce90\uc2dc \uc801\uc911(Cache Hit)\n    |       |\n    |       v\n    |   \ub370\uc774\ud130 \ubc18\ud658\n    |\n    +-- \uce90\uc2dc \ubbf8\uc2a4(Cache Miss)\n            |\n            v\n        MySQL \uc870\ud68c\n            |\n            v\n        Redis \uc800\uc7a5\n            |\n            v\n        \ub370\uc774\ud130 \ubc18\ud658<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uc5d0 \ub370\uc774\ud130\uac00 \uc874\uc7ac\ud558\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc870\ud68c\ud558\uc9c0 \uc54a\ub294\ub2e4. \ub370\uc774\ud130\uac00 \uc5c6\uc73c\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \uc870\ud68c\ud55c \ub4a4 \uce90\uc2dc\uc5d0 \uc800\uc7a5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \uce90\uc2dc\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub300\uccb4\ud558\ub294 \uc800\uc7a5\uc18c\uac00 \uc544\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc601\uc18d\uc801\uc778 \uc6d0\ubcf8 \ub370\uc774\ud130(Source of Truth)\ub85c \uc720\uc9c0\ud558\uace0, \uce90\uc2dc\ub294 \uc131\ub2a5 \ud5a5\uc0c1\uc744 \uc704\ud55c \ubcf4\uc870 \uc800\uc7a5\uc18c\ub85c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7ec\ud55c \uad6c\uc870\uc5d0\uc11c \ud575\uc2ec\uc740 \ub370\uc774\ud130\ub97c \uc5bc\ub9c8\ub098 \ube60\ub974\uac8c \uc870\ud68c\ud558\ub290\ub0d0\ubfd0\ub9cc \uc544\ub2c8\ub77c, \uce90\uc2dc\uc640 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ub370\uc774\ud130\uac00 \uc11c\ub85c \uc5b4\uae0b\ub098\uc9c0 \uc54a\ub3c4\ub85d \uad00\ub9ac\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cache-Aside \ud328\ud134<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Cache-Aside\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cache-Aside\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uce90\uc2dc \uc870\ud68c, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc870\ud68c, \uce90\uc2dc \uc800\uc7a5\uc744 \uc9c1\uc811 \uc81c\uc5b4\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lazy Loading \ubc29\uc2dd\uc774\ub77c\uace0\ub3c4 \ubd80\ub978\ub2e4. \uc2e4\uc81c\ub85c \ub370\uc774\ud130\uac00 \ud544\uc694\ud574\uc84c\uc744 \ub54c \uce90\uc2dc\uc5d0 \uc801\uc7ac\ud558\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3d9\uc791 \uacfc\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \uce90\uc2dc\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc870\ud68c\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uce90\uc2dc\uc5d0 \ub370\uc774\ud130\uac00 \uc874\uc7ac\ud558\uba74 \uc989\uc2dc \ubc18\ud658\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uce90\uc2dc\uc5d0 \ub370\uc774\ud130\uac00 \uc5c6\uc73c\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc870\ud68c\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc870\ud68c\ud55c \ub370\uc774\ud130\ub97c \uce90\uc2dc\uc5d0 \uc800\uc7a5\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc870\ud68c \uacb0\uacfc\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \ubc18\ud658\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cache-Aside \uc870\ud68c \uc608\uc2dc<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js, TypeScript, Redis, MySQL \ud658\uacbd\uc744 \uae30\uc900\uc73c\ub85c \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { createClient } from \"redis\";\nimport mysql from \"mysql2\/promise\";\n\nconst redis = createClient({\n  url: process.env.REDIS_URL,\n});\n\nconst pool = mysql.createPool({\n  host: process.env.DB_HOST,\n  user: process.env.DB_USER,\n  password: process.env.DB_PASSWORD,\n  database: process.env.DB_NAME,\n  connectionLimit: 10,\n});\n\ntype UserProfile = {\n  id: number;\n  nickname: string;\n  level: number;\n};\n\nasync function getUserProfile(\n  userId: number\n): Promise&lt;UserProfile | null&gt; {\n  const cacheKey = `user:profile:${userId}`;\n\n  \/\/ \uce90\uc2dc \uc870\ud68c\n  const cached = await redis.get(cacheKey);\n\n  if (cached !== null) {\n    return JSON.parse(cached) as UserProfile;\n  }\n\n  \/\/ \uce90\uc2dc \ubbf8\uc2a4: \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc870\ud68c\n  const &#91;rows] = await pool.execute(\n    `SELECT id, nickname, level\n     FROM users\n     WHERE id = ?`,\n    &#91;userId]\n  );\n\n  const users = rows as UserProfile&#91;];\n  const user = users&#91;0] ?? null;\n\n  if (user !== null) {\n    \/\/ \uc870\ud68c \uacb0\uacfc\ub97c \uce90\uc2dc\uc5d0 \uc800\uc7a5\n    await redis.set(\n      cacheKey,\n      JSON.stringify(user),\n      { EX: 300 }\n    );\n  }\n\n  return user;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ucf54\ub4dc\ub294 \uce90\uc2dc\uac00 \uc5c6\uc73c\uba74 MySQL\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uc870\ud68c\ud558\uace0, \uacb0\uacfc\ub97c Redis\uc5d0 300\ucd08 \ub3d9\uc548 \uc800\uc7a5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uac00 \uc801\uc911\ud558\uba74 MySQL \uc870\ud68c\ub97c \uc0dd\ub7b5\ud55c\ub2e4. \ubc18\uba74 \uce90\uc2dc\uac00 \ub9cc\ub8cc\ub418\uc5c8\uac70\ub098 \uc874\uc7ac\ud558\uc9c0 \uc54a\uc73c\uba74 \ub2e4\uc2dc \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc870\ud68c\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 Redis \uc5f0\uacb0 \uc624\ub958, JSON \ud30c\uc2f1 \uc624\ub958, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud0c0\uc784\uc544\uc6c3 \ub4f1\uc744 \ubcc4\ub3c4\ub85c \ucc98\ub9ac\ud574\uc57c \ud55c\ub2e4. \ub610\ud55c \uce90\uc2dc \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub85c \ub300\uccb4 \uc870\ud68c\ud560 \uac83\uc778\uc9c0, \uc694\uccad \uc790\uccb4\ub97c \uc2e4\ud328\uc2dc\ud0ac \uac83\uc778\uc9c0\ub3c4 \uc11c\ube44\uc2a4\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cache-Aside\uc758 \uc7a5\uc810<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud544\uc694\ud55c \ub370\uc774\ud130\ub9cc \uce90\uc2f1\ud560 \uc218 \uc788\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c\ub85c \uc870\ud68c\ub418\ub294 \ub370\uc774\ud130\ub9cc \uce90\uc2dc\uc5d0 \uc800\uc7a5\ud558\ubbc0\ub85c \uc0ac\uc6a9\ub418\uc9c0 \uc54a\ub294 \ub370\uc774\ud130\ub97c \ubbf8\ub9ac \uc801\uc7ac\ud560 \ud544\uc694\uac00 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uce90\uc2dc\uc640 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uc5ed\ud560\uc774 \ubd84\ub9ac\ub41c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 \uc6d0\ubcf8 \ub370\uc774\ud130\ub97c \uad00\ub9ac\ud558\uace0, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc740 \uce90\uc2dc \uc815\ucc45\uc744 \uad00\ub9ac\ud55c\ub2e4. Redis\ub97c \ub3c4\uc785\ud558\uac70\ub098 \uc81c\uac70\ud558\ub294 \uacfc\uc815\uc5d0\uc11c\ub3c4 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uae30\ubcf8 \uc800\uc7a5 \uad6c\uc870\ub97c \ud06c\uac8c \ubcc0\uacbd\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc77d\uae30 \ubd80\ud558\ub97c \ud6a8\uacfc\uc801\uc73c\ub85c \uc904\uc77c \uc218 \uc788\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ubcf5 \uc870\ud68c\uac00 \ub9ce\uc740 \ub370\uc774\ud130\ub77c\uba74 \uce90\uc2dc \uc801\uc911\ub960\uc774 \ub192\uc544\uc838 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubd80\ud558\ub97c \ud06c\uac8c \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cache-Aside\uc758 \ub2e8\uc810<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ucd5c\ucd08 \uc870\ud68c\ub294 \ub290\ub9b4 \uc218 \uc788\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uac00 \ube44\uc5b4 \uc788\ub2e4\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc870\ud68c\ud558\uace0 \uce90\uc2dc\uae4c\uc9c0 \uc801\uc7ac\ud574\uc57c \ud558\ubbc0\ub85c \ucd5c\ucd08 \uc694\uccad\uc5d0 \ucd94\uac00 \ube44\uc6a9\uc774 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uce90\uc2dc \ubbf8\uc2a4\uac00 \uc9d1\uc911\ub418\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubd80\ud558\uac00 \uc99d\uac00\ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uac00 \ub9cc\ub8cc\ub41c \uc9c1\ud6c4 \ub3d9\uc77c\ud55c \ud0a4\uc5d0 \uc694\uccad\uc774 \uc9d1\uc911\ub418\uba74 \uc5ec\ub7ec \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc870\ud68c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uce90\uc2dc \ubb34\ud6a8\ud654 \uc815\ucc45\uc774 \ud544\uc694\ud558\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub418\uc5c8\ub294\ub370 \uae30\uc874 \uce90\uc2dc\uac00 \uc720\uc9c0\ub418\uba74 \uc624\ub798\ub41c \ub370\uc774\ud130\ub97c \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cache-Aside\ub294 \uad6c\ud604\uc774 \uac04\ub2e8\ud558\uace0 \ubc94\uc6a9\uc801\uc774\uc9c0\ub9cc, \uce90\uc2dc\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \ub370\uc774\ud130 \uc815\ud569\uc131\uc774 \uc790\ub3d9\uc73c\ub85c \ubcf4\uc7a5\ub418\uc9c0\ub294 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Write-Through \ud328\ud134<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Through\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Write-Through\ub294 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud560 \ub54c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \uce90\uc2dc\ub97c \ud568\uaed8 \uac31\uc2e0\ud558\ub294 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 \uad6c\ud604\uc5d0\uc11c\ub294 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc774 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubcc0\uacbd \uc0ac\ud56d\uc744 \uae30\ub85d\ud55c \ub2e4\uc74c \uce90\uc2dc\ub97c \uac31\uc2e0\ud55c\ub2e4. \ub450 \uc800\uc7a5\uc18c\uc5d0 \ubaa8\ub450 \ubc18\uc601\ub418\uc5b4\uc57c \uc4f0\uae30 \uc791\uc5c5\uc774 \uc644\ub8cc\ub41c \uac83\uc73c\ub85c \uac04\uc8fc\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ud074\ub77c\uc774\uc5b8\ud2b8\n    |\n    v\n\uc560\ud50c\ub9ac\ucf00\uc774\uc158\n    |\n    +-------&gt; MySQL \uac31\uc2e0\n    |\n    +-------&gt; Redis \uac31\uc2e0\n                  |\n                  v\n              \uc4f0\uae30 \uc644\ub8cc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubc29\uc2dd\uc758 \ud575\uc2ec\uc740 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub420 \ub54c \uce90\uc2dc\ub3c4 \ud568\uaed8 \uac31\uc2e0\ud558\uc5ec \uc624\ub798\ub41c \ub370\uc774\ud130\uac00 \ub0a8\uc544 \uc788\uc744 \uac00\ub2a5\uc131\uc744 \uc904\uc774\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Through \uad6c\ud604 \uc608\uc2dc<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>async function updateUserLevel(\n  userId: number,\n  level: number\n): Promise&lt;void&gt; {\n  const cacheKey = `user:profile:${userId}`;\n\n  const connection = await pool.getConnection();\n\n  try {\n    await connection.beginTransaction();\n\n    await connection.execute(\n      `UPDATE users\n       SET level = ?\n       WHERE id = ?`,\n      &#91;level, userId]\n    );\n\n    await connection.commit();\n  } catch (error) {\n    await connection.rollback();\n    throw error;\n  } finally {\n    connection.release();\n  }\n\n  \/\/ DB \ucee4\ubc0b \uc774\ud6c4 \uce90\uc2dc \uac31\uc2e0\n  try {\n    const &#91;rows] = await pool.execute(\n      `SELECT id, nickname, level\n       FROM users\n       WHERE id = ?`,\n      &#91;userId]\n    );\n\n    const users = rows as UserProfile&#91;];\n    const user = users&#91;0];\n\n    if (user) {\n      await redis.set(\n        cacheKey,\n        JSON.stringify(user),\n        { EX: 300 }\n      );\n    } else {\n      await redis.del(cacheKey);\n    }\n  } catch (error) {\n    \/\/ \uce90\uc2dc \uac31\uc2e0 \uc2e4\ud328\ub97c \ubcc4\ub3c4\ub85c \uae30\ub85d\ud558\uace0 \ub300\uc751\ud574\uc57c \ud55c\ub2e4.\n    console.error(\"Cache update failed\", error);\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc608\uc2dc\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubcc0\uacbd \ud6c4 \uce90\uc2dc\ub97c \uac31\uc2e0\ud558\ub294 \ud750\ub984\uc744 \ubcf4\uc5ec\uc900\ub2e4. \uc5c4\ubc00\ud55c \uc758\ubbf8\uc5d0\uc11c \ubaa8\ub4e0 \uc791\uc5c5\uc774 \ud558\ub098\uc758 \uc6d0\uc790\uc801 Write-Through \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \ubb36\uc778 \uac83\uc740 \uc544\ub2c8\ub2e4. MySQL \ucee4\ubc0b \uc774\ud6c4 Redis \uac31\uc2e0\uc5d0 \uc2e4\ud328\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc6b4\uc601 \ud658\uacbd\uc5d0\uc11c\ub294 \uce90\uc2dc \uac31\uc2e0 \uc2e4\ud328 \uc2dc \uc7ac\uc2dc\ub3c4, \uce90\uc2dc \uc0ad\uc81c, \uc774\ubca4\ud2b8 \uae30\ubc18 \uac31\uc2e0 \ub4f1\uc758 \ubcf5\uad6c \uc804\ub7b5\uc744 \ud568\uaed8 \uc124\uacc4\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Through\uc758 \uc7a5\uc810<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc4f0\uae30 \uc791\uc5c5 \uc774\ud6c4 \uce90\uc2dc\uc5d0 \ucd5c\uc2e0 \ub370\uc774\ud130\ub97c \ubc18\uc601\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc774\ud6c4 \uc870\ud68c\uc5d0\uc11c \uc624\ub798\ub41c \uce90\uc2dc\uac00 \ubc18\ud658\ub420 \uac00\ub2a5\uc131\uc744 \uc904\uc77c \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc77d\uae30 \uc694\uccad\uc774 \ub9ce\uc740 \ub370\uc774\ud130\uc5d0 \uc801\ud569\ud558\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Through\uc758 \ub2e8\uc810<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc4f0\uae30 \uc694\uccad\ub9c8\ub2e4 \uce90\uc2dc \uac31\uc2e0 \ube44\uc6a9\uc774 \ucd94\uac00\ub41c\ub2e4.<\/li>\n\n\n\n<li>\uce90\uc2dc\uc640 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ubaa8\ub450 \ub2e4\ub904\uc57c \ud558\ubbc0\ub85c \uc4f0\uae30 \uacbd\ub85c\uac00 \ubcf5\uc7a1\ud574\uc9c4\ub2e4.<\/li>\n\n\n\n<li>\ub450 \uc800\uc7a5\uc18c\ub97c \uc6d0\uc790\uc801\uc73c\ub85c \uac31\uc2e0\ud558\uc9c0 \uc54a\uc73c\uba74 \ubd80\ubd84 \uc2e4\ud328\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 Write-Through\ub77c\ub294 \uc774\ub984\ub9cc\uc73c\ub85c \ubd84\uc0b0 \ud2b8\ub79c\uc7ad\uc158 \uc218\uc900\uc758 \uc6d0\uc790\uc131\uc774 \ubcf4\uc7a5\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc2e4\uc81c \uc77c\uad00\uc131 \uc218\uc900\uc740 \uad6c\ud604 \ubc29\uc2dd\uacfc \uc2e4\ud328 \ubcf5\uad6c \uc815\ucc45\uc5d0 \ub2ec\ub824 \uc788\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Write-Behind \ud328\ud134<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Behind\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Write-Behind\ub294 \uce90\uc2dc\ub97c \uba3c\uc800 \uac31\uc2e0\ud558\uace0 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubc18\uc601\uc744 \ub098\uc911\uc73c\ub85c \ubbf8\ub8e8\ub294 \ubc29\uc2dd\uc774\ub2e4. Write-Back\uc774\ub77c\uace0\ub3c4 \ubd80\ub978\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc4f0\uae30 \uc694\uccad\uc744 \ubc1b\uc744 \ub54c\ub9c8\ub2e4 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc989\uc2dc \uae30\ub85d\ud558\uc9c0 \uc54a\uace0, \ubcc0\uacbd \uc0ac\ud56d\uc744 \uba54\ubaa8\ub9ac\ub098 \ud050 \ub4f1\uc5d0 \ub204\uc801\ud55c \ub4a4 \uc77c\uc815 \uc2dc\uc810\uc5d0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ud074\ub77c\uc774\uc5b8\ud2b8\n    |\n    v\n\uc560\ud50c\ub9ac\ucf00\uc774\uc158\n    |\n    v\nRedis \ub610\ub294 \uc4f0\uae30 \ubc84\ud37c \uac31\uc2e0\n    |\n    v\n\uc694\uccad\uc5d0 \ube60\ub974\uac8c \uc751\ub2f5\n    |\n    v\n\ubcc0\uacbd \uc0ac\ud56d \ub204\uc801\n    |\n    v\n\ube44\ub3d9\uae30 \uc791\uc5c5\uc790\n    |\n    v\nMySQL\uc5d0 \uc77c\uad04 \ubc18\uc601<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uac8c\uc784\uc5d0\uc11c \uc2e4\uc2dc\uac04\uc73c\ub85c \ubc1c\uc0dd\ud558\ub294 \uc784\uc2dc \uc810\uc218\ub098 \ud1b5\uacc4 \ub370\uc774\ud130\ub97c \ub9e4\ubc88 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uae30\ub85d\ud558\uba74 \uc4f0\uae30 \ubd80\ud558\uac00 \ucee4\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubcc0\uacbd \uc0ac\ud56d\uc744 \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \ubaa8\uc740 \ub4a4 \ud55c\uaebc\ubc88\uc5d0 \uae30\ub85d\ud558\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc1c\uc0dd\ud558\ub294 \uc4f0\uae30 \uc791\uc5c5\uc744 \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Behind \uad6c\ud604 \uac1c\ub150<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>type ScoreChange = {\n  userId: number;\n  score: number;\n};\n\nasync function updateCachedScore(\n  userId: number,\n  score: number\n): Promise&lt;void&gt; {\n  const cacheKey = `score:${userId}`;\n\n  \/\/ \uce90\uc2dc\uc758 \uc810\uc218\ub97c \uba3c\uc800 \uac31\uc2e0\n  await redis.set(cacheKey, String(score));\n\n  \/\/ \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ubcc0\uacbd \uc0ac\ud56d\uc744\n  \/\/ \ub0b4\uad6c\uc131 \uc788\ub294 \ud050\ub098 \ub85c\uadf8\uc5d0\ub3c4 \uae30\ub85d\ud574\uc57c \ud55c\ub2e4.\n  await enqueueScorePersistence({\n    userId,\n    score,\n  });\n}\n\nasync function enqueueScorePersistence(\n  change: ScoreChange\n): Promise&lt;void&gt; {\n  \/\/ \uac1c\ub150 \uc608\uc2dc:\n  \/\/ Redis Streams, Kafka, RabbitMQ \ub4f1\uc758\n  \/\/ \uba54\uc2dc\uc9c0 \uc2dc\uc2a4\ud15c\uc5d0 \ubcc0\uacbd \uc0ac\ud56d\uc744 \uae30\ub85d\ud55c\ub2e4.\n  console.log(\"Persist score change\", change);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>enqueueScorePersistence<\/code>\ub294 \uc2e4\uc81c \ud050 \uad6c\ud604\uc774 \uc544\ub2cc \uac1c\ub150\uc801\uc778 \ud568\uc218\ub2e4. \uc6b4\uc601 \ud658\uacbd\uc5d0\uc11c\ub294 \ud050 \uc800\uc7a5 \uc131\uacf5 \uc5ec\ubd80, \uc911\ubcf5 \uba54\uc2dc\uc9c0, \uc7ac\uc2dc\ub3c4, \uc21c\uc11c \ubcf4\uc7a5, \uc7a5\uc560 \ubcf5\uad6c \ub4f1\uc744 \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c Redis\uc5d0 \uc810\uc218\ub97c \uae30\ub85d\ud55c \ub4a4 \ud050 \uc800\uc7a5\uc5d0 \uc2e4\ud328\ud558\uba74 \uce90\uc2dc\uc5d0\ub294 \ubcc0\uacbd \uc0ac\ud56d\uc774 \uc788\uc9c0\ub9cc \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\ub294 \uc601\uad6c \ubc18\uc601\ub418\uc9c0 \uc54a\uc744 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \ub2e8\uc21c\ud788 \uce90\uc2dc\uc5d0 \uae30\ub85d\ud55c \ud6c4 \ub098\uc911\uc5d0 DB\uc5d0 \uc800\uc7a5\ud558\ub294 \uac83\ub9cc\uc73c\ub85c\ub294 \uc548\uc804\ud55c Write-Behind \uad6c\uc870\uac00 \uc644\uc131\ub418\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130 \uc190\uc2e4\uc774 \ud5c8\uc6a9\ub418\uc9c0 \uc54a\ub294\ub2e4\uba74 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ub0b4\uad6c\uc131 \uc788\ub294 \ub85c\uadf8\ub098 \ud050\uc5d0 \uba3c\uc800 \uae30\ub85d\ud558\uace0, \ud574\ub2f9 \uae30\ub85d\uc774 \uc548\uc804\ud558\uac8c \ubcf4\uc874\ub41c \ub4a4 \uc694\uccad\uc744 \uc644\ub8cc\ud558\ub294 \uad6c\uc870\ub97c \uac80\ud1a0\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Behind\uc758 \uc7a5\uc810<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc4f0\uae30 \uc694\uccad\uc744 \uc904\uc77c \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc5ec\ub7ec \ubcc0\uacbd \uc0ac\ud56d\uc744 \ubb36\uc5b4 \uc77c\uad04 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\ub192\uc740 \ube48\ub3c4\ub85c \ubc1c\uc0dd\ud558\ub294 \uc4f0\uae30 \uc791\uc5c5\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Write-Behind\uc758 \ub2e8\uc810<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\uc601\ub418\uae30 \uc804\uae4c\uc9c0 \uce90\uc2dc\uc640 DB\uc758 \uac12\uc774 \ub2e4\ub97c \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc7a5\uc560 \ubc1c\uc0dd \uc2dc \uc544\uc9c1 \uc601\uad6c \uc800\uc7a5\ub418\uc9c0 \uc54a\uc740 \ub370\uc774\ud130\uac00 \uc190\uc2e4\ub420 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc7ac\uc2dc\ub3c4\uc640 \uc911\ubcf5 \ucc98\ub9ac, \ubcc0\uacbd \uc21c\uc11c \uad00\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.<\/li>\n\n\n\n<li>\uce90\uc2dc\uc640 \ud050\uc758 \ub370\uc774\ud130\uac00 \uc11c\ub85c \uc5b4\uae0b\ub098\uc9c0 \uc54a\ub3c4\ub85d \uad00\ub9ac\ud574\uc57c \ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ud3ec\uc778\ud2b8 \uc794\uc561, \uacb0\uc81c, \uc544\uc774\ud15c \uad6c\ub9e4, \uc720\ub8cc \uc7ac\ud654 \uc9c0\uae09\ucc98\ub7fc \ub370\uc774\ud130 \uc190\uc2e4\uc774\ub098 \uc911\ubcf5 \ucc98\ub9ac\uac00 \uce58\uba85\uc801\uc778 \uae30\ub2a5\uc5d0\ub294 \ub2e8\uc21c\ud55c Write-Behind\ub97c \uc801\uc6a9\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\uba74 \uc77c\ubd80 \uc9c0\uc5f0\uc744 \ud5c8\uc6a9\ud560 \uc218 \uc788\ub294 \uc870\ud68c\uc218, \ubd84\uc11d\uc6a9 \uc9d1\uacc4, \ube44\ud575\uc2ec \ud1b5\uacc4 \ub4f1\uc5d0\ub294 \uc801\uc808\ud55c \ub0b4\uad6c\uc131\uacfc \ubcf5\uad6c \uc815\ucc45\uc744 \uc804\uc81c\ub85c \uc720\uc6a9\ud558\uac8c \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cache-Aside, Write-Through, Write-Behind \ube44\uad50<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\uad6c\ubd84<\/th><th>Cache-Aside<\/th><th>Write-Through<\/th><th>Write-Behind<\/th><\/tr><tr><td>\uc8fc\uc694 \ubaa9\uc801<\/td><td>\uc77d\uae30 \ucd5c\uc801\ud654<\/td><td>\uce90\uc2dc \ucd5c\uc2e0\uc131 \uc720\uc9c0<\/td><td>\uc4f0\uae30 \ubd80\ud558 \uac10\uc18c<\/td><\/tr><tr><td>\ub370\uc774\ud130 \uc870\ud68c<\/td><td>\uce90\uc2dc \uc6b0\uc120<\/td><td>\uad6c\ud604\uc5d0 \ub530\ub77c \ub2e4\ub984<\/td><td>\uce90\uc2dc \uc6b0\uc120\uc778 \uacbd\uc6b0\uac00 \ub9ce\uc74c<\/td><\/tr><tr><td>\ub370\uc774\ud130 \uae30\ub85d<\/td><td>\uc77c\ubc18\uc801\uc73c\ub85c DB \uae30\ub85d \ud6c4 \uce90\uc2dc \uc801\uc7ac \ub610\ub294 \ubb34\ud6a8\ud654<\/td><td>DB\uc640 \uce90\uc2dc\ub97c \ud568\uaed8 \uac31\uc2e0<\/td><td>\uce90\uc2dc\uc5d0 \uba3c\uc800 \uae30\ub85d\ud558\uace0 DB\uc5d0 \ub098\uc911 \ubc18\uc601<\/td><\/tr><tr><td>DB \ubc18\uc601 \uc2dc\uc810<\/td><td>\uc4f0\uae30 \ub85c\uc9c1\uc5d0 \ub530\ub77c \ub2e4\ub984<\/td><td>\uc77c\ubc18\uc801\uc73c\ub85c \uc989\uc2dc<\/td><td>\uc9c0\uc5f0 \ub610\ub294 \uc77c\uad04 \ucc98\ub9ac<\/td><\/tr><tr><td>\ub370\uc774\ud130 \uc190\uc2e4 \uc704\ud5d8<\/td><td>\uc77c\ubc18\uc801\uc778 DB \uc6b0\uc120 \uc4f0\uae30\uc5d0\uc11c\ub294 \ub0ae\uc74c<\/td><td>\ubd80\ubd84 \uc2e4\ud328 \ubcf5\uad6c\uac00 \ud544\uc694\ud568<\/td><td>\uc601\uad6c \uc800\uc7a5 \uc804 \uc7a5\uc560\uc5d0 \ucde8\uc57d\ud560 \uc218 \uc788\uc74c<\/td><\/tr><tr><td>\uc8fc\uc694 \ud65c\uc6a9<\/td><td>\ud504\ub85c\ud544, \uc124\uc815, \uc870\ud68c \ub370\uc774\ud130<\/td><td>\uc790\uc8fc \uc870\ud68c\ub418\ub294 \ubcc0\uacbd \ub370\uc774\ud130<\/td><td>\ud1b5\uacc4, \uc9d1\uacc4, \uace0\ube48\ub3c4 \uc4f0\uae30<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc138 \uac00\uc9c0 \ud328\ud134\uc740 \ubc18\ub4dc\uc2dc \uc11c\ub85c \ubc30\ud0c0\uc801\uc778 \uac83\uc740 \uc544\ub2c8\ub2e4. Cache-Aside\ub97c \uc870\ud68c\uc5d0 \uc0ac\uc6a9\ud558\uace0, \ub370\uc774\ud130 \ubcc0\uacbd \uc2dc\uc5d0\ub294 \uce90\uc2dc\ub97c \ubb34\ud6a8\ud654\ud558\ub294 \uc804\ub7b5\uc744 \uacb0\ud569\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uce90\uc2dc \ubb34\ud6a8\ud654(Cache Invalidation)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uce90\uc2dc \ubb34\ud6a8\ud654\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc \ubb34\ud6a8\ud654\ub294 \uc6d0\ubcf8 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub418\uc5c8\uc744 \ub54c \uae30\uc874 \uce90\uc2dc\ub97c \ub354 \uc774\uc0c1 \uc720\ud6a8\ud55c \ub370\uc774\ud130\ub85c \ucde8\uae09\ud558\uc9c0 \uc54a\ub3c4\ub85d \ucc98\ub9ac\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc \uc124\uacc4\uc5d0\uc11c \uc5b4\ub824\uc6b4 \ubb38\uc81c \uc911 \ud558\ub098\ub294 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\ub294 \uac83\ubcf4\ub2e4 \uc5b8\uc81c \uce90\uc2dc\ub97c \uac31\uc2e0\ud558\uac70\ub098 \uc81c\uac70\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4\uc758 \ub808\ubca8\uc774 10\uc5d0\uc11c 11\ub85c \ubcc0\uacbd\ub418\uc5c8\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL\nuserId = 100\nlevel = 11\n\nRedis\nuser:profile:100\nlevel = 10<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 \ucd5c\uc2e0 \uac12\uc778 11\uc744 \uac00\uc9c0\uace0 \uc788\uc9c0\ub9cc, Redis\uc5d0\ub294 \uc774\uc804 \uac12\uc778 10\uc774 \ub0a8\uc544 \uc788\ub2e4. \uc774 \uc0c1\ud0dc\uc5d0\uc11c \uce90\uc2dc \uc870\ud68c\uac00 \ubc1c\uc0dd\ud558\uba74 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc798\ubabb\ub41c \ub808\ubca8\uc744 \ubc18\ud658\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc \ubb34\ud6a8\ud654\ub294 \uc774\ub7ec\ud55c \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud55c \ud575\uc2ec \uc804\ub7b5\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uce90\uc2dc \ubb34\ud6a8\ud654 \uc804\ub7b5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uce90\uc2dc \uc0ad\uc81c(Invalidate on Write)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ubcc0\uacbd\ud55c \ub4a4 \uad00\ub828 \uce90\uc2dc\ub97c \uc0ad\uc81c\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async function updateNickname(\n  userId: number,\n  nickname: string\n): Promise&lt;void&gt; {\n  await pool.execute(\n    `UPDATE users\n     SET nickname = ?\n     WHERE id = ?`,\n    &#91;nickname, userId]\n  );\n\n  await redis.del(`user:profile:${userId}`);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c \uc870\ud68c\uc5d0\uc11c \uce90\uc2dc\uac00 \uc5c6\uc73c\ubbc0\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ucd5c\uc2e0 \ub370\uc774\ud130\ub97c \uac00\uc838\uc640 \uce90\uc2dc\uc5d0 \uc800\uc7a5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubc29\uc2dd\uc740 \uce90\uc2dc \uc804\uccb4 \uac1d\uccb4\ub97c \uc9c1\uc811 \uac31\uc2e0\ud558\ub294 \uac83\ubcf4\ub2e4 \ub2e8\uc21c\ud558\ub2e4. \ud2b9\ud788 \uc5ec\ub7ec \ud544\ub4dc\uac00 \ud3ec\ud568\ub41c \uac1d\uccb4\uc5d0\uc11c\ub294 DB \ubcc0\uacbd \ud6c4 \uce90\uc2dc\ub97c \uc0ad\uc81c\ud558\ub294 \uc804\ub7b5\uc774 \uc720\uc6a9\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8, DB \uc5c5\ub370\uc774\ud2b8 \uc131\uacf5 \ud6c4 Redis \uc0ad\uc81c\uac00 \uc2e4\ud328\ud558\uba74 \uc624\ub798\ub41c \uce90\uc2dc\uac00 \ub0a8\ub294\ub2e4. \ub530\ub77c\uc11c \uce90\uc2dc \uc0ad\uc81c \uc2e4\ud328\uc5d0 \ub300\ud55c \uc7ac\uc2dc\ub3c4\ub098 TTL \uac19\uc740 \ubcf4\uc870 \uc7a5\uce58\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uce90\uc2dc \uc9c1\uc811 \uac31\uc2e0(Update on Write)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ubcc0\uacbd\ud55c \ub4a4 \uce90\uc2dc\uc5d0\ub3c4 \ucd5c\uc2e0 \ub370\uc774\ud130\ub97c \uae30\ub85d\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await pool.execute(\n  `UPDATE users\n   SET nickname = ?\n   WHERE id = ?`,\n  &#91;nickname, userId]\n);\n\nconst cacheKey = `user:profile:${userId}`;\n\nconst cached = await redis.get(cacheKey);\n\nif (cached !== null) {\n  const user = JSON.parse(cached) as UserProfile;\n  user.nickname = nickname;\n\n  await redis.set(\n    cacheKey,\n    JSON.stringify(user),\n    { EX: 300 }\n  );\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uac00 \uc874\uc7ac\ud560 \ub54c \ucd5c\uc2e0 \uac12\uc73c\ub85c \uac31\uc2e0\ud558\uba74 \ub2e4\uc74c \uc870\ud68c\uc5d0\uc11c \uce90\uc2dc \ubbf8\uc2a4\uac00 \ubc1c\uc0dd\ud558\ub294 \uac83\uc744 \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc774 \uc608\uc2dc\uc5d0\uc11c\ub294 <code>UserProfile<\/code>\uc5d0 <code>nickname<\/code>\ub9cc \ubc18\uc601\ud558\ubbc0\ub85c \ub2e4\ub978 \ud544\ub4dc\uac00 \ub3d9\uc2dc\uc5d0 \ubcc0\uacbd\ub418\ub294 \uc0c1\ud669\uae4c\uc9c0 \uc548\uc804\ud558\uac8c \ucc98\ub9ac\ud558\uc9c0\ub294 \ubabb\ud55c\ub2e4. \uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \ucd5c\uc2e0 \uac1d\uccb4\ub97c \ub2e4\uc2dc \uc870\ud68c\ud558\uac70\ub098 \ud544\ub4dc\ubcc4 \uac31\uc2e0\uc744 \uc6d0\uc790\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\ub294 \ubc29\uc2dd\uc744 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TTL\uc744 \uc774\uc6a9\ud55c \ub9cc\ub8cc<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TTL(Time To Live)\uc740 \uce90\uc2dc \ub370\uc774\ud130\uac00 \uc720\ud6a8\ud55c \uc2dc\uac04\uc744 \uc758\ubbf8\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>await redis.set(\n  \"user:profile:100\",\n  JSON.stringify(user),\n  { EX: 300 }\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \ucf54\ub4dc\ub294 \uce90\uc2dc\ub97c 300\ucd08 \ub3d9\uc548 \uc720\uc9c0\ud55c\ub2e4. \ub9cc\ub8cc \ud6c4\uc5d0\ub294 Redis\uc5d0\uc11c \ud574\ub2f9 \ud0a4\uac00 \ub354 \uc774\uc0c1 \uc720\ud6a8\ud55c \uce90\uc2dc \ub370\uc774\ud130\ub85c \uc81c\uacf5\ub418\uc9c0 \uc54a\uc73c\uba70, \ub2e4\uc74c \uc870\ud68c\uc5d0\uc11c \ub2e4\uc2dc \uc801\uc7ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TTL\uc740 \uce90\uc2dc\uac00 \ubb34\ud6a8\ud654\ub418\uc9c0 \ubabb\ud558\ub294 \uc0c1\ud669\uc5d0\uc11c \uc624\ub798\ub41c \ub370\uc774\ud130\uac00 \uc601\uad6c\uc801\uc73c\ub85c \ub0a8\ub294 \uac83\uc744 \ubc29\uc9c0\ud55c\ub2e4. \ud558\uc9c0\ub9cc TTL\uc774 \uc788\ub2e4\uace0 \ud574\uc11c \ub370\uc774\ud130 \uc815\ud569\uc131\uc774 \uc989\uc2dc \ubcf4\uc7a5\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 TTL\uc774 5\ubd84\uc774\ub77c\uba74 \ub370\uc774\ud130 \ubcc0\uacbd \ud6c4 \ucd5c\ub300 \uc218\ubd84 \ub3d9\uc548 \uc624\ub798\ub41c \uac12\uc744 \uc77d\uc744 \uac00\ub2a5\uc131\uc774 \uc788\ub2e4. \ub530\ub77c\uc11c \ud5c8\uc6a9 \uac00\ub2a5\ud55c \ub370\uc774\ud130 \uc9c0\uc5f0 \uc2dc\uac04\uc5d0 \ub9de\ucdb0 TTL\uc744 \uc124\uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uce90\uc2dc \ubb34\ud6a8\ud654\uc5d0\uc11c \uc8fc\uc758\ud560 \uc810<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DB \ubcc0\uacbd\uacfc \uce90\uc2dc \uc0ad\uc81c \uc0ac\uc774\uc5d0 \uc2e4\ud328\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\ub3d9\uc77c\ud55c \ub370\uc774\ud130\uac00 \uc5ec\ub7ec \uce90\uc2dc \ud0a4\uc5d0 \uc800\uc7a5\ub418\uc5b4 \uc788\ub2e4\uba74 \ubaa8\ub4e0 \uad00\ub828 \ud0a4\ub97c \uad00\ub9ac\ud574\uc57c \ud55c\ub2e4.<\/li>\n\n\n\n<li>TTL\uc774 \ub108\ubb34 \uae38\uba74 \uc624\ub798\ub41c \ub370\uc774\ud130\uac00 \uc624\ub798 \uc720\uc9c0\ub420 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>TTL\uc774 \ub108\ubb34 \uc9e7\uc73c\uba74 \uce90\uc2dc \ubbf8\uc2a4\uc640 DB \uc870\ud68c\uac00 \uc99d\uac00\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uce90\uc2dc \uac31\uc2e0 \uc21c\uc11c\uac00 \ub4a4\ubc14\ub00c\uba74 \ucd5c\uc2e0 \uac12\uc774 \ub2e4\uc2dc \uc624\ub798\ub41c \uac12\uc73c\ub85c \ub36e\uc77c \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc \ubb34\ud6a8\ud654\ub294 \ub2e8\uc21c\ud788 <code>DEL<\/code> \uba85\ub839\uc744 \ud638\ucd9c\ud558\ub294 \ubb38\uc81c\uac00 \uc544\ub2c8\ub2e4. \uc5b4\ub5a4 \ub370\uc774\ud130 \ubcc0\uacbd\uc774 \uc5b4\ub5a4 \uce90\uc2dc \ud0a4\uc5d0 \uc601\ud5a5\uc744 \uc8fc\ub294\uc9c0 \ucd94\uc801\ud558\uace0, \uc2e4\ud328 \uc0c1\ud669\uc5d0\uc11c\ub3c4 \ubcf5\uad6c\ud560 \uc218 \uc788\ub3c4\ub85d \uc124\uacc4\ud558\ub294 \ubb38\uc81c\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cache Stampede<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Cache Stampede\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cache Stampede\ub294 \uce90\uc2dc\uac00 \ub9cc\ub8cc\ub418\uac70\ub098 \uc0ad\uc81c\ub418\uc5c8\uc744 \ub54c \ub2e4\uc218\uc758 \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \uce90\uc2dc \ubbf8\uc2a4\ub97c \uc77c\uc73c\ud0a4\uba74\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubd80\ud558\uac00 \uc9d1\uc911\ub418\ub294 \ud604\uc0c1\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Thundering Herd \ubb38\uc81c\uc758 \ud55c \ud615\ud0dc\ub85c \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc778\uae30 \uc788\ub294 \uac8c\uc784 \uc544\uc774\ud15c \uc815\ubcf4\uac00 Redis\uc5d0 \uc800\uc7a5\ub418\uc5b4 \uc788\uace0, \ud574\ub2f9 \uce90\uc2dc\uc758 TTL\uc774 \ub9cc\ub8cc\ub418\uc5c8\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uc694\uccad A ----+\n\uc694\uccad B ----+\n\uc694\uccad C ----+----&gt; Redis \uce90\uc2dc \ubbf8\uc2a4\n\uc694\uccad D ----+           |\n\uc694\uccad E ----+           v\n                    MySQL \uc870\ud68c\n                    MySQL \uc870\ud68c\n                    MySQL \uc870\ud68c\n                    MySQL \uc870\ud68c\n                    MySQL \uc870\ud68c<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc12f \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \uce90\uc2dc \ubbf8\uc2a4\ub97c \uc77c\uc73c\ud0a4\uba74 \ub3d9\uc77c\ud55c \ub370\uc774\ud130\uc5d0 \ub300\ud55c DB \uc870\ud68c\uac00 \ub2e4\uc12f \ubc88 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud3c9\uc18c\uc5d0\ub294 Redis\uac00 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\ubbc0\ub85c \ubb38\uc81c\uac00 \uc5c6\ub354\ub77c\ub3c4 \uce90\uc2dc \ub9cc\ub8cc \uc2dc\uc810\uc5d0 DB \ubd80\ud558\uac00 \uae09\uaca9\ud788 \uc99d\uac00\ud560 \uc218 \uc788\ub2e4. \ubd80\ud558\uac00 \ub354 \ucee4\uc9c0\uba74 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc751\ub2f5 \uc9c0\uc5f0\uacfc \ud0c0\uc784\uc544\uc6c3\uc774 \ubc1c\uc0dd\ud558\uace0, \uc7ac\uc2dc\ub3c4 \uc694\uccad\uae4c\uc9c0 \uacb9\uce58\uba74\uc11c \uc7a5\uc560\uac00 \ud655\ub300\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Cache Stampede \ubc29\uc9c0 \uc804\ub7b5<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ubd84\uc0b0 \ub77d\uc744 \uc774\uc6a9\ud55c \ub2e8\uc77c \uc870\ud68c<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3d9\uc77c\ud55c \uce90\uc2dc \ud0a4\uc5d0 \ub300\ud55c DB \uc870\ud68c\ub97c \ud55c \uc694\uccad\ub9cc \uc218\ud589\ud558\ub3c4\ub85d \uc81c\ud55c\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uc694\uccad A ----&gt; \uce90\uc2dc \ubbf8\uc2a4 ----&gt; \ub77d \ud68d\ub4dd ----&gt; DB \uc870\ud68c ----&gt; \uce90\uc2dc \uc800\uc7a5\n\uc694\uccad B ----&gt; \uce90\uc2dc \ubbf8\uc2a4 ----&gt; \ub77d \ub300\uae30 -----------------&gt; \uce90\uc2dc \uc870\ud68c\n\uc694\uccad C ----&gt; \uce90\uc2dc \ubbf8\uc2a4 ----&gt; \ub77d \ub300\uae30 -----------------&gt; \uce90\uc2dc \uc870\ud68c<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\uc758 <code>SET key value NX PX<\/code> \ub4f1\uc744 \uc774\uc6a9\ud574 \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \uc720\ud6a8\ud55c \ub77d\uc744 \ud68d\ub4dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ub150\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async function getCachedData(\n  key: string\n): Promise&lt;string | null&gt; {\n  const cached = await redis.get(key);\n\n  if (cached !== null) {\n    return cached;\n  }\n\n  const lockKey = `lock:${key}`;\n  const lockToken = crypto.randomUUID();\n\n  const acquired = await redis.set(\n    lockKey,\n    lockToken,\n    { NX: true, PX: 5000 }\n  );\n\n  if (acquired === \"OK\") {\n    try {\n      \/\/ \ub77d\uc744 \ud68d\ub4dd\ud55c \uc694\uccad\ub9cc DB\ub97c \uc870\ud68c\ud55c\ub2e4.\n      const value = await loadFromDatabase(key);\n\n      if (value !== null) {\n        await redis.set(key, value, { EX: 300 });\n      }\n\n      return value;\n    } finally {\n      \/\/ \uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \uc18c\uc720\uad8c \ud655\uc778 \ud6c4 \uc6d0\uc790\uc801\uc73c\ub85c \uc0ad\uc81c\ud55c\ub2e4.\n      await releaseLockIfOwner(lockKey, lockToken);\n    }\n  }\n\n  \/\/ \ub2e4\ub978 \uc694\uccad\uc774 \uce90\uc2dc\ub97c \uc0dd\uc131\ud560 \ub54c\uae4c\uc9c0 \uc7a0\uc2dc \ub300\uae30\ud55c\ub2e4.\n  await delay(50);\n\n  return redis.get(key);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>loadFromDatabase<\/code>, <code>releaseLockIfOwner<\/code>, <code>delay<\/code>\ub294 \uac1c\ub150 \uc608\uc2dc\uc758 \ubcf4\uc870 \ud568\uc218\uc774\uba70 \ubcc4\ub3c4\ub85c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 \ub77d \ud574\uc81c\ub294 \ub2e8\uc21c\ud55c <code>DEL<\/code>\ub85c \ucc98\ub9ac\ud558\uba74 \uc548 \ub41c\ub2e4. \ub77d\uc774 \ub9cc\ub8cc\ub41c \ub4a4 \ub2e4\ub978 \uc694\uccad\uc774 \uc0c8 \ub77d\uc744 \ud68d\ub4dd\ud588\ub294\ub370 \uc774\uc804 \uc694\uccad\uc774 \ub2a6\uac8c \uc885\ub8cc\ub418\uc5b4 \uc0c8 \ub77d\uae4c\uc9c0 \uc0ad\uc81c\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4. \ub77d \ud1a0\ud070\uc744 \ube44\uad50\ud558\uba74\uc11c \uc0ad\uc81c\ud558\ub294 Lua \uc2a4\ud06c\ub9bd\ud2b8 \ub4f1\uc758 \uc6d0\uc790\uc801 \ucc98\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c \ub77d\uc744 \uae30\ub2e4\ub9ac\ub294 \uc694\uccad\uc774 \uc7ac\uc870\ud68c\ud588\uc744 \ub54c\ub3c4 \uce90\uc2dc\uac00 \uc5c6\ub2e4\uba74 \uc81c\ud55c\ub41c \uc7ac\uc2dc\ub3c4, \ub300\uae30 \uc2dc\uac04 \uc99d\uac00, DB \uc9c1\uc811 \uc870\ud68c \ub4f1\uc758 \ub300\uccb4 \uc815\ucc45\uc774 \ud544\uc694\ud558\ub2e4. \ub77d\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud574\uc11c \ubaa8\ub4e0 \ub3d9\uc2dc\uc131 \ubb38\uc81c\uac00 \uc790\ub3d9\uc73c\ub85c \ud574\uacb0\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>TTL\uc5d0 \ubb34\uc791\uc704 \uc9c0\uc5f0 \ucd94\uac00<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub9ce\uc740 \ud0a4\uc758 \ub9cc\ub8cc \uc2dc\uc810\uc774 \ub3d9\uc2dc\uc5d0 \ubab0\ub9ac\ub294 \uac83\uc744 \uc904\uc774\uae30 \uc704\ud574 TTL\uc5d0 \ubb34\uc791\uc704 \uac12\uc744 \ub354\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const baseTtl = 300;\nconst jitter = Math.floor(Math.random() * 60);\n\nawait redis.set(\n  \"item:100\",\n  JSON.stringify(item),\n  { EX: baseTtl + jitter }\n);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uacbd\uc6b0 \uce90\uc2dc \ub9cc\ub8cc \uc2dc\uac04\uc774 300~359\ucd08 \uc0ac\uc774\ub85c \ubd84\uc0b0\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TTL \uc9c0\ud130\ub294 \uc5ec\ub7ec \uce90\uc2dc\uac00 \ub3d9\uc2dc\uc5d0 \ub9cc\ub8cc\ub418\ub294 \ubb38\uc81c\ub97c \uc644\ud654\ud558\uc9c0\ub9cc, \uc778\uae30 \uc788\ub294 \ub2e8\uc77c \ud0a4\uc5d0 \uc694\uccad\uc774 \uc9d1\uc911\ub418\ub294 \ud604\uc0c1\uc744 \uc644\uc804\ud788 \ud574\uacb0\ud558\uc9c0\ub294 \ubabb\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc0ac\uc804 \uac31\uc2e0(Refresh Ahead)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uac00 \ub9cc\ub8cc\ub418\uae30 \uc804\uc5d0 \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uac31\uc2e0\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uce90\uc2dc \ub9cc\ub8cc \uc804\n    |\n    v\n\ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c DB \uc870\ud68c\n    |\n    v\nRedis \uce90\uc2dc \uac31\uc2e0\n    |\n    v\n\uae30\uc874 \uc694\uccad\uc740 \uce90\uc2dc\ub97c \uacc4\uc18d \uc0ac\uc6a9<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc790\uc8fc \uc870\ud68c\ub418\ub294 \ub370\uc774\ud130\uc5d0 \uc801\ud569\ud558\ub2e4. \ub2e4\ub9cc \uac31\uc2e0 \uc8fc\uae30\ub97c \uc798\ubabb \uc124\uc815\ud558\uba74 \ud544\uc694\ud558\uc9c0 \uc54a\uc740 DB \uc870\ud68c\uac00 \uc99d\uac00\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc624\ub798\ub41c \uce90\uc2dc\uc758 \uc77c\uc2dc\uc801 \uc81c\uacf5<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uac00 \ub9cc\ub8cc\ub418\uc5c8\ub354\ub77c\ub3c4 \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \uc774\uc804 \ub370\uc774\ud130\ub97c \ubc18\ud658\ud558\uace0, \ubc31\uadf8\ub77c\uc6b4\ub4dc\uc5d0\uc11c \ucd5c\uc2e0 \ub370\uc774\ud130\ub97c \uac31\uc2e0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubc29\uc2dd\uc740 \uc77c\ubd80 \ub370\uc774\ud130\uc758 \uc77c\uc2dc\uc801\uc778 \uc624\ub798\ub428\uc744 \ud5c8\uc6a9\ud558\ub294 \uc11c\ube44\uc2a4\uc5d0\uc11c \uc720\uc6a9\ud558\ub2e4. \ub2e8, \uc794\uc561\uc774\ub098 \uacb0\uc81c \uc0c1\ud0dc\ucc98\ub7fc \ucd5c\uc2e0\uc131\uc774 \uc911\uc694\ud55c \ub370\uc774\ud130\uc5d0\ub294 \uc801\uc6a9\ud558\uae30 \uc5b4\ub835\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uce90\uc2dc\uc640 DB \uac04 \uc815\ud569\uc131<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc815\ud569\uc131\uc774\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\uc640 DB \uac04 \uc815\ud569\uc131\uc740 \ub450 \uc800\uc7a5\uc18c\uac00 \uc11c\ub85c \ubaa8\uc21c\ub418\uc9c0 \uc54a\ub294 \ub370\uc774\ud130\ub97c \uc81c\uacf5\ud558\ub3c4\ub85d \uad00\ub9ac\ud558\ub294 \uac83\uc744 \uc758\ubbf8\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc6d0\ubcf8\uc73c\ub85c \uc0ac\uc6a9\ud558\uace0 Redis\ub97c \uce90\uc2dc\ub85c \uc0ac\uc6a9\ud558\ub294 \uad6c\uc870\uc5d0\uc11c\ub294 DB \ubcc0\uacbd\uacfc \uce90\uc2dc \uac31\uc2e0\uc774 \uc11c\ub85c \ub2e4\ub978 \uc791\uc5c5\uc73c\ub85c \uc2e4\ud589\ub418\ub294 \uacbd\uc6b0\uac00 \ub9ce\ub2e4. \uc774\ub54c \ub450 \uc791\uc5c5 \uc0ac\uc774\uc5d0 \uc2e4\ud328\ub098 \ub3d9\uc2dc \uc694\uccad\uc774 \ubc1c\uc0dd\ud558\uba74 \ub370\uc774\ud130\uac00 \uc5b4\uae0b\ub0a0 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c \uc0c1\ud669\uc744 \uc0b4\ud3b4\ubcf4\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1. Redis\uc5d0 level = 10 \uc800\uc7a5\n\n2. \uc694\uccad A\uac00 MySQL\uc758 level\uc744 11\ub85c \ubcc0\uacbd\n\n3. \uc694\uccad B\uac00 MySQL\uc758 level\uc744 12\ub85c \ubcc0\uacbd\n\n4. \uc694\uccad B\uac00 Redis\uc5d0 level = 12 \uc800\uc7a5\n\n5. \uc694\uccad A\uac00 \ub2a6\uac8c Redis\uc5d0 level = 11 \uc800\uc7a5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd5c\uc885 \uc0c1\ud0dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>MySQL: level = 12\nRedis: level = 11<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uc694\uccad\uc774 \uc815\uc0c1\uc801\uc73c\ub85c \uc2e4\ud589\ub418\uc5c8\ub354\ub77c\ub3c4 \ucc98\ub9ac \uc21c\uc11c\uac00 \ub4a4\ubc14\ub00c\uba74 \uc624\ub798\ub41c \ub370\uc774\ud130\uac00 \ucd5c\uc2e0 \ub370\uc774\ud130\ub97c \ub36e\uc5b4\uc4f8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uce90\uc2dc \uc815\ud569\uc131\uc740 \ub2e8\uc21c\ud788 DB \uc5c5\ub370\uc774\ud2b8 \uc774\ud6c4 Redis\ub97c \uac31\uc2e0\ud558\ub294 \uac83\uc73c\ub85c \ub05d\ub098\uc9c0 \uc54a\ub294\ub2e4. \ub3d9\uc2dc\uc131, \uc2e4\ud328 \ubcf5\uad6c, \uc774\ubca4\ud2b8 \uc21c\uc11c, \uc7ac\uc2dc\ub3c4 \uc815\ucc45\uae4c\uc9c0 \ud568\uaed8 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">DB \uc6b0\uc120 \uac31\uc2e0 \ud6c4 \uce90\uc2dc \uc0ad\uc81c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 Cache-Aside \uad6c\uc870\uc5d0\uc11c\ub294 \ub2e4\uc74c \uc804\ub7b5\uc744 \ub9ce\uc774 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DB \ub370\uc774\ud130 \ubcc0\uacbd\n    |\n    v\nDB \ud2b8\ub79c\uc7ad\uc158 \ucee4\ubc0b\n    |\n    v\n\uad00\ub828 \uce90\uc2dc \uc0ad\uc81c\n    |\n    v\n\ub2e4\uc74c \uc870\ud68c\uc5d0\uc11c \ucd5c\uc2e0 \ub370\uc774\ud130 \uc801\uc7ac<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ubc29\uc2dd\uc740 \uce90\uc2dc \uc804\uccb4 \uac1d\uccb4\ub97c \uc9c1\uc811 \uc218\uc815\ud558\ub294 \uac83\ubcf4\ub2e4 \ub2e8\uc21c\ud558\uace0, \uc624\ub798\ub41c \ub370\uc774\ud130\uac00 \ub0a8\uc544 \uc788\ub294 \uc2dc\uac04\uc744 \uc904\uc774\ub294 \ub370 \ud6a8\uacfc\uc801\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \ub2e4\uc74c\uacfc \uac19\uc740 \uacbd\uc7c1 \uc0c1\ud669\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\uc694\uccad A: \uce90\uc2dc \ubbf8\uc2a4\n\uc694\uccad A: DB\uc5d0\uc11c \uc624\ub798\ub41c \uac12 10 \uc870\ud68c\n\n\uc694\uccad B: DB \uac12\uc744 11\ub85c \ubcc0\uacbd\n\uc694\uccad B: Redis \uce90\uc2dc \uc0ad\uc81c\n\n\uc694\uccad A: \uc624\ub798\ub41c \uac12 10\uc744 Redis\uc5d0 \uc800\uc7a5<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd5c\uc885\uc801\uc73c\ub85c \uce90\uc2dc\uc5d0 \uc624\ub798\ub41c \uac12\uc774 \ub2e4\uc2dc \uc800\uc7a5\ub41c\ub2e4. \uc774 \ubb38\uc81c\ub97c Cache-Aside\uc758 \uacbd\uc7c1 \uc870\uac74(Race Condition)\uc73c\ub85c \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc \uc0ad\uc81c\ub9cc\uc73c\ub85c \ubaa8\ub4e0 \uc815\ud569\uc131 \ubb38\uc81c\uac00 \ud574\uacb0\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc815\ud569\uc131 \ubb38\uc81c\ub97c \uc904\uc774\ub294 \ubc29\ubc95<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uce90\uc2dc \uac31\uc2e0 \ub300\uc2e0 \ubb34\ud6a8\ud654\ub97c \uc6b0\uc120 \uace0\ub824\ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubcc0\uacbd\ub41c \uc804\uccb4 \uac1d\uccb4\ub97c \uc9c1\uc811 \uac31\uc2e0\ud558\ub294 \ubc29\uc2dd\uc740 \ub3d9\uc2dc \uc5c5\ub370\uc774\ud2b8 \uc0c1\ud669\uc5d0\uc11c \uc624\ub798\ub41c \ud544\ub4dc\uac00 \ub0a8\uc744 \uc218 \uc788\ub2e4. \ucd5c\uc2e0 \uac1d\uccb4\ub97c \ub2e4\uc2dc \uc870\ud68c\ud558\uac70\ub098 \uce90\uc2dc\ub97c \uc0ad\uc81c\ud558\uc5ec \ub2e4\uc74c \uc870\ud68c\uc5d0\uc11c \uc7ac\uc801\uc7ac\ud558\ub3c4\ub85d \ud558\uba74 \uad00\ub9ac\uac00 \ub2e8\uc21c\ud574\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uce90\uc2dc TTL\uc744 \uc124\uc815\ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc \ubb34\ud6a8\ud654\uac00 \uc2e4\ud328\ud558\ub354\ub77c\ub3c4 \uc77c\uc815 \uc2dc\uac04\uc774 \uc9c0\ub098\uba74 \uc624\ub798\ub41c \ub370\uc774\ud130\uac00 \uc81c\uac70\ub418\ub3c4\ub85d \ud55c\ub2e4. TTL\uc740 \ubcf5\uad6c \uc218\ub2e8\uc774\uc9c0, \uc989\uac01\uc801\uc778 \uc815\ud569\uc131 \ubcf4\uc7a5 \uc218\ub2e8\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ubc84\uc804 \uc815\ubcf4\ub97c \ud65c\uc6a9\ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\uc5d0 \ubc84\uc804 \ubc88\ud638\ub098 \uc99d\uac00\ud558\ub294 \ubcc0\uacbd \uc21c\ubc88\uc744 \ubd80\uc5ec\ud558\uace0, \uce90\uc2dc\ub97c \uac31\uc2e0\ud560 \ub54c \uae30\uc874 \ubc84\uc804\ubcf4\ub2e4 \uc624\ub798\ub41c \uac12\uc774 \ucd5c\uc2e0 \uce90\uc2dc\ub97c \ub36e\uc9c0 \ubabb\ud558\ub3c4\ub85d \uc124\uacc4\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type VersionedProfile = {\n  id: number;\n  nickname: string;\n  version: number;\n};<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \ubc84\uc804 \ube44\uad50\uc640 \uc800\uc7a5\uc774 \ubcc4\ub3c4 \uc791\uc5c5\uc73c\ub85c \uc218\ud589\ub418\uba74 \uadf8 \uc0ac\uc774\uc5d0 \ub2e4\ub978 \uc694\uccad\uc774 \ub07c\uc5b4\ub4e4 \uc218 \uc788\ub2e4. \uc2e4\uc81c \uc801\uc6a9\uc5d0\uc11c\ub294 Redis Lua \uc2a4\ud06c\ub9bd\ud2b8 \ub4f1\uc744 \ud65c\uc6a9\ud574 \ube44\uad50\uc640 \uac31\uc2e0\uc744 \uc6d0\uc790\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\uac70\ub098, \ub2e4\ub978 \ub3d9\uae30\ud654 \uc804\ub7b5\uacfc \uacb0\ud569\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Transactional Outbox\ub97c \ud65c\uc6a9\ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DB \ud2b8\ub79c\uc7ad\uc158 \uc548\uc5d0\uc11c \ub370\uc774\ud130 \ubcc0\uacbd\uacfc \uc774\ubca4\ud2b8 \uae30\ub85d\uc744 \ud568\uaed8 \uc218\ud589\ud55c \ub4a4, \ubcc4\ub3c4\uc758 \uc791\uc5c5\uc790\uac00 \uc774\ubca4\ud2b8\ub97c \uc77d\uc5b4 \uce90\uc2dc\ub97c \ubb34\ud6a8\ud654\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DB \ud2b8\ub79c\uc7ad\uc158\n    |\n    +-- \uc0ac\uc6a9\uc790 \ub370\uc774\ud130 \ubcc0\uacbd\n    |\n    +-- Outbox \uc774\ubca4\ud2b8 \uae30\ub85d\n             |\n             v\n        \uc774\ubca4\ud2b8 \ucc98\ub9ac \uc791\uc5c5\uc790\n             |\n             v\n        Redis \uce90\uc2dc \ubb34\ud6a8\ud654<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130 \ubcc0\uacbd\uacfc \uc774\ubca4\ud2b8 \uae30\ub85d\uc744 \uac19\uc740 DB \ud2b8\ub79c\uc7ad\uc158\uc5d0 \ud3ec\ud568\ud558\uba74, DB \ubcc0\uacbd\uc740 \uc131\uacf5\ud588\uc9c0\ub9cc \uc774\ubca4\ud2b8 \uae30\ub85d\uc774 \ub204\ub77d\ub418\ub294 \ubb38\uc81c\ub97c \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8, Outbox \uc774\ubca4\ud2b8 \ucc98\ub9ac\uc640 Redis \uac31\uc2e0\uc740 \ubcc4\ub3c4\ub85c \uc9c4\ud589\ub418\ubbc0\ub85c \uc989\uac01\uc801\uc778 \uc77c\uad00\uc131\uc744 \ubcf4\uc7a5\ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc774\ubca4\ud2b8 \uc911\ubcf5 \ucc98\ub9ac, \uc7ac\uc2dc\ub3c4, \uc21c\uc11c \uc5ed\uc804 \ub4f1\uc744 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc911\uc694\ud55c \ub370\uc774\ud130\ub294 DB\ub97c \uae30\uc900\uc73c\ub85c \uac80\uc99d\ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud3ec\uc778\ud2b8 \uc794\uc561, \uacb0\uc81c, \uc544\uc774\ud15c \uad6c\ub9e4, \ubcf4\uc0c1 \uc9c0\uae09\ucc98\ub7fc \ub370\uc774\ud130 \uc815\ud569\uc131\uc774 \uc911\uc694\ud55c \uae30\ub2a5\uc5d0\uc11c\ub294 \uce90\uc2dc\ub97c \ucd5c\uc885\uc801\uc778 \ud310\ub2e8 \uadfc\uac70\ub85c \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uac8c\uc784 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uce90\uc2dc\uc5d0\uc11c \ud3ec\uc778\ud2b8 \uc794\uc561\uc744 \uc870\ud68c\ud560 \uc218\ub294 \uc788\uc9c0\ub9cc, \uc544\uc774\ud15c \uad6c\ub9e4 \uac00\ub2a5 \uc5ec\ubd80\ub97c \ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud560 \ub54c\ub294 DB \ud2b8\ub79c\uc7ad\uc158\uacfc \uc6d0\uc790\uc801 \uc794\uc561 \ucc28\uac10, \uc720\ub2c8\ud06c \uc81c\uc57d \uc870\uac74 \ub4f1\uc744 \ud1b5\ud574 \uc815\ud655\uc131\uc744 \ubcf4\uc7a5\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc\ub294 \uc870\ud68c \uc131\ub2a5\uc744 \ub192\uc774\ub294 \ub3c4\uad6c\ub2e4. \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc758 \uc815\ud655\uc131\uc744 \ub300\uc2e0 \ubcf4\uc7a5\ud558\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c\uc758 \uce90\uc2dc \uc124\uacc4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uc11c\ubc84\ub294 \ub370\uc774\ud130\uc758 \ud2b9\uc131\uc5d0 \ub530\ub77c \uc11c\ub85c \ub2e4\ub978 \uce90\uc2dc \uc804\ub7b5\uc744 \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\ub370\uc774\ud130<\/th><th>\uad8c\uc7a5 \uc811\uadfc<\/th><th>\uc8fc\uc694 \uace0\ub824 \uc0ac\ud56d<\/th><\/tr><tr><td>\ud50c\ub808\uc774\uc5b4 \ud504\ub85c\ud544<\/td><td>Cache-Aside<\/td><td>\uce90\uc2dc \uc0ad\uc81c, TTL<\/td><\/tr><tr><td>\uc544\uc774\ud15c \uc815\ubcf4<\/td><td>Cache-Aside \ub610\ub294 \uc0ac\uc804 \uac31\uc2e0<\/td><td>\ub192\uc740 \uc870\ud68c \ube48\ub3c4, \ubcc0\uacbd \ube48\ub3c4<\/td><\/tr><tr><td>\ub7ad\ud0b9<\/td><td>Redis Sorted Set \ub4f1<\/td><td>\uc810\uc218 \uac31\uc2e0 \uc21c\uc11c, \uc7ac\uacc4\uc0b0<\/td><\/tr><tr><td>\uc870\ud68c\uc218 \ubc0f \ud1b5\uacc4<\/td><td>\uc9d1\uacc4 \ud6c4 \ube44\ub3d9\uae30 \ubc18\uc601 \uac00\ub2a5<\/td><td>\uc911\ubcf5 \uc774\ubca4\ud2b8, \ub370\uc774\ud130 \uc190\uc2e4<\/td><\/tr><tr><td>\ud3ec\uc778\ud2b8 \uc794\uc561<\/td><td>DB \uc911\uc2ec \ud2b8\ub79c\uc7ad\uc158<\/td><td>\uc6d0\uc790\uc801 \ucc28\uac10, \uc911\ubcf5 \uc694\uccad \ubc29\uc9c0<\/td><\/tr><tr><td>\uad6c\ub9e4 \ub0b4\uc5ed<\/td><td>DB \ud2b8\ub79c\uc7ad\uc158<\/td><td>\uc720\ub2c8\ud06c \uc81c\uc57d, \uba71\ub4f1\uc131<\/td><\/tr><tr><td>\ub9e4\uce58\uba54\uc774\ud0b9 \ub300\uae30\uc5f4<\/td><td>Redis \ub4f1 \uc2e4\uc2dc\uac04 \uc0c1\ud0dc \uc800\uc7a5\uc18c<\/td><td>\ub9cc\ub8cc, \uc911\ubcf5 \ub4f1\ub85d, \uc7a5\uc560 \ubcf5\uad6c<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \uc911\uc694\ud55c \uc810\uc740 \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \ub3d9\uc77c\ud55c \ubc29\uc2dd\uc73c\ub85c \uce90\uc2f1\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud504\ub85c\ud544\ucc98\ub7fc \uc7a0\uc2dc \uc624\ub798\ub41c \ub370\uc774\ud130\uac00 \ub178\ucd9c\ub418\uc5b4\ub3c4 \ud070 \ubb38\uc81c\uac00 \uc5c6\ub294 \uc815\ubcf4\uc640, \ud3ec\uc778\ud2b8\ucc98\ub7fc \uc798\ubabb\ub41c \uac12\uc774 \uacbd\uc81c\uc801 \uc190\uc2e4\uc744 \uc720\ubc1c\ud558\ub294 \ub370\uc774\ud130\ub294 \uc694\uad6c\ub418\ub294 \uc815\ud569\uc131 \uc218\uc900\uc774 \ub2e4\ub974\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uce90\uc2dc \uc804\ub7b5\uc740 \uc131\ub2a5\ubfd0\ub9cc \uc544\ub2c8\ub77c \ub370\uc774\ud130\uc758 \uc911\uc694\ub3c4\uc640 \ud5c8\uc6a9 \uac00\ub2a5\ud55c \uc624\ub958 \ubc94\uc704\ub97c \uae30\uc900\uc73c\ub85c \uc120\ud0dd\ud574\uc57c \ud55c\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uce90\uc2dc(Cache)\ub780? \uce90\uc2dc(Cache)\ub294 \uc790\uc8fc \uc870\ud68c\ud558\ub294 \ub370\uc774\ud130\ub97c \ub354 \ube60\ub974\uac8c \uc81c\uacf5\ud558\uae30 \uc704\ud574 \uc784\uc2dc\ub85c \uc800\uc7a5\ud558\ub294 \ub370\uc774\ud130 \uc800\uc7a5\uc18c\ub2e4. \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubc18\ubcf5\uc801\uc73c\ub85c \uc811\uadfc\ud558\ub294 \ube44\uc6a9\uc744 \uc904\uc774\uace0, \uc751\ub2f5 \uc2dc\uac04\uc744 \ub2e8\ucd95\ud558\uba70, \uc2dc\uc2a4\ud15c \uc804\uccb4\uc758 \ucc98\ub9ac\ub7c9\uc744 \ub192\uc774\ub294 \ub370 \uc0ac\uc6a9\ud55c\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uce90\uc2dc\ub294 \uba54\ubaa8\ub9ac \uae30\ubc18 \uc800\uc7a5\uc18c\uc778 Redis\ub97c \ud65c\uc6a9\ud55c\ub2e4. \uba54\ubaa8\ub9ac \uc811\uadfc\uc740 \ub514\uc2a4\ud06c \uae30\ubc18 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc870\ud68c\ubcf4\ub2e4 \ube60\ub974\uba70, \ub124\ud2b8\uc6cc\ud06c\ub97c \ud1b5\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc811\uadfc\uacfc \ucffc\ub9ac \uc2e4\ud589 \ube44\uc6a9\ub3c4 \uc904\uc77c \uc218 \uc788\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2684","post","type-post","status-publish","format-standard","hentry","category-dev-logs"],"_links":{"self":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2684","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2684"}],"version-history":[{"count":2,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2684\/revisions"}],"predecessor-version":[{"id":2690,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2684\/revisions\/2690"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2684"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2684"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2684"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}