{"id":2643,"date":"2026-10-24T08:41:18","date_gmt":"2026-10-24T08:41:18","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=2643"},"modified":"2026-10-24T08:41:18","modified_gmt":"2026-10-24T08:41:18","slug":"colyseus-%ea%b8%b0%eb%b0%98-%ec%8b%a4%ec%8b%9c%ea%b0%84-%ea%b2%8c%ec%9e%84-%ec%84%9c%eb%b2%84-%ec%84%a4%ea%b3%84","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=2643","title":{"rendered":"Colyseus \uae30\ubc18 \uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84 \uc124\uacc4"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Colyseus\ub294 Node.js \ud658\uacbd\uc5d0\uc11c \uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774\uc5b4 \uac8c\uc784 \uc11c\ubc84\ub97c \uac1c\ubc1c\ud558\uae30 \uc704\ud55c \uc624\ud508\uc18c\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c\ub2e4. Room \uae30\ubc18 \uac8c\uc784 \uc138\uc158 \uad00\ub9ac, Schema \uae30\ubc18 \uc0c1\ud0dc \ub3d9\uae30\ud654, \ud074\ub77c\uc774\uc5b8\ud2b8 \uba54\uc2dc\uc9c0 \ucc98\ub9ac, \uc138\uc158 \ubcf5\uad6c \ub4f1\uc758 \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 REST API \uc11c\ubc84\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uace0 \uc751\ub2f5\uc744 \ubc18\ud658\ud558\ub294 \ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4. \ubc18\uba74 \uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774\uc5b4 \uac8c\uc784 \uc11c\ubc84\ub294 \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ud558\ub098\uc758 \uac8c\uc784 \uc138\uc158\uc5d0 \ucc38\uc5ec\ud558\uba70, \uc11c\ubc84\uc5d0\uc11c \ubcc0\uacbd\ub41c \uc0c1\ud0dc\ub97c \ucc38\uc5ec\uc790\ub4e4\uc5d0\uac8c \uc9c0\uc18d\uc801\uc73c\ub85c \uc804\ub2ec\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus\ub294 \uc774\ub7ec\ud55c \uad6c\uc870\ub97c Room\uc774\ub77c\ub294 \ub2e8\uc704\ub85c \ucd94\uc0c1\ud654\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubc88 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \ub2e4\uc74c \ud56d\ubaa9\uc744 \uc911\uc2ec\uc73c\ub85c \uc0b4\ud3b4\ubcf8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Room \uc0dd\uc131 \ubc0f \uad00\ub9ac<\/li>\n\n\n\n<li>Schema \uae30\ubc18 \uc0c1\ud0dc \ub3d9\uae30\ud654<\/li>\n\n\n\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8 \uba54\uc2dc\uc9c0 \uac80\uc99d<\/li>\n\n\n\n<li>\uc7ac\uc811\uc18d \ubc0f Room \ubcf5\uad6c<\/li>\n\n\n\n<li>\ub2e4\uc911 \uc11c\ubc84 \uc6b4\uc601 \uad6c\uc870<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Room \uc0dd\uc131 \ubc0f \uad00\ub9ac<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Room\uc774\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \ub3c5\ub9bd\uc801\uc778 \uac8c\uc784 \uc138\uc158\uc744 \uad00\ub9ac\ud558\ub294 \ub2e8\uc704\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 4\uc778 \ud611\ub3d9 \uacf5\ud3ec \uac8c\uc784\uc744 \uac1c\ubc1c\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uc790. \ub124 \uba85\uc758 \ud50c\ub808\uc774\uc5b4\uac00 \ud558\ub098\uc758 \uac8c\uc784\uc5d0 \ucc38\uac00\ud558\uba74 \ud574\ub2f9 \ud50c\ub808\uc774\uc5b4\ub4e4\uc740 \uac19\uc740 Room\uc5d0 \uc18d\ud55c\ub2e4. \ub2e4\ub978 \ub124 \uba85\uc774 \uc0c8\ub85c\uc6b4 \uac8c\uc784\uc744 \uc2dc\uc791\ud558\uba74 \ubcc4\ub3c4\uc758 Room\uc774 \uc0dd\uc131\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uc5ed\ud560\uc744 \ub2f4\ub2f9\ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud50c\ub808\uc774\uc5b4\uc758 \uc785\uc7a5\uacfc \ud1f4\uc7a5 \ucc98\ub9ac<\/li>\n\n\n\n<li>\uac8c\uc784 \uc138\uc158\uc758 \uc0c1\ud0dc \uad00\ub9ac<\/li>\n\n\n\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8 \uba54\uc2dc\uc9c0 \uc218\uc2e0 \ubc0f \ucc98\ub9ac<\/li>\n\n\n\n<li>\uac8c\uc784 \ub85c\uc9c1 \uc2e4\ud589<\/li>\n\n\n\n<li>\uc0c1\ud0dc \ubcc0\uacbd \ubc0f \ub3d9\uae30\ud654<\/li>\n\n\n\n<li>\uc138\uc158 \uc885\ub8cc\uc640 \uc790\uc6d0 \uc815\ub9ac<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \ub2e8\uc21c\ud55c \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \uadf8\ub8f9\uc774 \uc544\ub2c8\ub2e4. \ud558\ub098\uc758 \uac8c\uc784 \uc138\uc158\uc744 \uad6c\uc131\ud558\ub294 \uc0c1\ud0dc\uc640 \ub85c\uc9c1\uc758 \uacbd\uacc4\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room\uc758 \uc0dd\uba85\uc8fc\uae30<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 Room\uc758 \uc0dd\uba85\uc8fc\uae30\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><code>onCreate()<\/code> \u2014 Room \ucd08\uae30\ud654 \ubc0f \uba54\uc2dc\uc9c0 \ud578\ub4e4\ub7ec \ub4f1\ub85d<\/li>\n\n\n\n<li><code>onJoin()<\/code> \u2014 \ud50c\ub808\uc774\uc5b4 \uc785\uc7a5 \ucc98\ub9ac<\/li>\n\n\n\n<li><code>onLeave()<\/code> \u2014 \ud50c\ub808\uc774\uc5b4 \uc5f0\uacb0 \uc885\ub8cc \ucc98\ub9ac<\/li>\n\n\n\n<li><code>onDispose()<\/code> \u2014 Room \uc885\ub8cc \ubc0f \uc790\uc6d0 \uc815\ub9ac<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><code>onLeave()<\/code>\uc640 <code>onDispose()<\/code>\ub294 \uc11c\ub85c \ub2e4\ub978 \uc758\ubbf8\ub97c \uac16\ub294\ub2e4. \ud50c\ub808\uc774\uc5b4\uac00 \uc5f0\uacb0\uc744 \uc885\ub8cc\ud588\ub2e4\uace0 \ud574\uc11c Room \uc790\uccb4\uac00 \uc989\uc2dc \uc885\ub8cc\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \ub2e4\ub978 \ud50c\ub808\uc774\uc5b4\uac00 \ub0a8\uc544 \uc788\uac70\ub098, \uc7ac\uc811\uc18d\uc744 \ud5c8\uc6a9\ud574\uc57c \ud560 \uc218\ub3c4 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room \uad6c\ud604 \uc608\uc81c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc544\ub798\ub294 TypeScript \uae30\ubc18\uc758 \uae30\ubcf8\uc801\uc778 Room \uad6c\ud604 \uc608\uc81c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Room, Client } from \"colyseus\";\n\ninterface Player {\n  sessionId: string;\n  x: number;\n  y: number;\n}\n\nexport class GameRoom extends Room {\n  maxClients = 4;\n\n  private players = new Map&lt;string, Player&gt;();\n\n  onCreate() {\n    this.onMessage(\"move\", (client, message) =&gt; {\n      this.handleMove(client, message);\n    });\n\n    console.log(\"GameRoom created:\", this.roomId);\n  }\n\n  onJoin(client: Client) {\n    this.players.set(client.sessionId, {\n      sessionId: client.sessionId,\n      x: 0,\n      y: 0,\n    });\n\n    console.log(\"Player joined:\", client.sessionId);\n  }\n\n  onLeave(client: Client) {\n    this.players.delete(client.sessionId);\n\n    console.log(\"Player left:\", client.sessionId);\n  }\n\n  onDispose() {\n    this.players.clear();\n\n    console.log(\"GameRoom disposed:\", this.roomId);\n  }\n\n  private handleMove(\n    client: Client,\n    message: unknown\n  ) {\n    \/\/ \uc2e4\uc81c \uac80\uc99d\uc740 \ubcc4\ub3c4 \uac80\uc99d \ud568\uc218\uc5d0\uc11c \uc218\ud589\ud55c\ub2e4.\n    if (\n      typeof message !== \"object\" ||\n      message === null ||\n      !(\"x\" in message) ||\n      !(\"y\" in message)\n    ) {\n      return;\n    }\n\n    const { x, y } = message as {\n      x: unknown;\n      y: unknown;\n    };\n\n    if (\n      typeof x !== \"number\" ||\n      typeof y !== \"number\" ||\n      !Number.isFinite(x) ||\n      !Number.isFinite(y)\n    ) {\n      return;\n    }\n\n    const player = this.players.get(client.sessionId);\n\n    if (!player) {\n      return;\n    }\n\n    \/\/ \uc608\uc81c\uc5d0\uc11c\ub294 \uc11c\ubc84\uac00 \uc88c\ud45c\ub97c \ubcc0\uacbd\ud55c\ub2e4.\n    player.x = x;\n    player.y = y;\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ucf54\ub4dc\ub294 Room\uc758 \uae30\ubcf8\uc801\uc778 \uad6c\uc870\ub97c \uc124\uba85\ud558\uae30 \uc704\ud55c \uc608\uc81c\ub2e4. \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc804\ub2ec\ud55c \uc88c\ud45c\ub97c \uadf8\ub300\ub85c \uc801\uc6a9\ud558\uc9c0 \uc54a\uace0, \uc774\ub3d9 \uc18d\ub3c4\uc640 \ucda9\ub3cc \uc5ec\ubd80, \uc774\ub3d9 \uac00\ub2a5 \uc601\uc5ed \ub4f1\uc744 \uc11c\ubc84\uc5d0\uc11c \uac80\uc99d\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c \uc704 \ucf54\ub4dc\ub294 \uc77c\ubc18\uc801\uc778 JavaScript <code>Map<\/code>\uc744 \uc0ac\uc6a9\ud558\ubbc0\ub85c Colyseus\uc758 Schema \uc790\ub3d9 \ub3d9\uae30\ud654\ub97c \uc218\ud589\ud558\uc9c0 \uc54a\ub294\ub2e4. \uc0c1\ud0dc \ub3d9\uae30\ud654\ub97c \uad6c\ud604\ud558\ub824\uba74 \ub2e4\uc74c \uc808\uc5d0\uc11c \uc124\uba85\ud558\ub294 <code>Schema<\/code>\uc640 <code>MapSchema<\/code> \ub4f1\uc758 \uc790\ub8cc\uad6c\uc870\ub97c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room \uc0dd\uc131\uacfc \ub9e4\uce6d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \uc9c1\uc811 \uc0dd\uc131\ud560 \uc218\ub3c4 \uc788\uace0, \ub9e4\uce58\uba54\uc774\ud0b9\uc744 \ud1b5\ud574 \ucc38\uac00\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub300\ud45c\uc801\uc778 \uba54\uc11c\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \uc0c8\ub85c\uc6b4 Room \uc0dd\uc131\nconst room = await client.create(\"game_room\");\n\n\/\/ \uc870\uac74\uc5d0 \ub9de\ub294 \uae30\uc874 Room \ucc38\uac00\nconst joined = await client.join(\"game_room\");\n\n\/\/ \uc870\uac74\uc5d0 \ub9de\ub294 Room\uc774 \uc5c6\uc73c\uba74 \uc0dd\uc131\ud558\uace0 \ucc38\uac00\nconst createdOrJoined =\n  await client.joinOrCreate(\"game_room\");\n\n\/\/ \ud544\ud130 \uc870\uac74\uc5d0 \ub9de\ub294 Room \ucc38\uac00 \ub610\ub294 \uc0dd\uc131\nconst filtered =\n  await client.joinOrCreate(\"game_room\", {\n    region: \"asia\",\n    difficulty: \"normal\",\n  });<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>joinOrCreate()<\/code>\ub294 \ub9e4\uce58\uba54\uc774\ud0b9 \uacfc\uc815\uc5d0\uc11c \uc790\uc8fc \uc0ac\uc6a9\ud55c\ub2e4. \ub2e4\ub9cc \uc804\ub2ec\ud55c \uc635\uc158\uc774 \uc2e4\uc81c\ub85c Room\uc744 \ud544\ud130\ub9c1\ud558\uac70\ub098 \ucc38\uac00 \uc870\uac74\uc744 \uac15\uc81c\ud558\ub294\uc9c0\ub294 \uc11c\ubc84\uc758 <code>filterBy()<\/code> \uc124\uc815\uacfc Room \uad6c\ud604\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uac8c\uc784\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc870\uac74\uc744 \uace0\ub824\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud604\uc7ac \ud50c\ub808\uc774\uc5b4 \uc218<\/li>\n\n\n\n<li>\uac8c\uc784 \ubaa8\ub4dc\uc640 \ub09c\uc774\ub3c4<\/li>\n\n\n\n<li>\uc9c0\uc5ed \ubc0f \ub124\ud2b8\uc6cc\ud06c \ud658\uacbd<\/li>\n\n\n\n<li>\ud30c\ud2f0 ID<\/li>\n\n\n\n<li>\ub7ad\ud06c\uc640 \ub9e4\uce6d \uc810\uc218<\/li>\n\n\n\n<li>Room\uc758 \ud604\uc7ac \uc9c4\ud589 \uc0c1\ud0dc<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 Room\uc744 \ubb34\uc870\uac74 \ucc38\uac00 \uac00\ub2a5\ud55c \uc0c1\ud0dc\ub85c \uc720\uc9c0\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4. \uac8c\uc784\uc774 \uc2dc\uc791\ub41c Room\uc5d0 \uc2e0\uaddc \ud50c\ub808\uc774\uc5b4\uac00 \ucc38\uac00\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \ud558\ub294 \ub4f1\uc758 \uc815\ucc45\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Schema \uae30\ubc18 \uc0c1\ud0dc \ub3d9\uae30\ud654<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud0dc \ub3d9\uae30\ud654\uac00 \ud544\uc694\ud55c \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uba40\ud2f0\ud50c\ub808\uc774\uc5b4 \uac8c\uc784\uc5d0\uc11c\ub294 \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub3d9\uc77c\ud55c \uac8c\uc784 \uc138\uacc4\ub97c \uad00\ucc30\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4 A\uac00 \uc774\ub3d9\ud558\uba74 \ud50c\ub808\uc774\uc5b4 B\uc758 \ud654\uba74\uc5d0\uc11c\ub3c4 A\uc758 \uc704\uce58\uac00 \ubcc0\uacbd\ub418\uc5b4\uc57c \ud55c\ub2e4. \uc77c\ubc18\uc801\uc778 REST API \ubc29\uc2dd\uc774\ub77c\uba74 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc8fc\uae30\uc801\uc73c\ub85c \uc11c\ubc84\uc5d0 \uc0c1\ud0dc\ub97c \uc694\uccad\ud558\uac70\ub098, \ubcc4\ub3c4\uc758 \uc2e4\uc2dc\uac04 \ud1b5\uc2e0 \uacc4\uce35\uc744 \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus\ub294 Schema \uae30\ubc18 \uc0c1\ud0dc \ub3d9\uae30\ud654\ub97c \ud1b5\ud574 \uc774\ub7ec\ud55c \uacfc\uc815\uc744 \ub2e8\uc21c\ud654\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub294 \ub3d9\uae30\ud654\ud560 \uc0c1\ud0dc\ub97c \uc815\uc758\ud558\uace0 \ud574\ub2f9 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud55c\ub2e4. Colyseus\ub294 Schema\uc758 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ucd94\uc801\ud574 \uc5f0\uacb0\ub41c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \ud544\uc694\ud55c \uc0c1\ud0dc \uc5c5\ub370\uc774\ud2b8\ub97c \uc804\ub2ec\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud575\uc2ec\uc740 <strong>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc9c1\uc811 \uc0c1\ud0dc\ub97c \ub3d9\uae30\ud654\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c, \uc11c\ubc84\uac00 \uad00\ub9ac\ud558\ub294 \uc0c1\ud0dc\ub97c \uae30\uc900\uc73c\ub85c \ubcc0\uacbd \uc0ac\ud56d\uc744 \uc804\ub2ec\ud55c\ub2e4\ub294 \uc810<\/strong>\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schema \uc815\uc758<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus\uc5d0\uc11c\ub294 <code>@colyseus\/schema<\/code> \ud328\ud0a4\uc9c0\uc758 <code>Schema<\/code>, <code>MapSchema<\/code>, <code>ArraySchema<\/code>, <code>type<\/code> \ub4f1\uc744 \uc0ac\uc6a9\ud574 \ub3d9\uae30\ud654\ud560 \uc0c1\ud0dc\ub97c \uc815\uc758\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {\n  Schema,\n  MapSchema,\n  type,\n} from \"@colyseus\/schema\";\n\nexport class PlayerState extends Schema {\n  @type(\"number\")\n  x = 0;\n\n  @type(\"number\")\n  y = 0;\n\n  @type(\"number\")\n  hp = 100;\n\n  @type(\"string\")\n  nickname = \"\";\n}\n\nexport class GameState extends Schema {\n  @type({\n    map: PlayerState,\n  })\n  players = new MapSchema&lt;PlayerState&gt;();\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>PlayerState<\/code>\ub294 \ud50c\ub808\uc774\uc5b4 \ud55c \uba85\uc758 \uc0c1\ud0dc\ub97c \ud45c\ud604\ud55c\ub2e4. <code>GameState<\/code>\ub294 \uc804\uccb4 \uac8c\uc784 \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud558\uba70, <code>players<\/code>\ub97c \ud1b5\ud574 \uc5ec\ub7ec \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc\ub97c \ubcf4\uad00\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c <code>@type()<\/code>\uc740 \ub2e8\uc21c\ud55c TypeScript \ud0c0\uc785 \uc120\uc5b8\uc774 \uc544\ub2c8\ub2e4. Schema \uc9c1\ub82c\ud654\uc640 \ub124\ud2b8\uc6cc\ud06c \uc0c1\ud0dc \ub3d9\uae30\ud654\uc5d0 \ud544\uc694\ud55c \ud0c0\uc785 \uc815\ubcf4\ub97c \uc81c\uacf5\ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room\uc5d0 Schema \uc801\uc6a9\ud558\uae30<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc758 \uc0c1\ud0dc\ub97c <code>setState()<\/code>\ub85c \uc124\uc815\ud558\uba74 Colyseus\uac00 \ud574\ub2f9 Schema\ub97c \uae30\uc900\uc73c\ub85c \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Room, Client } from \"colyseus\";\nimport { PlayerState, GameState } from \".\/GameState\";\n\nexport class GameRoom extends Room&lt;GameState&gt; {\n  maxClients = 4;\n\n  onCreate() {\n    this.setState(new GameState());\n  }\n\n  onJoin(client: Client, options: {\n    nickname?: string;\n  }) {\n    const player = new PlayerState();\n\n    player.nickname =\n      options.nickname ?? \"Unknown\";\n\n    this.state.players.set(\n      client.sessionId,\n      player\n    );\n  }\n\n  onLeave(client: Client) {\n    this.state.players.delete(client.sessionId);\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc785\uc7a5\ud558\uba74 \uc11c\ubc84\ub294 \ud50c\ub808\uc774\uc5b4 \uc0c1\ud0dc\ub97c \uc0dd\uc131\ud574 <code>players<\/code>\uc5d0 \ucd94\uac00\ud55c\ub2e4. \ud1f4\uc7a5\ud558\uba74 \ud574\ub2f9 \uc0c1\ud0dc\ub97c \uc81c\uac70\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ud6c4 \uc11c\ubc84\uc5d0\uc11c <code>player.x<\/code>, <code>player.y<\/code>, <code>player.hp<\/code> \ub4f1\uc744 \ubcc0\uacbd\ud558\uba74 Schema\uac00 \ucd94\uc801\ud558\ub294 \ubcc0\uacbd \uc0ac\ud56d\uc774 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \ub3d9\uae30\ud654\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc218\uc2e0\ud558\ub294 \uc0c1\ud0dc \ubcc0\uacbd \uc774\ubca4\ud2b8\uc640 \uad6c\uccb4\uc801\uc778 \ucf5c\ubc31 API\ub294 \uc0ac\uc6a9 \uc911\uc778 Colyseus \ud074\ub77c\uc774\uc5b8\ud2b8 SDK \ubc84\uc804\uc5d0 \ub9de\ucdb0 \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc804\uccb4 \uc0c1\ud0dc \uc804\uc1a1\uacfc \ubcc0\uacbd \uc0ac\ud56d \uc804\uc1a1<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c1\ud0dc \ub3d9\uae30\ud654\ub294 \ud06c\uac8c \ub450 \uac00\uc9c0 \uad00\uc810\uc73c\ub85c \uad6c\ubd84\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ucd08\uae30 \uc0c1\ud0dc<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud50c\ub808\uc774\uc5b4\uac00 Room\uc5d0 \uc785\uc7a5\ud560 \ub54c \ud604\uc7ac \uac8c\uc784 \uc0c1\ud0dc\ub97c \ud30c\uc545\ud560 \uc218 \uc788\ub3c4\ub85d \ucd08\uae30 \uc0c1\ud0dc\ub97c \uc804\ub2ec\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc0c1\ud0dc \ubcc0\uacbd \uc0ac\ud56d<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubbf8 \uc785\uc7a5\ud55c \ud50c\ub808\uc774\uc5b4\uc5d0\uac8c\ub294 \uc774\ud6c4 \ubcc0\uacbd\ub41c \uc0c1\ud0dc\ub97c \uc804\ub2ec\ud55c\ub2e4. Schema \uae30\ubc18 \ub3d9\uae30\ud654\ub294 \ubcc0\uacbd \uc0ac\ud56d\uc744 \ucd94\uc801\ud574 \uc804\uccb4 \uc0c1\ud0dc\ub97c \ub9e4\ubc88 \ub2e4\uc2dc \ubcf4\ub0b4\ub294 \ubc29\uc2dd\ubcf4\ub2e4 \ubd88\ud544\uc694\ud55c \uc804\uc1a1\uc744 \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4 100\uba85\uc758 \uc88c\ud45c\ub97c \ub9e4\ubc88 \uc804\uccb4 \uc804\uc1a1\ud558\ub294 \ub300\uc2e0 \ubcc0\uacbd\ub41c \ud544\ub4dc \uc911\uc2ec\uc73c\ub85c \ub3d9\uae30\ud654\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \uc2e4\uc81c \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9\ub7c9\uc740 \uc0c1\ud0dc \uad6c\uc870, \ubcc0\uacbd \ube48\ub3c4, \ud074\ub77c\uc774\uc5b8\ud2b8 \uc218, \uba54\uc2dc\uc9c0 \ud06c\uae30 \ub4f1\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c4\ub2e4. Schema\ub97c \uc0ac\uc6a9\ud55c\ub2e4\uace0 \ud574\uc11c \ubaa8\ub4e0 \uac8c\uc784\uc5d0\uc11c \uc790\ub3d9\uc73c\ub85c \ucd5c\uc801\uc758 \ub124\ud2b8\uc6cc\ud06c \uc131\ub2a5\uc774 \ubcf4\uc7a5\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Schema\uc640 \uc11c\ubc84 \uad8c\ud55c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Schema\ub294 \uc0c1\ud0dc \ub3d9\uae30\ud654 \uc218\ub2e8\uc774\uc9c0, \ubcf4\uc548 \uae30\ub2a5 \uc790\uccb4\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub294 \uc704\ud5d8\ud558\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \uc704\ud5d8\ud55c \uc124\uacc4\uc758 \uac1c\ub150\uc801 \uc608\uc2dc\nthis.state.players.get(client.sessionId)!.hp =\n  message.hp;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc804\ub2ec\ud55c \uccb4\ub825\uc744 \uadf8\ub300\ub85c \ubc18\uc601\ud558\uba74 \uacf5\uaca9\uc744 \ubc1b\uc9c0 \uc54a\uc740 \ud50c\ub808\uc774\uc5b4\uac00 \uc784\uc758\ub85c \uccb4\ub825\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc62c\ubc14\ub978 \uad6c\uc870\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ud589\ub3d9 \uc758\ub3c4\ub97c \uc804\ub2ec\ud558\uace0, \uc11c\ubc84\uac00 \uaddc\uce59\uc744 \uac80\uc99d\ud55c \ub4a4 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>this.onMessage(\"attack\", (client, message) =&gt; {\n  const attacker =\n    this.state.players.get(client.sessionId);\n\n  if (!attacker) {\n    return;\n  }\n\n  \/\/ \ub300\uc0c1, \uc0ac\uac70\ub9ac, \uacf5\uaca9 \uc18d\ub3c4,\n  \/\/ \ucfe8\ub2e4\uc6b4, \uc0dd\uc874 \uc5ec\ubd80 \ub4f1\uc744 \uac80\uc99d\ud55c\ub2e4.\n  \/\/ \uac80\uc99d\uc5d0 \uc131\uacf5\ud55c \uacbd\uc6b0\uc5d0\ub9cc \uc11c\ubc84\uac00 \uccb4\ub825\uc744 \ubcc0\uacbd\ud55c\ub2e4.\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784\uc5d0\uc11c Schema\ub294 \uc11c\ubc84\uac00 \uacb0\uc815\ud55c \uacb0\uacfc\ub97c \uc804\ub2ec\ud558\ub294 \uc5ed\ud560\uc744 \ud55c\ub2e4. \uac8c\uc784 \uaddc\uce59\uc758 \ucd5c\uc885 \uad8c\ud55c\uc740 \uc11c\ubc84\uc5d0 \uc788\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uba54\uc2dc\uc9c0 \uac80\uc99d<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ud074\ub77c\uc774\uc5b8\ud2b8 \uba54\uc2dc\uc9c0\ub97c \uc2e0\ub8b0\ud558\uba74 \uc548 \ub418\ub294 \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc0ac\uc6a9\uc790\uac00 \uc81c\uc5b4\ud558\ub294 \ud658\uacbd\uc5d0\uc11c \uc2e4\ud589\ub41c\ub2e4. \ub530\ub77c\uc11c \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc804\ub2ec\ud558\ub294 \uba54\uc2dc\uc9c0\ub294 \uc5b8\uc81c\ub4e0\uc9c0 \ubcc0\uc870\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\uc2dc\uc9c0\ub97c \uc218\uc2e0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"x\": 999999,\n  \"y\": -999999\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">JSON \ud615\uc2dd\uc774 \uc62c\ubc14\ub974\ub2e4\ub294 \uc0ac\uc2e4\uc740 \ud574\ub2f9 \uc774\ub3d9\uc774 \uc720\ud6a8\ud558\ub2e4\ub294 \uc758\ubbf8\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub294 \ucd5c\uc18c\ud55c \ub2e4\uc74c \ud56d\ubaa9\uc744 \uac80\uc99d\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uba54\uc2dc\uc9c0 \uad6c\uc870\uc640 \ud544\uc218 \ud544\ub4dc<\/li>\n\n\n\n<li>\ub370\uc774\ud130 \ud0c0\uc785<\/li>\n\n\n\n<li>\uc22b\uc790\uc758 \uc720\ud6a8\uc131 \ubc0f \ud5c8\uc6a9 \ubc94\uc704<\/li>\n\n\n\n<li>\ud50c\ub808\uc774\uc5b4\uc758 \ud604\uc7ac \uc0c1\ud0dc<\/li>\n\n\n\n<li>\uc694\uccad \uad8c\ud55c<\/li>\n\n\n\n<li>\uac8c\uc784 \uaddc\uce59 \uc704\ubc18 \uc5ec\ubd80<\/li>\n\n\n\n<li>\uc694\uccad \ube48\ub3c4\uc640 \uc911\ubcf5 \uc694\uccad<\/li>\n\n\n\n<li>\uba54\uc2dc\uc9c0 \ud06c\uae30<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\uac80\uc99d \ub85c\uc9c1 \uad6c\ud604<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">TypeScript\uc758 \ud0c0\uc785 \uc120\uc5b8\ub9cc\uc73c\ub85c\ub294 \ub7f0\ud0c0\uc784 \uac80\uc99d\uc774 \uc644\uc131\ub418\uc9c0 \uc54a\ub294\ub2e4. \ub124\ud2b8\uc6cc\ud06c \uba54\uc2dc\uc9c0\ub294 \uc2e4\ud589 \uc2dc\uc810\uc5d0 \uc678\ubd80 \uc785\ub825\uc73c\ub85c \ub4e4\uc5b4\uc624\uae30 \ub54c\ubb38\uc5d0 \uc2e4\uc81c \uac12\uc5d0 \ub300\ud55c \uac80\uc99d\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc74c\uc740 Zod\ub97c \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { z } from \"zod\";\n\nconst MoveMessageSchema = z.object({\n  x: z.number().finite()\n    .min(-1000)\n    .max(1000),\n\n  y: z.number().finite()\n    .min(-1000)\n    .max(1000),\n}).strict();\n\nthis.onMessage(\"move\", (client, message) =&gt; {\n  const result =\n    MoveMessageSchema.safeParse(message);\n\n  if (!result.success) {\n    console.warn(\n      \"Invalid move message:\",\n      client.sessionId\n    );\n    return;\n  }\n\n  const { x, y } = result.data;\n\n  const player =\n    this.state.players.get(client.sessionId);\n\n  if (!player) {\n    return;\n  }\n\n  \/\/ \uc88c\ud45c \ubc94\uc704 \uac80\uc99d\uc740 \ud1b5\uacfc\ud588\ub2e4.\n  \/\/ \uc2e4\uc81c \uac8c\uc784\uc5d0\uc11c\ub294 \uc774\ub3d9 \uc18d\ub3c4\uc640 \ucda9\ub3cc \ub4f1\ub3c4 \uac80\uc99d\ud55c\ub2e4.\n  player.x = x;\n  player.y = y;\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>safeParse()<\/code>\ub294 \uac80\uc99d \uc2e4\ud328 \uc2dc \uc608\uc678\ub97c \ub358\uc9c0\ub294 \ub300\uc2e0 \uc131\uacf5 \uc5ec\ubd80\uc640 \uac80\uc99d \uacb0\uacfc\ub97c \ubc18\ud658\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>.strict()<\/code>\ub294 \uc815\uc758\ub418\uc9c0 \uc54a\uc740 \ucd94\uac00 \ud544\ub4dc\ub97c \uac70\ubd80\ud558\ub3c4\ub85d \ud55c\ub2e4. \ud504\ub85c\ud1a0\ucf5c\uc5d0\uc11c \ud655\uc7a5 \ud544\ub4dc\ub97c \ud5c8\uc6a9\ud574\uc57c \ud55c\ub2e4\uba74 \uc774 \uc815\ucc45\uc744 \uc870\uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8, \uc704 \uc608\uc81c\uc758 \uc88c\ud45c \ubc94\uc704 \uac80\uc99d\uc740 \uc774\ub3d9 \uac00\ub2a5 \uc5ec\ubd80\ub97c \uc644\uc804\ud788 \uac80\uc99d\ud558\uc9c0 \uc54a\ub294\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ud55c \ubc88\uc758 \uc694\uccad\uc73c\ub85c \uc88c\ud45c\ub97c \ud06c\uac8c \ubcc0\uacbd\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \uad8c\ud55c \uc774\ub3d9 \ubc29\uc2dd\uc774\ub77c\uba74 \uc785\ub825 \ubc29\ud5a5\uacfc \uc774\ub3d9 \uc2dc\uac04 \ub4f1\uc744 \ubc14\ud0d5\uc73c\ub85c \uc11c\ubc84\uac00 \uc88c\ud45c\ub97c \uacc4\uc0b0\ud574\uc57c \ud55c\ub2e4. \uc11c\ubc84\uac00 \ud5c8\uc6a9\ud558\ub294 \uc774\ub3d9\ub7c9\uc744 \uac80\uc99d\ud558\ub294 \ubc29\uc2dd\ub3c4 \uac00\ub2a5\ud558\uc9c0\ub9cc, \ud074\ub77c\uc774\uc5b8\ud2b8 \uc2dc\uac04\uac12\uc744 \ubb34\uc870\uac74 \uc2e0\ub8b0\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc694\uccad \ube48\ub3c4 \uc81c\ud55c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc720\ud6a8\ud55c \uba54\uc2dc\uc9c0\ub77c\ub3c4 \uc9c0\ub098\uce58\uac8c \ub9ce\uc774 \ubcf4\ub0b4\uba74 \uc11c\ubc84 \uc790\uc6d0\uc744 \uc18c\ubaa8\uc2dc\ud0ac \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uacf5\uaca9 \uc694\uccad\uc744 \ucd08\ub2f9 \uc218\ucc9c \ubc88 \uc804\uc1a1\ud558\uba74 \uac8c\uc784 \ub85c\uc9c1 \ucc98\ub9ac\uc640 \ub85c\uadf8 \uae30\ub85d\uc5d0 \ubd80\ub2f4\uc744 \uc904 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uc815\ucc45\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud50c\ub808\uc774\uc5b4\ubcc4 \uba54\uc2dc\uc9c0 \ucc98\ub9ac \ube48\ub3c4 \uc81c\ud55c<\/li>\n\n\n\n<li>\uacf5\uaca9 \ucfe8\ub2e4\uc6b4 \uac80\uc99d<\/li>\n\n\n\n<li>\uba54\uc2dc\uc9c0 \ud06c\uae30 \uc81c\ud55c<\/li>\n\n\n\n<li>\ube44\uc815\uc0c1 \uc694\uccad\uc5d0 \ub300\ud55c \ub85c\uadf8 \uae30\ub85d<\/li>\n\n\n\n<li>\ubc18\ubcf5\uc801\uc778 \uc704\ubc18\uc5d0 \ub300\ud55c \uc5f0\uacb0 \uc885\ub8cc \ub610\ub294 \uc81c\uc7ac<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc804\ub2ec\ud558\ub294 \uacf5\uaca9 \ucfe8\ub2e4\uc6b4\uc774\ub098 \ud0c0\uc784\uc2a4\ud0ec\ud504\ub9cc\uc73c\ub85c \uc694\uccad\uc758 \uc720\ud6a8\uc131\uc744 \ud310\ub2e8\ud558\uba74 \uc548 \ub41c\ub2e4. \uc11c\ubc84\uac00 \uc790\uccb4\uc801\uc73c\ub85c \uc2dc\uac04\uc744 \uce21\uc815\ud558\uace0 \uac8c\uc784 \uaddc\uce59\uc744 \uc801\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc7ac\uc811\uc18d \ubc0f Room \ubcf5\uad6c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc5f0\uacb0 \uc885\ub8cc\uc640 \uac8c\uc784 \uc885\ub8cc\ub294 \ub2e4\ub974\ub2e4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784\uc5d0\uc11c\ub294 \ub124\ud2b8\uc6cc\ud06c \ub2e8\uc808\uc774 \ubc18\ub4dc\uc2dc \ud50c\ub808\uc774\uc5b4\uc758 \uac8c\uc784 \uc885\ub8cc\ub97c \uc758\ubbf8\ud558\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ubc14\uc77c \ud658\uacbd\uc5d0\uc11c \uc571\uc774 \ubc31\uadf8\ub77c\uc6b4\ub4dc\ub85c \uc774\ub3d9\ud558\uac70\ub098, \uc640\uc774\ud30c\uc774\uac00 \ub04a\uae30\uac70\ub098, \uc77c\uc2dc\uc801\uc778 \ub124\ud2b8\uc6cc\ud06c \uc9c0\uc5f0\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc84c\ub2e4\ub294 \uc774\uc720\ub9cc\uc73c\ub85c \ud50c\ub808\uc774\uc5b4 \ub370\uc774\ud130\ub97c \uc989\uc2dc \uc81c\uac70\ud558\uba74 \uc815\uc0c1\uc801\uc778 \uc7ac\uc811\uc18d\uc774 \ubd88\uac00\ub2a5\ud574\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub2e4\uc74c \uc0c1\ud0dc\ub97c \uad6c\ubd84\ud558\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc5f0\uacb0 \uc911: \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc815\uc0c1\uc801\uc73c\ub85c \ud1b5\uc2e0\ud558\ub294 \uc0c1\ud0dc<\/li>\n\n\n\n<li>\uc77c\uc2dc \uc5f0\uacb0 \ud574\uc81c: \uc7ac\uc811\uc18d\uc744 \uae30\ub2e4\ub9ac\ub294 \uc0c1\ud0dc<\/li>\n\n\n\n<li>\uac8c\uc784 \uc774\ud0c8: \ud50c\ub808\uc774\uc5b4\uac00 \uba85\uc2dc\uc801\uc73c\ub85c \uac8c\uc784\uc744 \uc885\ub8cc\ud55c \uc0c1\ud0dc<\/li>\n\n\n\n<li>\uc138\uc158 \ub9cc\ub8cc: \uc7ac\uc811\uc18d \ud5c8\uc6a9 \uc2dc\uac04\uc774 \uc9c0\ub09c \uc0c1\ud0dc<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\uc7ac\uc811\uc18d \ud5c8\uc6a9<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus\ub294 \ubc84\uc804\uc5d0 \ub530\ub77c \uc5f0\uacb0 \ub04a\uae40 \ud6c4 \uc7ac\uc811\uc18d\uc744 \uc9c0\uc6d0\ud558\ub294 API\ub97c \uc81c\uacf5\ud55c\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c Room\uc758 <code>allowReconnection()<\/code>\uc744 \ud65c\uc6a9\ud574 \uc7ac\uc811\uc18d\uc744 \ud5c8\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Room, Client } from \"colyseus\";\n\nexport class GameRoom extends Room {\n  async onLeave(client: Client, consented: boolean) {\n    if (consented) {\n      \/\/ \uc815\uc0c1\uc801\uc778 \uac8c\uc784 \uc774\ud0c8\uc774\ub77c\uba74\n      \/\/ \uc7ac\uc811\uc18d \ub300\uae30 \uc5c6\uc774 \ud1f4\uc7a5 \ucc98\ub9ac\ud55c\ub2e4.\n      this.removePlayer(client.sessionId);\n      return;\n    }\n\n    try {\n      \/\/ \uc77c\uc2dc\uc801\uc778 \uc5f0\uacb0 \uc885\ub8cc\ub77c\uba74\n      \/\/ \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \uc7ac\uc811\uc18d\uc744 \ud5c8\uc6a9\ud55c\ub2e4.\n      await this.allowReconnection(client, 20);\n\n      console.log(\n        \"Player reconnected:\",\n        client.sessionId\n      );\n    } catch {\n      \/\/ \ud5c8\uc6a9 \uc2dc\uac04\uc774 \uc9c0\ub098\uba74 \ucd5c\uc885 \ud1f4\uc7a5 \ucc98\ub9ac\ud55c\ub2e4.\n      this.removePlayer(client.sessionId);\n    }\n  }\n\n  private removePlayer(sessionId: string) {\n    \/\/ \ud50c\ub808\uc774\uc5b4 \uc0c1\ud0dc \uc81c\uac70\uc640 \uac8c\uc784 \ub85c\uc9c1 \uc815\ub9ac\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc608\uc81c\ub294 \uc7ac\uc811\uc18d \ud750\ub984\uc744 \uc124\uba85\ud558\uae30 \uc704\ud55c \ucf54\ub4dc\ub2e4. \uc2e4\uc81c\ub85c\ub294 \uc124\uce58\ub41c Colyseus \ubc84\uc804\uc758 <code>onLeave()<\/code> \ubc18\ud658 \ud0c0\uc785\uacfc <code>allowReconnection()<\/code> \uc0ac\uc6a9\ubc95\uc744 \ud655\uc778\ud574\uc57c \ud558\uba70, <code>removePlayer()<\/code>\ub3c4 \uac8c\uc784 \uc0c1\ud0dc\uc5d0 \ub9de\uac8c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>consented<\/code>\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uba85\uc2dc\uc801\uc73c\ub85c \uc5f0\uacb0\uc744 \uc885\ub8cc\ud588\ub294\uc9c0 \ud310\ub2e8\ud558\ub294 \ub370 \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4. \ub2e8, \uc774\ub97c \uac8c\uc784 \ub0b4 \ubaa8\ub4e0 \uc774\ud0c8 \uc758\ub3c4\uc758 \uc644\ubcbd\ud55c \ud310\ubcc4 \uc218\ub2e8\uc73c\ub85c \uac04\uc8fc\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc7ac\uc811\uc18d \uc2dc \uace0\ub824\ud560 \uc0ac\ud56d<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc7ac\uc811\uc18d\uc744 \ud5c8\uc6a9\ud558\ub824\uba74 \uae30\uc874 \ud50c\ub808\uc774\uc5b4 \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4\uac00 \uc5f0\uacb0\uc744 \uc783\uc5c8\ub2e4\uace0 \ud574\uc11c \uc989\uc2dc <code>players<\/code>\uc5d0\uc11c \uc81c\uac70\ud558\uba74 \uc7ac\uc811\uc18d \ud6c4 \uae30\uc874 \uc0c1\ud0dc\ub97c \ubcf5\uad6c\ud558\uae30 \uc5b4\ub835\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc7ac\uc811\uc18d \ub300\uae30 \uc2dc\uac04 \ub3d9\uc548\uc5d0\ub294 \ud50c\ub808\uc774\uc5b4 \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud558\uace0, \uc7ac\uc811\uc18d\uc5d0 \uc131\uacf5\ud558\uba74 \uae30\uc874 \uc138\uc158\uc5d0 \uc5f0\uacb0\uc744 \ubcf5\uad6c\ud55c\ub2e4. \uc2dc\uac04\uc774 \ucd08\uacfc\ub418\uba74 \ucd5c\uc885 \ud1f4\uc7a5 \ucc98\ub9ac\ub97c \uc218\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784\uc758 \uc131\uaca9\uc5d0 \ub530\ub77c \uc5f0\uacb0\uc774 \ub04a\uae34 \ud50c\ub808\uc774\uc5b4\ub97c \uc5b4\ub5bb\uac8c \ucc98\ub9ac\ud560\uc9c0\ub3c4 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud611\ub3d9 \uac8c\uc784: \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \ud50c\ub808\uc774\uc5b4\ub97c \uc720\uc9c0\ud558\uace0 AI\uac00 \ub300\uc2e0 \uc870\uc791<\/li>\n\n\n\n<li>PvP \uac8c\uc784: \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \ubb34\uc801 \ub610\ub294 \uc774\ud0c8 \ud398\ub110\ud2f0 \uc801\uc6a9<\/li>\n\n\n\n<li>\ud134\uc81c \uac8c\uc784: \uc81c\ud55c \uc2dc\uac04 \ub3d9\uc548 \ud134\uc744 \ubcf4\ub958\ud558\uac70\ub098 \uc790\ub3d9 \uc9c4\ud589<\/li>\n\n\n\n<li>\uacbd\uc7c1 \uac8c\uc784: \uc7ac\uc811\uc18d \uae30\ud68c\ub97c \uc81c\uacf5\ud558\ub418 \uacbd\uae30 \uacb0\uacfc \ucc98\ub9ac \uaddc\uce59 \uc801\uc6a9<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc7ac\uc811\uc18d\uc740 \ub2e8\uc21c\ud788 \uc18c\ucf13 \uc5f0\uacb0\uc744 \ubcf5\uad6c\ud558\ub294 \ubb38\uc81c\uac00 \uc544\ub2c8\ub2e4. \uac8c\uc784 \uaddc\uce59\uacfc \ud50c\ub808\uc774\uc5b4 \uc0c1\ud0dc\uc758 \uc77c\uad00\uc131\uc744 \uc720\uc9c0\ud558\ub294 \ubb38\uc81c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room \ubcf5\uad6c\uc640 \uc11c\ubc84 \uc7a5\uc560 \ubcf5\uad6c\uc758 \ucc28\uc774<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \uc911\uc694\ud55c \uad6c\ubd84\uc774 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc7ac\uc811\uc18d<\/strong>\uc740 \uae30\uc874 Room\uc774 \uc0b4\uc544 \uc788\ub294 \uc0c1\ud0dc\uc5d0\uc11c \ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0\uc744 \ubcf5\uad6c\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Room \ubcf5\uad6c<\/strong>\ub294 Room\uc744 \uc2e4\ud589\ud558\ub358 \uc11c\ubc84 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub418\uac70\ub098 \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \uac8c\uc784 \uc0c1\ud0dc\ub97c \ub2e4\uc2dc \uad6c\uc131\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>allowReconnection()<\/code>\ub9cc\uc73c\ub85c \uc11c\ubc84 \ud504\ub85c\uc138\uc2a4\uac00 \uc8fd\uc740 \ub4a4\uc758 Room \uc0c1\ud0dc\uae4c\uc9c0 \ubcf5\uad6c\ud560 \uc218\ub294 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \uc7a5\uc560 \uc774\ud6c4\uc5d0\ub3c4 \uc9c4\ud589 \uc911\uc778 \uac8c\uc784\uc744 \ubcf5\uad6c\ud558\ub824\uba74 \ubcc4\ub3c4\uc758 \uc124\uacc4\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uac8c\uc784 \uc0c1\ud0dc\uc758 \uc8fc\uae30\uc801\uc778 \uc2a4\ub0c5\uc0f7 \uc800\uc7a5<\/li>\n\n\n\n<li>\uc911\uc694\ud55c \uc774\ubca4\ud2b8\uc758 \uc601\uc18d \ub85c\uadf8 \uae30\ub85d<\/li>\n\n\n\n<li>Room\uc758 \uc2dd\ubcc4\uc790\uc640 \uac8c\uc784 \uc9c4\ud589 \uc0c1\ud0dc \uc800\uc7a5<\/li>\n\n\n\n<li>\ubcf5\uad6c \uac00\ub2a5\ud55c \uc11c\ubc84\uc5d0 Room \uc7ac\uc0dd\uc131<\/li>\n\n\n\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8 \uc7ac\uc778\uc99d \ubc0f \uc7ac\uc785\uc7a5<\/li>\n\n\n\n<li>\uc911\ubcf5 \ubcf4\uc0c1\uc774\ub098 \uc911\ubcf5 \uc694\uccad \ubc29\uc9c0<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \ud504\ub808\uc784\uc758 \uc0c1\ud0dc\ub97c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub294 \uac83\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ube44\ud6a8\uc728\uc801\uc774\ub2e4. \uac8c\uc784\uc758 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ubcf5\uad6c \uc9c0\uc810\uacfc \uc800\uc7a5 \uc8fc\uae30\ub97c \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud611\ub3d9 \uac8c\uc784\uc5d0\uc11c\ub294 \uccb4\ud06c\ud3ec\uc778\ud2b8\uc640 \uc8fc\uc694 \uc9c4\ud589 \uc0c1\ud0dc\ub9cc \uc800\uc7a5\ud560 \uc218 \uc788\ub2e4. \ubc18\uba74 \uacbd\uc7c1 \uac8c\uc784\uc758 \uacb0\uacfc\uc640 \uc7ac\ud654 \uc9c0\uae09\uc740 \ubcc4\ub3c4\uc758 \uc601\uc18d \uc800\uc7a5\uacfc \uc911\ubcf5 \ucc98\ub9ac \ubc29\uc9c0 \ub85c\uc9c1\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ub2e4\uc911 \uc11c\ubc84 \uc6b4\uc601 \uad6c\uc870<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ub2e8\uc77c \uc11c\ubc84\uc758 \ud55c\uacc4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ucd08\uae30\uc5d0\ub294 \ud558\ub098\uc758 Node.js \ud504\ub85c\uc138\uc2a4\uc5d0\uc11c \uc5ec\ub7ec Room\uc744 \uc6b4\uc601\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client A \u2500\u2510\nClient B \u2500\u253c\u2500\u2500&gt; Game Server\nClient C \u2500\u2518        \u251c\u2500\u2500 Room 1\n                   \u251c\u2500\u2500 Room 2\n                   \u2514\u2500\u2500 Room 3<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc0ac\uc6a9\uc790\uac00 \uc99d\uac00\ud558\uba74 \ud558\ub098\uc758 \ud504\ub85c\uc138\uc2a4\uac00 \ucc98\ub9ac\ud574\uc57c \ud558\ub294 Room\uacfc \ub124\ud2b8\uc6cc\ud06c \uc774\ubca4\ud2b8\uac00 \ub9ce\uc544\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CPU \uc0ac\uc6a9\ub7c9, \uba54\ubaa8\ub9ac, \ub124\ud2b8\uc6cc\ud06c \ucc98\ub9ac\ub7c9 \ub4f1\uc758 \ud55c\uacc4\uc5d0 \ub3c4\ub2ec\ud558\uba74 \uc11c\ubc84\ub97c \ud655\uc7a5\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \uc911\uc694\ud55c \uc810\uc740 Room\uc744 \uc5ec\ub7ec \uac1c \uc0dd\uc131\ud558\ub294 \uac83\uacfc \uc11c\ubc84 \ud504\ub85c\uc138\uc2a4\ub97c \uc5ec\ub7ec \uac1c \uc6b4\uc601\ud558\ub294 \uac83\uc740 \uc11c\ub85c \ub2e4\ub978 \uac1c\ub150\uc774\ub77c\ub294 \uc0ac\uc2e4\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc5ec\ub7ec \ud504\ub85c\uc138\uc2a4\uc640 \uc5ec\ub7ec \uc11c\ubc84<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus\ub97c \ub2e4\uc911 \uc11c\ubc84\ub85c \uc6b4\uc601\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub97c \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> <code>               Clients\n                   |\n             Load Balancer\n                   |\n          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n          |                 |\n      Server A          Server B\n      Process A         Process B\n          |                 |\n      \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2510         \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2510\n      |       |         |       |\n    Room 1  Room 2    Room 3  Room 4\n          \\                 \/\n           \\               \/\n            Shared Presence\n             \/ Matchmaker\n                   |\n          Shared Infrastructure\n          \u251c\u2500\u2500 Database\n          \u251c\u2500\u2500 Redis\n          \u2514\u2500\u2500 Monitoring<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\uc5d0\uc11c \uac01 \uc11c\ubc84 \ud504\ub85c\uc138\uc2a4\ub294 \uc790\uc2e0\uc774 \uad00\ub9ac\ud558\ub294 Room\uc758 \uc0c1\ud0dc\ub97c \uba54\ubaa8\ub9ac\uc5d0\uc11c \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 Room 1\uc774 \uc11c\ubc84 A\uc5d0\uc11c \uc2e4\ud589\ub418\uace0 \uc788\ub2e4\uba74, \ud574\ub2f9 Room\uc758 \uac8c\uc784 \uc0c1\ud0dc\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \uc11c\ubc84 A\uac00 \uad8c\ud55c\uc744 \uac16\uace0 \uad00\ub9ac\ud55c\ub2e4. \uc11c\ubc84 B\uac00 Room 1\uc758 \uc0c1\ud0dc\ub97c \uc790\ub3d9\uc73c\ub85c \uacf5\uc720\ubc1b\uc544 \ub3d9\uc2dc\uc5d0 \uac19\uc740 \uac8c\uc784 \ub85c\uc9c1\uc744 \uc2e4\ud589\ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Presence\uc640 MatchMaker<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\uc911 \uc11c\ubc84 \ud658\uacbd\uc5d0\uc11c\ub294 Room\uc758 \uc874\uc7ac \uc5ec\ubd80\uc640 \ucc38\uac00 \uac00\ub2a5\ud55c Room\uc744 \ud30c\uc545\ud558\ub294 \uae30\ub2a5\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus\uc758 MatchMaker\ub294 Room\uc744 \uc0dd\uc131\ud558\uace0 \ucc38\uac00 \uac00\ub2a5\ud55c Room\uc744 \ud0d0\uc0c9\ud558\ub294 \uacfc\uc815\uc744 \uad00\ub9ac\ud55c\ub2e4. Presence\ub294 \uc5ec\ub7ec \ud504\ub85c\uc138\uc2a4 \uac04\uc758 \uc870\uc815\uacfc \uacf5\uc720 \uc0c1\ud0dc\ub97c \uc704\ud55c \ucd94\uc0c1\ud654 \uacc4\uce35\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubd84\uc0b0 \ud658\uacbd\uc5d0\uc11c\ub294 \uc801\uc808\ud55c Presence \ubc0f \ub4dc\ub77c\uc774\ubc84 \uad6c\uc131\uc744 \ud1b5\ud574 \uc5ec\ub7ec \ud504\ub85c\uc138\uc2a4\uac00 Room \uc815\ubcf4\ub97c \uacf5\uc720\ud558\uace0 \uc791\uc5c5\uc744 \uc870\uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Redis\ub294 \uc774\ub7ec\ud55c \ubd84\uc0b0 \uad6c\uc131\uc5d0 \ud65c\uc6a9\ud560 \uc218 \uc788\ub294 \ub300\ud45c\uc801\uc778 \uc778\ud504\ub77c\ub2e4. \ub2e4\ub9cc Redis\ub97c \ub3c4\uc785\ud588\ub2e4\uace0 \ud574\uc11c \ubaa8\ub4e0 \uac8c\uc784 \uc0c1\ud0dc\uac00 \uc790\ub3d9\uc73c\ub85c \uacf5\uc720\ub418\uac70\ub098 \uc11c\ubc84 \uc7a5\uc560 \uc2dc Room\uc774 \uc790\ub3d9 \ubcf5\uad6c\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uad6c\uc131 \uc694\uc18c\uc758 \uc5ed\ud560\uc744 \uad6c\ubd84\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>MatchMaker:<\/strong> Room \uc0dd\uc131\uacfc \ucc38\uac00\ub97c \uc870\uc815<\/li>\n\n\n\n<li><strong>Presence:<\/strong> \ud504\ub85c\uc138\uc2a4 \uac04 \uacf5\uc720 \uc0c1\ud0dc \ubc0f \uc870\uc815 \uae30\ub2a5 \uc81c\uacf5<\/li>\n\n\n\n<li><strong>Room:<\/strong> \uac1c\ubcc4 \uac8c\uc784 \uc138\uc158\uc758 \uc0c1\ud0dc\uc640 \ub85c\uc9c1 \uad00\ub9ac<\/li>\n\n\n\n<li><strong>Load Balancer:<\/strong> \uc678\ubd80 \uc5f0\uacb0\uc744 \uc801\uc808\ud55c \uc9c4\uc785\uc810\uc73c\ub85c \uc804\ub2ec<\/li>\n\n\n\n<li><strong>Database:<\/strong> \uc601\uc18d\uc801\uc73c\ub85c \ubcf4\uc874\ud574\uc57c \ud558\ub294 \uac8c\uc784 \ub370\uc774\ud130 \uc800\uc7a5<\/li>\n\n\n\n<li><strong>Redis:<\/strong> \uce90\uc2dc, \ubd84\uc0b0 \uc870\uc815, \uacf5\uc720 \ub370\uc774\ud130 \ub4f1 \uc6a9\ub3c4\uc5d0 \ub9de\uac8c \uc0ac\uc6a9<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus \ubc84\uc804\uacfc \ubc30\ud3ec \ud658\uacbd\uc5d0 \ub530\ub77c \uad6c\uccb4\uc801\uc778 \ub4dc\ub77c\uc774\ubc84 \uad6c\uc131\uacfc \ubd84\uc0b0 \ucc98\ub9ac \ubc29\uc2dd\uc740 \ub2ec\ub77c\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub85c\ub4dc \ubc38\ub7f0\uc11c\ub9cc\uc73c\ub85c \ud574\uacb0\ub418\uc9c0 \uc54a\ub294 \ubb38\uc81c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub85c\ub4dc \ubc38\ub7f0\uc11c\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \ucd5c\ucd08 \uc5f0\uacb0\uc744 \uc5ec\ub7ec \uc11c\ubc84\ub85c \ubd84\uc0b0\ud560 \uc218 \uc788\ub2e4. \uadf8\ub7ec\ub098 \uc774\ubbf8 \ud2b9\uc815 Room\uc5d0 \ucc38\uac00\ud55c \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc5f0\uacb0\uc740 \ud574\ub2f9 Room\uc744 \uad00\ub9ac\ud558\ub294 \uc11c\ubc84\uc640 \uc5f0\uacb0\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub2e4\uc74c \uc694\uc18c\ub97c \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WebSocket \uc5f0\uacb0 \uc720\uc9c0<\/li>\n\n\n\n<li>\uc5f0\uacb0\uc774 \uc885\ub8cc\ub41c \ub4a4 \uc7ac\uc811\uc18d\ud560 \uc11c\ubc84 \ud0d0\uc0c9<\/li>\n\n\n\n<li>Room\uc744 \uc18c\uc720\ud55c \ud504\ub85c\uc138\uc2a4 \uc2dd\ubcc4<\/li>\n\n\n\n<li>\uc11c\ubc84\ubcc4 Room \ubc0f \ud50c\ub808\uc774\uc5b4 \uc218<\/li>\n\n\n\n<li>\ud2b9\uc815 \uc11c\ubc84\uc758 \uacfc\ubd80\ud558 \ubc29\uc9c0<\/li>\n\n\n\n<li>\uc11c\ubc84 \uc7a5\uc560 \uc2dc \ub300\uccb4 \uacbd\ub85c\uc640 \uc0c1\ud0dc \ubcf5\uad6c \uc815\ucc45<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8\uc21c\ud788 HTTP \uc694\uccad\uc744 \uc5ec\ub7ec \uc11c\ubc84\uc5d0 \ubd84\ubc30\ud558\ub294 \uac83\ub9cc\uc73c\ub85c\ub294 \uc2e4\uc2dc\uac04 \uac8c\uc784 \uc138\uc158\uc744 \uc548\uc815\uc801\uc73c\ub85c \uc6b4\uc601\ud560 \uc218 \uc5c6\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc218\ud3c9 \ud655\uc7a5\uacfc \uc0c1\ud0dc\uc758 \uc18c\uc720\uad8c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub97c \uc5ec\ub7ec \ub300\ub85c \ud655\uc7a5\ud560 \ub54c \uac00\uc7a5 \uc911\uc694\ud55c \uc124\uacc4 \uc6d0\uce59\uc740 \uac8c\uc784 \uc0c1\ud0dc\uc758 \uc18c\uc720\uad8c\uc744 \uba85\ud655\ud558\uac8c \uc720\uc9c0\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc11c\ubc84 A\uc640 \uc11c\ubc84 B\uac00 \uac19\uc740 \ud50c\ub808\uc774\uc5b4\uc758 \uccb4\ub825\uc744 \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud55c\ub2e4\uba74 \uc0c1\ud0dc \ucda9\ub3cc\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub97c \ubc29\uc9c0\ud558\ub824\uba74 \uc77c\ubc18\uc801\uc73c\ub85c \ud558\ub098\uc758 Room\uc5d0 \ub300\ud574 \uad8c\ud55c\uc744 \uac16\ub294 \uc2e4\ud589 \uc8fc\uccb4\ub97c \uc815\ud558\uace0, \ud574\ub2f9 Room\uc758 \uac8c\uc784 \ub85c\uc9c1\uc740 \uadf8 \uc8fc\uccb4\uac00 \ucc98\ub9ac\ud558\ub3c4\ub85d \uc124\uacc4\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub978 \uc11c\ubc84\ub294 Room \ucc38\uac00 \uc815\ubcf4\ub098 \uc601\uc18d \ub370\uc774\ud130 \ub4f1 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \uacf5\uc720\ud560 \uc218 \uc788\uc9c0\ub9cc, \uac8c\uc784 \uc0c1\ud0dc\ub97c \ubb34\uc870\uac74 \uc591\ucabd\uc5d0\uc11c \ub3d9\uc2dc\uc5d0 \uc218\uc815\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \uac04 \ud1b5\uc2e0\uc774 \ud544\uc694\ud55c \uacbd\uc6b0\uc5d0\ub294 \uba54\uc2dc\uc9c0 \uc804\ub2ec, \uc774\ubca4\ud2b8 \ucc98\ub9ac, \uc0c1\ud0dc \uc800\uc7a5 \ubc0f \ubcf5\uad6c \uc804\ub7b5\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \uc124\uacc4\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Graceful Shutdown<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc30\ud3ec\ub098 \uc11c\ubc84 \uad50\uccb4 \uacfc\uc815\uc5d0\uc11c \uc2e4\ud589 \uc911\uc778 \ud504\ub85c\uc138\uc2a4\ub97c \uc989\uc2dc \uc885\ub8cc\ud558\uba74 \uc5f0\uacb0\ub41c \ud50c\ub808\uc774\uc5b4\uac00 \uac15\uc81c\ub85c \ub04a\uae38 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Graceful Shutdown\uc740 \uc11c\ubc84\uac00 \uc885\ub8cc\ub418\uae30 \uc804\uc5d0 \uc0c8\ub85c\uc6b4 \uc791\uc5c5\uc744 \uc81c\ud55c\ud558\uace0, \uae30\uc874 \uc791\uc5c5\uacfc \uc5f0\uacb0\uc744 \uc548\uc804\ud558\uac8c \uc815\ub9ac\ud558\ub294 \uc808\ucc28\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c \uc21c\uc11c\ub85c \uc124\uacc4\ud55c\ub2e4.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\uc11c\ubc84\ub97c \uc2e0\uaddc \ub9e4\uce6d \ub300\uc0c1\uc5d0\uc11c \uc81c\uc678\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc2e0\uaddc Room \uc0dd\uc131\uc774\ub098 \ucc38\uac00\ub97c \uc81c\ud55c\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc9c4\ud589 \uc911\uc778 \uac8c\uc784\uc744 \uc644\ub8cc\ud558\ub3c4\ub85d \uae30\ub2e4\ub9ac\uac70\ub098 \ud50c\ub808\uc774\uc5b4\ub97c \ub2e4\ub978 \uc138\uc158\uc73c\ub85c \uc720\ub3c4\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ud544\uc694\ud55c \uc0c1\ud0dc\uc640 \uacb0\uacfc\ub97c \uc800\uc7a5\ud55c\ub2e4.<\/li>\n\n\n\n<li>Room\uacfc \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc744 \uc815\ub9ac\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc81c\ud55c \uc2dc\uac04 \uc548\uc5d0 \uc885\ub8cc\ub418\uc9c0 \uc54a\uc740 \uc791\uc5c5\uc740 \uba85\uc2dc\uc801\uc778 \uc815\ucc45\uc5d0 \ub530\ub77c \ucc98\ub9ac\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ud504\ub85c\uc138\uc2a4\ub97c \uc885\ub8cc\ud55c\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 Colyseus\uc758 \uc11c\ubc84 \uc885\ub8cc API\uc640 \uc0ac\uc6a9 \uc911\uc778 \ubc84\uc804\uc758 \ub77c\uc774\ud504\uc0ac\uc774\ud074\uc744 \ud655\uc778\ud574\uc57c \ud55c\ub2e4. Graceful Shutdown\ub9cc\uc73c\ub85c Room\uc774 \ub2e4\ub978 \uc11c\ubc84\ub85c \uc790\ub3d9 \uc774\uc804\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc9c4\ud589 \uc911\uc778 \uac8c\uc784\uc744 \uc774\uc804\ud558\uac70\ub098 \ubcf5\uad6c\ud574\uc57c \ud55c\ub2e4\uba74 \ubcc4\ub3c4\uc758 \uc0c1\ud0dc \uc804\ub2ec \ubc0f \uc7ac\uc785\uc7a5 \uc124\uacc4\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc2e4\ubb34\uc5d0\uc11c \uace0\ub824\ud574\uc57c \ud560 \uc124\uacc4 \uc6d0\uce59<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Colyseus \uae30\ubc18 \uac8c\uc784 \uc11c\ubc84\ub97c \uac1c\ubc1c\ud560 \ub54c\ub294 \ub2e4\uc74c \uc6d0\uce59\uc744 \uc9c0\ud0a4\ub294 \uac83\uc774 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Room\uc740 \uac8c\uc784 \uc138\uc158\uc758 \uacbd\uacc4\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Room\ub9c8\ub2e4 \ub3c5\ub9bd\uc801\uc778 \uac8c\uc784 \uc0c1\ud0dc\uc640 \uaddc\uce59\uc744 \uc720\uc9c0\ud558\uace0, \uc11c\ub85c \ub2e4\ub978 \uac8c\uc784 \uc138\uc158\uc774 \ubd88\ud544\uc694\ud558\uac8c \uc0c1\ud0dc\ub97c \uacf5\uc720\ud558\uc9c0 \uc54a\ub3c4\ub85d \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Schema\ub294 \uc0c1\ud0dc \ub3d9\uae30\ud654 \ub3c4\uad6c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schema\ub97c \ud1b5\ud574 \uc0c1\ud0dc \ubcc0\uacbd\uc744 \ud6a8\uc728\uc801\uc73c\ub85c \uc804\ub2ec\ud558\ub418, \uac8c\uc784 \uaddc\uce59\uc758 \uac80\uc99d\uacfc \uad8c\ud55c \uad00\ub9ac\ub294 \uc11c\ubc84\uc5d0\uc11c \uc218\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ubaa8\ub4e0 \ud074\ub77c\uc774\uc5b8\ud2b8 \uba54\uc2dc\uc9c0\ub294 \uc678\ubd80 \uc785\ub825\uc774\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud0c0\uc785, \ubc94\uc704, \uad8c\ud55c, \ube48\ub3c4, \uac8c\uc784 \uaddc\uce59\uc744 \uac80\uc99d\ud558\uace0 \ube44\uc815\uc0c1\uc801\uc778 \uc694\uccad\uc5d0 \ub300\uc751\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc7ac\uc811\uc18d\uacfc \uc11c\ubc84 \ubcf5\uad6c\ub294 \ubcc4\uac1c\uc758 \ubb38\uc81c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc5f0\uacb0 \ubcf5\uad6c\ub294 \uae30\uc874 Room\uc774 \uc0b4\uc544 \uc788\ub2e4\ub294 \uc804\uc81c\ub97c \uac16\ub294\ub2e4. \ud504\ub85c\uc138\uc2a4 \uc7a5\uc560\uae4c\uc9c0 \ubcf5\uad6c\ud558\ub824\uba74 \uc0c1\ud0dc \uc800\uc7a5\uacfc \uc7ac\uad6c\uc131 \uc804\ub7b5\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc218\ud3c9 \ud655\uc7a5\uc740 \uc0c1\ud0dc \uc18c\uc720\uad8c\uacfc \ud568\uaed8 \uc124\uacc4\ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub97c \uc5ec\ub7ec \ub300\ub85c \ub298\ub9ac\ub294 \uac83\ubfd0 \uc544\ub2c8\ub77c Room \ud0d0\uc0c9, \uc5f0\uacb0 \uc720\uc9c0, \uc11c\ubc84 \uac04 \uc870\uc815, \uc7a5\uc560 \ub300\uc751\uae4c\uc9c0 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Colyseus\ub294 Node.js \ud658\uacbd\uc5d0\uc11c \uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774\uc5b4 \uac8c\uc784 \uc11c\ubc84\ub97c \uac1c\ubc1c\ud558\uae30 \uc704\ud55c \uc624\ud508\uc18c\uc2a4 \ud504\ub808\uc784\uc6cc\ud06c\ub2e4. Room \uae30\ubc18 \uac8c\uc784 \uc138\uc158 \uad00\ub9ac, Schema \uae30\ubc18 \uc0c1\ud0dc \ub3d9\uae30\ud654, \ud074\ub77c\uc774\uc5b8\ud2b8 \uba54\uc2dc\uc9c0 \ucc98\ub9ac, \uc138\uc158 \ubcf5\uad6c \ub4f1\uc758 \uae30\ub2a5\uc744 \uc81c\uacf5\ud55c\ub2e4. \uc77c\ubc18\uc801\uc778 REST API \uc11c\ubc84\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uace0 \uc751\ub2f5\uc744 \ubc18\ud658\ud558\ub294 \ubc29\uc2dd\uc73c\ub85c \ub3d9\uc791\ud55c\ub2e4. \ubc18\uba74 \uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774\uc5b4 \uac8c\uc784 \uc11c\ubc84\ub294 \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ud558\ub098\uc758 \uac8c\uc784 \uc138\uc158\uc5d0 \ucc38\uc5ec\ud558\uba70, \uc11c\ubc84\uc5d0\uc11c \ubcc0\uacbd\ub41c \uc0c1\ud0dc\ub97c \ucc38\uc5ec\uc790\ub4e4\uc5d0\uac8c \uc9c0\uc18d\uc801\uc73c\ub85c [&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-2643","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\/2643","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=2643"}],"version-history":[{"count":1,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2643\/revisions"}],"predecessor-version":[{"id":2644,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2643\/revisions\/2644"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}