{"id":2636,"date":"2026-10-24T08:35:57","date_gmt":"2026-10-24T08:35:57","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=2636"},"modified":"2026-10-24T08:37:48","modified_gmt":"2026-10-24T08:37:48","slug":"%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-room-matchmaking-%ec%84%9c%eb%b2%84-%ea%b6%8c%ed%95%9c-%ec%83%81%ed%83%9c-%eb%8f%99%ea%b8%b0%ed%99%94%ec%99%80","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=2636","title":{"rendered":"\uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84 \uc124\uacc4 Room, Matchmaking, \uc11c\ubc84 \uad8c\ud55c, \uc0c1\ud0dc \ub3d9\uae30\ud654\uc640 \ub3d9\uc2dc\uc131 \uc81c\uc5b4"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774\uc5b4 \uac8c\uc784 \uc11c\ubc84\ub294 \ub2e8\uc21c\ud788 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc744 \ubc1b\uc544 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub294 \uc11c\ubc84\uc640 \ub2e4\ub974\ub2e4. \uc5ec\ub7ec \ud50c\ub808\uc774\uc5b4\uac00 \ub3d9\uc2dc\uc5d0 \ud589\ub3d9\ud558\uace0, \uac01\uc790\uc758 \ub124\ud2b8\uc6cc\ud06c \uc9c0\uc5f0\uc774 \ub2e4\ub974\uba70, \ub3d9\uc77c\ud55c \uac8c\uc784 \uc0c1\ud0dc\ub97c \uc11c\ub85c \ub2e4\ub978 \uc2dc\uc810\uc5d0 \uad00\ucc30\ud558\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7ec\ud55c \ud658\uacbd\uc5d0\uc11c \uc11c\ubc84\ub294 \ud50c\ub808\uc774\uc5b4\ub97c \uc801\uc808\ud55c \uac8c\uc784 \uc138\uc158\uc5d0 \ubc30\uce58\ud558\uace0, \uac8c\uc784\uc758 \uc815\ud569\uc131\uc744 \uc720\uc9c0\ud558\uba70, \uc5ec\ub7ec \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ubc1c\uc0dd\ud558\ub354\ub77c\ub3c4 \uc77c\uad00\ub41c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uae00\uc5d0\uc11c\ub294 \uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84\ub97c \uc124\uacc4\ud560 \ub54c \ud544\uc694\ud55c \ud575\uc2ec \uac1c\ub150\uc744 \uc0b4\ud3b4\ubcf8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Room \uad6c\uc870\uc640 \ub77c\uc774\ud504\uc0ac\uc774\ud074<\/li>\n\n\n\n<li>Matchmaking\uacfc \ub300\uae30\uc5f4<\/li>\n\n\n\n<li>\uc11c\ubc84 \uad8c\ud55c \uae30\ubc18 \uac8c\uc784 \ub85c\uc9c1<\/li>\n\n\n\n<li>\uac8c\uc784 \uc0c1\ud0dc \ub3d9\uae30\ud654<\/li>\n\n\n\n<li>\uba54\uc2dc\uc9c0 \uc21c\uc11c \ubc0f \uc911\ubcf5 \ucc98\ub9ac<\/li>\n\n\n\n<li>\ub3d9\uc2dc \uc694\uccad\uacfc \uc0c1\ud0dc \ubcc0\uacbd \uc81c\uc5b4<\/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 \uad6c\uc870\uc640 \ub77c\uc774\ud504\uc0ac\uc774\ud074<\/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 \uc5ec\ub7ec \ud50c\ub808\uc774\uc5b4\uac00 \ud558\ub098\uc758 \uac8c\uc784 \uc138\uc158\uc5d0 \ucc38\uc5ec\ud558\uae30 \uc704\ud55c \ub17c\ub9ac\uc801\uc778 \uacf5\uac04\uc774\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 \uac19\uc740 \ub9f5\uc5d0 \uc785\uc7a5\ud558\uace0, \ubaac\uc2a4\ud130\uc640 \uc0c1\ud638\uc791\uc6a9\ud558\uba70, \ubbf8\uc158\uc744 \uc218\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c \uac01 \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc\uc640 \uac8c\uc784 \uc9c4\ud589 \uc0c1\ud669\uc744 \ub3c5\ub9bd\uc801\uc73c\ub85c \uad00\ub9ac\ud558\ub294 \ub2e8\uc704\uac00 Room\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \ub370\uc774\ud130\ub97c \uad00\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ucc38\uc5ec \ud50c\ub808\uc774\uc5b4 \ubaa9\ub85d<\/li>\n\n\n\n<li>\ud50c\ub808\uc774\uc5b4\ubcc4 \uc5f0\uacb0 \uc0c1\ud0dc<\/li>\n\n\n\n<li>\uac8c\uc784 \uc9c4\ud589 \uc0c1\ud0dc<\/li>\n\n\n\n<li>\ub9f5\uacfc \uac8c\uc784 \ubaa8\ub4dc<\/li>\n\n\n\n<li>\uac8c\uc784 \uc624\ube0c\uc81d\ud2b8 \uc0c1\ud0dc<\/li>\n\n\n\n<li>\uac8c\uc784 \uc2dc\uc791 \ubc0f \uc885\ub8cc \uc870\uac74<\/li>\n\n\n\n<li>Room \uc0dd\uc131 \uc2dc\uac01\uacfc \uc885\ub8cc \uc2dc\uac01<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \ub2e8\uc21c\ud55c \ucc44\ud305\ubc29\uc774 \uc544\ub2c8\ub2e4. <strong>\ud558\ub098\uc758 \ub3c5\ub9bd\uc801\uc778 \uac8c\uc784 \uc138\uc158\uc744 \uad00\ub9ac\ud558\ub294 \uc2e4\ud589 \ub2e8\uc704<\/strong>\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room\uc758 \uae30\ubcf8 \uad6c\uc870<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>type RoomPhase =\n  | \"WAITING\"\n  | \"STARTING\"\n  | \"IN_PROGRESS\"\n  | \"ENDING\"\n  | \"CLOSED\";\n\ninterface Player {\n  id: string;\n  connected: boolean;\n  ready: boolean;\n}\n\ninterface RoomState {\n  roomId: string;\n  phase: RoomPhase;\n  players: Map&lt;string, Player&gt;;\n  maxPlayers: number;\n  startedAt?: number;\n}\n\nclass GameRoom {\n  readonly id: string;\n  readonly maxPlayers: number;\n\n  phase: RoomPhase = \"WAITING\";\n  players = new Map&lt;string, Player&gt;();\n\n  constructor(id: string, maxPlayers: number) {\n    this.id = id;\n    this.maxPlayers = maxPlayers;\n  }\n\n  addPlayer(player: Player): void {\n    if (this.phase !== \"WAITING\") {\n      throw new Error(\"\ud50c\ub808\uc774\uc5b4\ub97c \ucd94\uac00\ud560 \uc218 \uc5c6\ub294 \uc0c1\ud0dc\uc785\ub2c8\ub2e4.\");\n    }\n\n    if (this.players.has(player.id)) {\n      return;\n    }\n\n    if (this.players.size &gt;= this.maxPlayers) {\n      throw new Error(\"Room\uc774 \uac00\ub4dd \ucc3c\uc2b5\ub2c8\ub2e4.\");\n    }\n\n    this.players.set(player.id, player);\n  }\n\n  start(): void {\n    if (this.phase !== \"WAITING\") {\n      throw new Error(\"\uac8c\uc784\uc744 \uc2dc\uc791\ud560 \uc218 \uc5c6\ub294 \uc0c1\ud0dc\uc785\ub2c8\ub2e4.\");\n    }\n\n    if (this.players.size &lt; 2) {\n      throw new Error(\"\ucd5c\uc18c \uc778\uc6d0\uc774 \ubd80\uc871\ud569\ub2c8\ub2e4.\");\n    }\n\n    this.phase = \"STARTING\";\n\n    \/\/ \ub9f5 \ub85c\ub529, \uac8c\uc784 \uc624\ube0c\uc81d\ud2b8 \uc0dd\uc131 \ub4f1\uc758 \ucd08\uae30\ud654 \uc791\uc5c5\n\n    this.phase = \"IN_PROGRESS\";\n  }\n\n  end(): void {\n    if (\n      this.phase !== \"IN_PROGRESS\" &amp;&amp;\n      this.phase !== \"STARTING\"\n    ) {\n      return;\n    }\n\n    this.phase = \"ENDING\";\n\n    \/\/ \ubcf4\uc0c1 \uacc4\uc0b0, \uacb0\uacfc \uae30\ub85d \ub4f1\uc758 \ucc98\ub9ac\n\n    this.phase = \"CLOSED\";\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \ucf54\ub4dc\ub294 Room\uc758 \uae30\ubcf8\uc801\uc778 \uc0c1\ud0dc \uad00\ub9ac \uad6c\uc870\ub97c \ubcf4\uc5ec\uc900\ub2e4. \uc2e4\uc81c \uc11c\ubc84\uc5d0\uc11c\ub294 \ucd08\uae30\ud654 \uc2e4\ud328, \uc5f0\uacb0 \ud574\uc81c, \uc7ac\uc811\uc18d, \uacb0\uacfc \uc800\uc7a5 \uc2e4\ud328 \ub4f1\uc744 \ucd94\uac00\ub85c \ucc98\ub9ac\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c <code>Map<\/code>\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \ub3d9\uc2dc\uc131 \ubb38\uc81c\uac00 \ud574\uacb0\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc5ec\ub7ec \uc694\uccad\uc774 \uac19\uc740 \uc2e4\ud589 \ud658\uacbd\uc5d0\uc11c \ucc98\ub9ac\ub418\ub294\uc9c0, \uc5ec\ub7ec \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4\uac00 \uac19\uc740 Room\uc744 \uc218\uc815\ud560 \uc218 \uc788\ub294\uc9c0\uc5d0 \ub530\ub77c \ubcc4\ub3c4\uc758 \uc81c\uc5b4\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room \ub77c\uc774\ud504\uc0ac\uc774\ud074<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uacfc\uc815\uc744 \uac70\uce5c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc0dd\uc131 \u2192 \ub300\uae30 \u2192 \uac8c\uc784 \uc900\ube44 \u2192 \uc9c4\ud589 \u2192 \uc885\ub8cc \u2192 \uc815\ub9ac<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc0dd\uc131: Room ID\ub97c \ubc1c\uae09\ud558\uace0 \uae30\ubcf8 \uc124\uc815\uc744 \ucd08\uae30\ud654\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ub300\uae30: \ud50c\ub808\uc774\uc5b4 \uc785\uc7a5\uacfc \uc900\ube44 \uc0c1\ud0dc \ubcc0\uacbd\uc744 \ucc98\ub9ac\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uac8c\uc784 \uc900\ube44: \ub9f5, \ud50c\ub808\uc774\uc5b4 \uce90\ub9ad\ud130, \uac8c\uc784 \uc624\ube0c\uc81d\ud2b8\ub97c \uc0dd\uc131\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc9c4\ud589: \uc774\ub3d9, \uc804\ud22c, \uc0c1\ud638\uc791\uc6a9 \ub4f1 \uac8c\uc784 \ub85c\uc9c1\uc744 \uc2e4\ud589\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc885\ub8cc: \uc2b9\ud328 \ud310\uc815, \ubcf4\uc0c1 \uacc4\uc0b0, \uacb0\uacfc \uc800\uc7a5\uc744 \uc218\ud589\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc815\ub9ac: \uc5f0\uacb0\uacfc \ud0c0\uc774\uba38\ub97c \ud574\uc81c\ud558\uace0 \uba54\ubaa8\ub9ac\ub97c \ubc18\ud658\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 \uc885\ub8cc \ucc98\ub9ac\uc640 \uc815\ub9ac \uc791\uc5c5\uc740 \uad6c\ubd84\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. \uac8c\uc784\uc774 \ub05d\ub0ac\ub2e4\uace0 \ud574\uc11c \uc989\uc2dc \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \uc0ad\uc81c\ud558\uba74 \uacb0\uacfc \uc800\uc7a5\uc774\ub098 \uc7ac\uc811\uc18d \ucc98\ub9ac\uac00 \uc2e4\ud328\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Room\uc758 \ucc45\uc784\uacfc \uc11c\ubc84\uc758 \ucc45\uc784<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc740 \uac8c\uc784 \uc138\uc158 \ub0b4\ubd80\uc758 \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud55c\ub2e4. \ubc18\uba74 Matchmaking\uc740 \ud50c\ub808\uc774\uc5b4\ub97c \uc801\uc808\ud55c Room\uc5d0 \ubc30\uc815\ud558\uace0, \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 \uc601\uad6c\uc801\uc73c\ub85c \ubcf4\uc874\ud574\uc57c \ud558\ub294 \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7ec\ud55c \ucc45\uc784\uc744 \ubd84\ub9ac\ud558\uba74 \uac8c\uc784 \ubaa8\ub4dc\uac00 \ub298\uc5b4\ub098\ub354\ub77c\ub3c4 \uc804\uccb4 \uc11c\ubc84 \uad6c\uc870\ub97c \uc720\uc9c0\ud558\uae30 \uc26c\uc6cc\uc9c4\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Matchmaking\uacfc \ub300\uae30\uc5f4<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Matchmaking\uc774\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Matchmaking\uc740 \ud50c\ub808\uc774\uc5b4\ub97c \uc801\uc808\ud55c \uac8c\uc784 \uc138\uc158\uc5d0 \ubc30\uc815\ud558\ub294 \uacfc\uc815\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8\uc21c\ud55c \ud611\ub3d9 \uac8c\uc784\uc5d0\uc11c\ub294 \uba3c\uc800 \ub300\uae30\uc5f4\uc5d0 \ub4e4\uc5b4\uc628 \ud50c\ub808\uc774\uc5b4\ubd80\ud130 \uc778\uc6d0\uc744 \ucc44\uc6cc \uac8c\uc784\uc744 \uc2dc\uc791\ud560 \uc218 \uc788\ub2e4. \uacbd\uc7c1 \uac8c\uc784\uc5d0\uc11c\ub294 \uc2e4\ub825, \uc9c0\uc5ed, \ud551, \ub300\uae30 \uc2dc\uac04 \ub4f1\uc744 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Matchmaking \uc2dc\uc2a4\ud15c\uc740 \uc77c\ubc18\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\uc131\ub41c\ub2e4.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub9e4\uce6d\uc744 \uc694\uccad\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc11c\ubc84\uac00 \uc778\uc99d\uacfc \ub9e4\uce6d \uc870\uac74\uc744 \uac80\uc99d\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ud50c\ub808\uc774\uc5b4\ub97c \ub300\uae30\uc5f4\uc5d0 \ub4f1\ub85d\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ub9e4\uce6d \uc870\uac74\uc744 \ub9cc\uc871\ud558\ub294 \ud50c\ub808\uc774\uc5b4\ub97c \uc120\ud0dd\ud55c\ub2e4.<\/li>\n\n\n\n<li>Room\uc744 \uc0dd\uc131\ud558\uac70\ub098 \uae30\uc874 Room\uc744 \uc120\ud0dd\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ud50c\ub808\uc774\uc5b4\ub97c Room\uc5d0 \ubc30\uc815\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc811\uc18d \uc815\ubcf4\ub97c \uc804\ub2ec\ud55c\ub2e4.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\ub300\uae30\uc5f4 \uc790\ub8cc\uad6c\uc870<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uac00\uc7a5 \ub2e8\uc21c\ud55c \ub300\uae30\uc5f4\uc740 FIFO(First In, First Out) \ubc29\uc2dd\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface MatchTicket {\n  playerId: string;\n  gameMode: string;\n  region: string;\n  enqueuedAt: number;\n}\n\nclass MatchQueue {\n  private tickets: MatchTicket&#91;] = &#91;];\n\n  enqueue(ticket: MatchTicket): void {\n    this.tickets.push(ticket);\n  }\n\n  dequeue(): MatchTicket | undefined {\n    return this.tickets.shift();\n  }\n\n  remove(playerId: string): void {\n    this.tickets = this.tickets.filter(\n      ticket =&gt; ticket.playerId !== playerId\n    );\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc608\uc81c\ub294 \uac1c\ub150\uc744 \uc124\uba85\ud558\uae30 \uc704\ud55c \uad6c\ud604\uc774\ub2e4. JavaScript \ubc30\uc5f4\uc758 <code>shift()<\/code>\ub294 \uc694\uc18c\uac00 \ub9ce\uc544\uc9c0\uba74 \ube44\uc6a9\uc774 \ucee4\uc9c8 \uc218 \uc788\uc73c\uba70, \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ud050 \uc790\ub8cc\uad6c\uc870\ub098 Redis \uae30\ubc18 \ub300\uae30\uc5f4 \ub4f1\uc744 \uace0\ub824\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c \uc2e4\uc81c Matchmaking\uc5d0\uc11c\ub294 \ud50c\ub808\uc774\uc5b4 \ud55c \uba85\uc774 \uc5ec\ub7ec \ubc88 \ub9e4\uce6d\uc744 \uc694\uccad\ud558\uac70\ub098, \ub9e4\uce6d \ub3c4\uc911 \ucde8\uc18c\ud558\uac70\ub098, \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c0\ub294 \uc0c1\ud669\uc744 \ucc98\ub9ac\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ub300\uae30\uc5f4\uc5d0 \ub4f1\ub85d\ub41c \ud50c\ub808\uc774\uc5b4\ub97c \uc911\ubcf5\uc73c\ub85c \ucd94\uac00\ud558\uc9c0 \uc54a\ub3c4\ub85d \ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub9e4\uce6d \uc0c1\ud0dc \uad00\ub9ac<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud50c\ub808\uc774\uc5b4\uc758 \ub9e4\uce6d \uc0c1\ud0dc\ub97c \uba85\uc2dc\uc801\uc73c\ub85c \uad00\ub9ac\ud558\uba74 \uc911\ubcf5 \uc694\uccad\uacfc \uc798\ubabb\ub41c \uc0c1\ud0dc \ubcc0\uacbd\uc744 \ubc29\uc9c0\ud558\uae30 \uc27d\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>type MatchStatus =\n  | \"IDLE\"\n  | \"QUEUED\"\n  | \"MATCHED\"\n  | \"CANCELLED\";\n\ninterface PlayerMatchState {\n  playerId: string;\n  status: MatchStatus;\n  ticketId?: string;\n  roomId?: string;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 <code>QUEUED<\/code> \uc0c1\ud0dc\uc778 \ud50c\ub808\uc774\uc5b4\uac00 \ub2e4\uc2dc \ub9e4\uce6d\uc744 \uc694\uccad\ud558\uba74 \uae30\uc874 \uc694\uccad\uc744 \ubc18\ud658\ud558\uac70\ub098 \uc624\ub958\ub97c \uc751\ub2f5\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub9e4\uce6d\uc774 \uc644\ub8cc\ub418\uba74 <code>MATCHED<\/code>\ub85c \uc804\ud658\ud558\uace0, \ucde8\uc18c \uc694\uccad\uc774 \ub4e4\uc5b4\uc624\uba74 \ud574\ub2f9 \uc694\uccad\uc774 \uc544\uc9c1 \ub300\uae30\uc5f4\uc5d0 \uc788\ub294\uc9c0 \ud655\uc778\ud55c \ud6c4 <code>CANCELLED<\/code>\ub85c \ubcc0\uacbd\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uc694\ud55c \uac83\uc740 \uc0c1\ud0dc \ud655\uc778\uacfc \uc0c1\ud0dc \ubcc0\uacbd\uc744 \ud558\ub098\uc758 \ub17c\ub9ac\uc801 \uc791\uc5c5\uc73c\ub85c \ucc98\ub9ac\ud558\ub294 \uac83\uc774\ub2e4. \ub450 \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ub4e4\uc5b4\uc624\uba74 \ub458 \ub2e4 \ud50c\ub808\uc774\uc5b4\uac00 <code>IDLE<\/code> \uc0c1\ud0dc\ub77c\uace0 \ud310\ub2e8\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc2e4\uc804\uc5d0\uc11c \uace0\ub824\ud560 \ub9e4\uce6d \uc870\uac74<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\uc870\uac74<\/th><th>\ubaa9\uc801<\/th><\/tr><tr><td>\uac8c\uc784 \ubaa8\ub4dc<\/td><td>\uc11c\ub85c \ub2e4\ub978 \uac8c\uc784 \uaddc\uce59\uc758 \ud50c\ub808\uc774\uc5b4 \ubd84\ub9ac<\/td><\/tr><tr><td>\ucd5c\ub300 \uc778\uc6d0<\/td><td>Room\uc758 \uc815\uc6d0 \uc720\uc9c0<\/td><\/tr><tr><td>MMR \ub610\ub294 ELO<\/td><td>\uc2e4\ub825\uc774 \ube44\uc2b7\ud55c \ud50c\ub808\uc774\uc5b4 \ub9e4\uce6d<\/td><\/tr><tr><td>\uc9c0\uc5ed \ubc0f \ud551<\/td><td>\ub124\ud2b8\uc6cc\ud06c \uc9c0\uc5f0 \ucd5c\uc18c\ud654<\/td><\/tr><tr><td>\ub300\uae30 \uc2dc\uac04<\/td><td>\uc624\ub798 \uae30\ub2e4\ub9b0 \ud50c\ub808\uc774\uc5b4\uc758 \ub9e4\uce6d \ubc94\uc704 \ud655\ub300<\/td><\/tr><tr><td>\ud30c\ud2f0 \ub2e8\uc704<\/td><td>\ud568\uaed8 \uc2e0\uccad\ud55c \ud50c\ub808\uc774\uc5b4\uc758 \ub3d9\uc2dc \uc785\uc7a5<\/td><\/tr><tr><td>\uc7ac\uc811\uc18d \uc5ec\ubd80<\/td><td>\uae30\uc874 \uac8c\uc784\uc5d0 \ubcf5\uadc0\ud574\uc57c \ud558\ub294 \ud50c\ub808\uc774\uc5b4 \ucc98\ub9ac<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \uac8c\uc784\uc5d0 \ubcf5\uc7a1\ud55c \ub9e4\uce6d \uc54c\uace0\ub9ac\uc998\uc774 \ud544\uc694\ud55c \uac83\uc740 \uc544\ub2c8\ub2e4. \uc18c\uaddc\ubaa8 \ud611\ub3d9 \uac8c\uc784\uc774\ub77c\uba74 \uc778\uc6d0\uacfc \uac8c\uc784 \ubaa8\ub4dc\ub9cc\uc73c\ub85c\ub3c4 \ucda9\ubd84\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc11c\ubc84 \uad8c\ud55c \uae30\ubc18 \uac8c\uc784 \ub85c\uc9c1<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc11c\ubc84 \uad8c\ud55c \ubaa8\ub378\uc774\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \uad8c\ud55c(Server Authoritative)\uc740 \uac8c\uc784\uc758 \uc911\uc694\ud55c \ud310\uc815\uacfc \uc0c1\ud0dc \ubcc0\uacbd\uc744 \uc11c\ubc84\uac00 \ucd5c\uc885\uc801\uc73c\ub85c \uacb0\uc815\ud558\ub294 \uad6c\uc870\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \ud50c\ub808\uc774\uc5b4\uc758 \uc785\ub825\uc744 \uc804\ub2ec\ud558\uace0, \uc11c\ubc84\ub294 \uc785\ub825\uc774 \uc720\ud6a8\ud55c\uc9c0 \uac80\uc99d\ud55c \ud6c4 \uac8c\uc784 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4\uac00 \ubaac\uc2a4\ud130\ub97c \uacf5\uaca9\ud588\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \uc694\uccad\ud55c\ub2e4\uace0 \ud574\uc11c \uc11c\ubc84\uac00 \uadf8\ub300\ub85c \ucc98\ub9ac\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"type\": \"ATTACK\",\n  \"targetId\": \"monster-001\",\n  \"damage\": 9999\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc804\ub2ec\ud55c <code>damage<\/code>\ub97c \uadf8\ub300\ub85c \uc2e0\ub8b0\ud558\uba74 \uacf5\uaca9\ub825\uc744 \uc870\uc791\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\uc2e0 \uc11c\ubc84\uac00 \ud50c\ub808\uc774\uc5b4\uc758 \ubb34\uae30, \uacf5\uaca9\ub825, \uacf5\uaca9 \uc18d\ub3c4, \uac70\ub9ac, \ub300\uc0c1\uc758 \uc0c1\ud0dc\ub97c \ud655\uc778\ud558\uace0 \ud53c\ud574\ub7c9\uc744 \uacc4\uc0b0\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface AttackCommand {\n  playerId: string;\n  targetId: string;\n}\n\ninterface Weapon {\n  baseDamage: number;\n  attackCooldownMs: number;\n  range: number;\n}\n\ninterface Character {\n  id: string;\n  x: number;\n  y: number;\n  hp: number;\n  weapon: Weapon;\n  lastAttackAt: number;\n}\n\nfunction attack(\n  attacker: Character,\n  target: Character,\n  now: number\n): void {\n  if (attacker.hp &lt;= 0 || target.hp &lt;= 0) {\n    throw new Error(\"\uacf5\uaca9\ud560 \uc218 \uc5c6\ub294 \uc0c1\ud0dc\uc785\ub2c8\ub2e4.\");\n  }\n\n  const dx = attacker.x - target.x;\n  const dy = attacker.y - target.y;\n  const distance = Math.sqrt(dx * dx + dy * dy);\n\n  if (distance &gt; attacker.weapon.range) {\n    throw new Error(\"\uacf5\uaca9 \ubc94\uc704\ub97c \ubc97\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4.\");\n  }\n\n  if (\n    now - attacker.lastAttackAt &lt;\n    attacker.weapon.attackCooldownMs\n  ) {\n    throw new Error(\"\uacf5\uaca9 \ub300\uae30 \uc2dc\uac04\uc774 \uc9c0\ub098\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.\");\n  }\n\n  target.hp = Math.max(\n    0,\n    target.hp - attacker.weapon.baseDamage\n  );\n\n  attacker.lastAttackAt = now;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ucf54\ub4dc\ub294 \uc11c\ubc84 \uad8c\ud55c \ub85c\uc9c1\uc758 \ud575\uc2ec\uc744 \ubcf4\uc5ec\uc900\ub2e4. \uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \uc785\ub825 \uac80\uc99d, \uc774\ub3d9 \uc0c1\ud0dc\uc758 \uc2e0\ub8b0\uc131, \ubb34\uc801 \uc2dc\uac04, \ubc84\ud504\uc640 \ub514\ubc84\ud504, \uc9c0\uc5f0 \uc2dc\uac04 \ubcf4\uc815, \ub3d9\uc2dc \uacf5\uaca9 \ucc98\ub9ac \ub4f1\uc744 \ucd94\uac00\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc11c\ubc84 \uad8c\ud55c\uc774 \uc911\uc694\ud55c \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uac00 \ud310\uc815\uc744 \ub2f4\ub2f9\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\ub97c \ud1b5\uc81c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uacf5\uaca9\ub825\uacfc \uccb4\ub825 \uc870\uc791<\/li>\n\n\n\n<li>\uc774\ub3d9 \uc18d\ub3c4 \ubc0f \uc21c\uac04\uc774\ub3d9 \uce58\ud2b8<\/li>\n\n\n\n<li>\uacf5\uaca9 \ucfe8\ub2e4\uc6b4 \ubb34\uc2dc<\/li>\n\n\n\n<li>\ubcf4\uc0c1\uacfc \uc7ac\ud654\uc758 \uc704\uc870<\/li>\n\n\n\n<li>\uac8c\uc784 \uaddc\uce59\uc744 \ubc97\uc5b4\ub09c \uc0c1\ud0dc \ubcc0\uacbd<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ubcf4\ub0b4\ub294 \ub370\uc774\ud130\ub294 \uae30\ubcf8\uc801\uc73c\ub85c \uc2e0\ub8b0\ud560 \uc218 \uc5c6\ub294 \uc785\ub825\uc73c\ub85c \ucde8\uae09\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \uc11c\ubc84 \uad8c\ud55c \ubaa8\ub378\uc774 \ubaa8\ub4e0 \uce58\ud2b8\ub97c \uc790\ub3d9\uc73c\ub85c \ub9c9\uc544 \uc8fc\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uc11c\ubc84\uac00 \uac80\uc99d\ud558\ub294 \uaddc\uce59\uc774 \ubd80\uc2e4\ud558\uac70\ub098 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc785\ub825\uc744 \uacfc\ub3c4\ud558\uac8c \uc2e0\ub8b0\ud558\uba74 \uc5ec\uc804\ud788 \uc545\uc6a9\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc11c\ubc84 \uad8c\ud55c\uacfc \ud074\ub77c\uc774\uc5b8\ud2b8 \uc608\uce21<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uac00 \ubaa8\ub4e0 \uc785\ub825\uc744 \ucc98\ub9ac\ud55c \ub4a4 \uacb0\uacfc\ub97c \uc804\ub2ec\ud558\uba74 \ub124\ud2b8\uc6cc\ud06c \uc9c0\uc5f0 \ub54c\ubb38\uc5d0 \uc870\uc791\uac10\uc774 \ub098\ube60\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub97c \uac1c\uc120\ud558\uae30 \uc704\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc785\ub825 \uacb0\uacfc\ub97c \uba3c\uc800 \uc608\uce21\ud558\uace0, \uc11c\ubc84\uc758 \ud655\uc815 \uc0c1\ud0dc\uac00 \ub3c4\ucc29\ud558\uba74 \ucc28\uc774\ub97c \ubcf4\uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Client Prediction: \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc785\ub825 \uacb0\uacfc\ub97c \ubbf8\ub9ac \uacc4\uc0b0\ud55c\ub2e4.<\/li>\n\n\n\n<li>Server Reconciliation: \uc11c\ubc84\uc758 \ud655\uc815 \uacb0\uacfc\uc640 \ube44\uad50\ud574 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc0c1\ud0dc\ub97c \ubcf4\uc815\ud55c\ub2e4.<\/li>\n\n\n\n<li>Lag Compensation: \uc9c0\uc5f0 \uc2dc\uac04 \ub54c\ubb38\uc5d0 \ubc1c\uc0dd\ud558\ub294 \ud310\uc815 \ubd88\uc77c\uce58\ub97c \uc81c\ud55c\uc801\uc73c\ub85c \ubcf4\uc815\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c \ud575\uc2ec\uc740 <strong>\ubc18\uc751 \uc18d\ub3c4\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uac1c\uc120\ud558\ub418, \ucd5c\uc885\uc801\uc778 \uac8c\uc784 \uaddc\uce59\uacfc \uacb0\uacfc\ub294 \uc11c\ubc84\uac00 \uacb0\uc815\ud55c\ub2e4<\/strong>\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uac8c\uc784 \uc0c1\ud0dc \ub3d9\uae30\ud654<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud0dc \ub3d9\uae30\ud654\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0c1\ud0dc \ub3d9\uae30\ud654(State Synchronization)\ub294 \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub3d9\uc77c\ud55c \uac8c\uc784 \uc138\uacc4\uc758 \uc0c1\ud0dc\ub97c \uad00\ucc30\ud560 \uc218 \uc788\ub3c4\ub85d \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud558\ub294 \uacfc\uc815\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uac00 \ud50c\ub808\uc774\uc5b4\uc758 \uc704\uce58\ub97c \ubcc0\uacbd\ud588\ub2e4\uace0 \uac00\uc815\ud558\uc790. \ub2e4\ub978 \ud50c\ub808\uc774\uc5b4\uc758 \ud654\uba74\uc5d0\uc11c\ub3c4 \ud574\ub2f9 \uce90\ub9ad\ud130\uac00 \uc801\uc808\ud55c \uc704\uce58\uc5d0 \ud45c\uc2dc\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub294 \uc704\uce58, \ud68c\uc804, \uccb4\ub825, \uc560\ub2c8\uba54\uc774\uc158 \uc0c1\ud0dc \ub4f1 \ud544\uc694\ud55c \uc815\ubcf4\ub97c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc804\uc1a1\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface PlayerSnapshot {\n  playerId: string;\n  x: number;\n  y: number;\n  rotation: number;\n  hp: number;\n}\n\ninterface GameSnapshot {\n  roomId: string;\n  tick: number;\n  serverTime: number;\n  players: PlayerSnapshot&#91;];\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>tick<\/code>\uc740 \uc11c\ubc84\uac00 \uac8c\uc784 \uc0c1\ud0dc\ub97c \uac31\uc2e0\ud558\ub294 \ub17c\ub9ac\uc801\uc778 \uc21c\uc11c\ub97c \ub098\ud0c0\ub0b8\ub2e4. <code>serverTime<\/code>\uc740 \uc2a4\ub0c5\uc0f7\uc774 \uc0dd\uc131\ub41c \uc2dc\uac01\uc744 \ub098\ud0c0\ub0b8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub450 \uac12\uc740 \ubaa9\uc801\uc774 \ub2e4\ub974\ub2e4. Tick\uc740 \uc21c\uc11c\uc640 \uc2dc\ubbac\ub808\uc774\uc158 \ub2e8\uacc4\ub97c \uad6c\ubd84\ud558\ub294 \ub370 \uc720\uc6a9\ud558\uace0, \uc11c\ubc84 \uc2dc\uac01\uc740 \uc2dc\uac04 \uae30\ubc18 \ubcf4\uc815\uc5d0 \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud0dc \ub3d9\uae30\ud654 \ubc29\uc2dd<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc0c1\ud0dc \uc2a4\ub0c5\uc0f7(State Snapshot)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uac00 \ud2b9\uc815 \uc2dc\uc810\uc758 \uac8c\uc784 \uc0c1\ud0dc\ub97c \uc804\uc1a1\ud55c\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc804\ub2ec\ubc1b\uc740 \uc0c1\ud0dc\ub97c \ubc14\ud0d5\uc73c\ub85c \uac8c\uc784 \ud654\uba74\uc744 \uac31\uc2e0\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uad6c\ud604\uc774 \ube44\uad50\uc801 \ub2e8\uc21c\ud558\uc9c0\ub9cc, \ub9e4\ubc88 \uc804\uccb4 \uc0c1\ud0dc\ub97c \uc804\uc1a1\ud558\uba74 \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9\ub7c9\uc774 \ucee4\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ub378\ud0c0 \ub3d9\uae30\ud654(Delta Synchronization)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\uc804 \uc0c1\ud0dc\uc640 \ube44\uad50\ud574 \ubcc0\uacbd\ub41c \ub370\uc774\ud130\ub9cc \uc804\uc1a1\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4 20\uba85\uc758 \uc0c1\ud0dc \uc911 3\uba85\uc758 \uc704\uce58\ub9cc \ubcc0\uacbd\ub410\ub2e4\uba74, \ubcc0\uacbd\ub41c 3\uba85\uc758 \uc815\ubcf4\ub9cc \uc804\uc1a1\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9\ub7c9\uc744 \uc904\uc77c \uc218 \uc788\uc9c0\ub9cc, \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84\uac00 \uae30\uc900\uc73c\ub85c \uc0bc\ub294 \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud574\uc57c \ud558\uba70, \ud328\ud0b7 \uc190\uc2e4\uc774\ub098 \uae30\uc900 \uc0c1\ud0dc \ubd88\uc77c\uce58\uc5d0 \ub300\ube44\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc774\ubca4\ud2b8 \uae30\ubc18 \ub3d9\uae30\ud654(Event-Based Synchronization)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uc0c1\ud0dc \uc790\uccb4\ubcf4\ub2e4 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\ub294 \uc0ac\uac74\uc744 \uc804\ub2ec\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 <code>PLAYER_DAMAGED<\/code>, <code>ITEM_PICKED_UP<\/code>, <code>DOOR_OPENED<\/code>\uc640 \uac19\uc740 \uc774\ubca4\ud2b8\ub97c \uc804\uc1a1\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ubca4\ud2b8\ub294 \uac8c\uc784\uc758 \uc758\ubbf8\ub97c \ud45c\ud604\ud558\uae30 \uc88b\uc9c0\ub9cc, \ubaa8\ub4e0 \uc774\ubca4\ud2b8\uac00 \uc815\ud655\ud788 \uc804\ub2ec\ub418\uace0 \uc62c\ubc14\ub978 \uc21c\uc11c\ub85c \ucc98\ub9ac\ub418\ub294\uc9c0 \uad00\ub9ac\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uac8c\uc784\uc5d0\uc11c\ub294 \uc138 \ubc29\uc2dd\uc744 \ud63c\ud569\ud574 \uc0ac\uc6a9\ud558\uae30\ub3c4 \ud55c\ub2e4. \uc704\uce58\ub294 \uc8fc\uae30\uc801\uc778 \uc2a4\ub0c5\uc0f7\uc73c\ub85c \ub3d9\uae30\ud654\ud558\uace0, \uc544\uc774\ud15c \ud68d\ub4dd\uc740 \uc774\ubca4\ud2b8\ub85c \uc804\ub2ec\ud558\uba70, \ubcc0\uacbd\ub7c9\uc774 \uc801\uc740 \ub370\uc774\ud130\ub294 \ub378\ud0c0 \ubc29\uc2dd\uc73c\ub85c \uc804\uc1a1\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ubcf4\uac04\uacfc \uc608\uce21<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uc5d0\uc11c \uc804\ub2ec\ud558\ub294 \uc2a4\ub0c5\uc0f7\uc740 \ub124\ud2b8\uc6cc\ud06c \uc9c0\uc5f0 \ub54c\ubb38\uc5d0 \uc77c\uc815\ud55c \uac04\uaca9\uc73c\ub85c \ub3c4\ucc29\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub9e4\ubc88 \uc804\ub2ec\ubc1b\uc740 \uc704\uce58\ub85c \uc989\uc2dc \uc774\ub3d9\ud558\uba74 \uce90\ub9ad\ud130\uac00 \uc21c\uac04\uc801\uc73c\ub85c \ud280\ub294 \ud604\uc0c1\uc774 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub97c \uc644\ud654\ud558\ub294 \ub300\ud45c\uc801\uc778 \uae30\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Interpolation(\ubcf4\uac04):<\/strong> \uacfc\uac70\uc640 \ud604\uc7ac \uc2a4\ub0c5\uc0f7 \uc0ac\uc774\uc758 \uac12\uc744 \uacc4\uc0b0\ud574 \ubd80\ub4dc\ub7fd\uac8c \ud45c\uc2dc\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>Extrapolation(\uc678\uc0bd):<\/strong> \ucd5c\uadfc \uc774\ub3d9 \uc815\ubcf4\ub97c \ubc14\ud0d5\uc73c\ub85c \ub2e4\uc74c \uc704\uce58\ub97c \uc608\uce21\ud55c\ub2e4.<\/li>\n\n\n\n<li><strong>Prediction(\uc608\uce21):<\/strong> \uc785\ub825 \uacb0\uacfc\ub97c \ubbf8\ub9ac \uacc4\uc0b0\ud574 \uc9c0\uc5f0\uc744 \uc904\uc778\ub2e4.<\/li>\n\n\n\n<li><strong>Reconciliation(\uc7ac\uc870\uc815):<\/strong> \uc11c\ubc84\uc758 \ud655\uc815 \uc0c1\ud0dc\ub97c \uae30\uc900\uc73c\ub85c \uc608\uce21 \uacb0\uacfc\ub97c \ubcf4\uc815\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ubcf4\uac04\uc740 \uc548\uc815\uc801\uc778 \ud654\uba74 \ud45c\ud604\uc5d0 \uc720\ub9ac\ud558\uc9c0\ub9cc \ud45c\uc2dc\ub418\ub294 \uc0c1\ud0dc\uac00 \uc2e4\uc81c \uc11c\ubc84 \uc0c1\ud0dc\ubcf4\ub2e4 \uc870\uae08 \ub2a6\uc744 \uc218 \uc788\ub2e4. \uc678\uc0bd\uc740 \ubc18\uc751\uc131\uc774 \uc88b\uc9c0\ub9cc \uc608\uce21\uc774 \ube57\ub098\uac00\uba74 \ubcf4\uc815\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \ubaa8\ub4e0 \uac8c\uc784 \uc624\ube0c\uc81d\ud2b8\uc5d0 \ub3d9\uc77c\ud55c \ub3d9\uae30\ud654 \uc804\ub7b5\uc744 \uc801\uc6a9\ud558\uae30\ubcf4\ub2e4\ub294 \uc624\ube0c\uc81d\ud2b8\uc758 \ud2b9\uc131\uacfc \uac8c\uc784 \uc7a5\ub974\uc5d0 \ub530\ub77c \uc120\ud0dd\ud558\ub294 \uac83\uc774 \uc88b\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 \uc21c\uc11c \ubc0f \uc911\ubcf5 \ucc98\ub9ac<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uba54\uc2dc\uc9c0 \uc21c\uc11c\uac00 \uc911\uc694\ud55c \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784\uc5d0\uc11c\ub294 \uba54\uc2dc\uc9c0\uac00 \uc11c\ubc84\uc5d0 \ub3c4\ucc29\ud558\ub294 \uc21c\uc11c\uc640 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc785\ub825\uc744 \uc0dd\uc131\ud55c \uc21c\uc11c\uac00 \ub2e4\ub97c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc740 \uc785\ub825\uc774 \ubc1c\uc0dd\ud588\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\ud50c\ub808\uc774\uc5b4\uac00 \ubb38\uc744 \uc5f0\ub2e4.<\/li>\n\n\n\n<li>\ud50c\ub808\uc774\uc5b4\uac00 \ubb38\uc744 \ud1b5\uacfc\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ud50c\ub808\uc774\uc5b4\uac00 \ubb38\uc744 \ub2eb\ub294\ub2e4.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uba54\uc2dc\uc9c0\ub4e4\uc774 \uc758\ub3c4\ud55c \uc21c\uc11c\uc640 \ub2e4\ub974\uac8c \ucc98\ub9ac\ub418\uba74 \uc798\ubabb\ub41c \uac8c\uc784 \uc0c1\ud0dc\uac00 \ub9cc\ub4e4\uc5b4\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">TCP\ub294 \ud558\ub098\uc758 \uc5f0\uacb0\uc5d0\uc11c \uc804\ub2ec\ub418\ub294 \ubc14\uc774\ud2b8 \uc2a4\ud2b8\ub9bc\uc758 \uc21c\uc11c\ub97c \ubcf4\uc7a5\ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc5ec\ub7ec \uc5f0\uacb0\uc774\ub098 \uc11c\ub85c \ub2e4\ub978 \uba54\uc2dc\uc9c0 \ucc98\ub9ac \uacbd\ub85c\ub97c \uac70\uce58\ub294 \uc791\uc5c5\uae4c\uc9c0 \uc804\uccb4\uc801\uc73c\ub85c \uc21c\uc11c\uac00 \ubcf4\uc7a5\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">UDP\ub294 \uba54\uc2dc\uc9c0\uc758 \uc804\ub2ec\uc774\ub098 \uc21c\uc11c\ub97c \ubcf4\uc7a5\ud558\uc9c0 \uc54a\uc73c\ubbc0\ub85c, \ud544\uc694\ud55c \uacbd\uc6b0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uacc4\uce35\uc5d0\uc11c \ubcc4\ub3c4\uc758 \ucc98\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sequence Number\ub97c \ud65c\uc6a9\ud55c \uc21c\uc11c \uad00\ub9ac<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uc785\ub825\uc5d0 \uc21c\ubc88\uc744 \ubd80\uc5ec\ud558\uba74 \uba54\uc2dc\uc9c0\uc758 \uc21c\uc11c\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface PlayerInput {\n  playerId: string;\n  sequence: number;\n  moveX: number;\n  moveY: number;\n}\n\nclass InputProcessor {\n  private lastProcessedSequence = new Map&lt;string, number&gt;();\n\n  process(input: PlayerInput): boolean {\n    const last =\n      this.lastProcessedSequence.get(input.playerId) ?? 0;\n\n    if (input.sequence &lt;= last) {\n      return false;\n    }\n\n    \/\/ \uc2e4\uc81c \uac8c\uc784 \uc0c1\ud0dc \ubcc0\uacbd \ub85c\uc9c1 \uc2e4\ud589\n\n    this.lastProcessedSequence.set(\n      input.playerId,\n      input.sequence\n    );\n\n    return true;\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc608\uc81c\ub294 \uc774\ubbf8 \ucc98\ub9ac\ud55c \uc785\ub825\uc744 \ubb34\uc2dc\ud558\ub294 \uae30\ubcf8 \uad6c\uc870\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8, \ubaa8\ub4e0 \uc785\ub825\uc744 \ub2e8\uc21c\ud788 \uc21c\ubc88\uc73c\ub85c\ub9cc \ube44\uad50\ud558\uba74 \uc548 \ub41c\ub2e4. \uc785\ub825\uc774 10, 12, 11 \uc21c\uc11c\ub85c \ub3c4\ucc29\ud588\uc744 \ub54c 12\ub97c \uba3c\uc800 \ucc98\ub9ac\ud558\uace0 11\uc744 \ubc84\ub9ac\ub294 \uac83\uc774 \uc62c\ubc14\ub978\uc9c0\ub294 \uac8c\uc784 \uaddc\uce59\uc5d0 \ub530\ub77c \ub2e4\ub974\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc774\ub3d9 \uc785\ub825\ucc98\ub7fc \ucd5c\uc2e0 \uc0c1\ud0dc\uac00 \uc911\uc694\ud558\ub2e4\uba74 \uc624\ub798\ub41c \uc785\ub825\uc744 \ubc84\ub9b4 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uacf5\uaca9\uc774\ub098 \uc544\uc774\ud15c \uc0ac\uc6a9\ucc98\ub7fc \ubaa8\ub4e0 \uc720\ud6a8\ud55c \uc785\ub825\uc774 \uc911\uc694\ud558\ub2e4\uba74 \uc21c\uc11c\ub97c \ubcf4\uc874\ud558\uac70\ub098 \ub204\ub77d\ub41c \uc785\ub825\uc744 \ucc98\ub9ac\ud574\uc57c \ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc785\ub825 \uc21c\uc11c\uc5d0 \ub530\ub77c \uac8c\uc784 \uacb0\uacfc\uac00 \ub2ec\ub77c\uc9c4\ub2e4\uba74 \uc5f0\uc18d\ub41c \uc21c\ubc88\uc744 \ud655\uc778\ud558\uace0, \ud544\uc694\ud55c \uacbd\uc6b0 \ub300\uae30\ud558\uac70\ub098 \uc7ac\uc804\uc1a1\uc744 \uc694\uccad\ud574\uc57c \ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\uc911\ubcf5 \uc694\uccad \ucc98\ub9ac<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\ubcf5 \uc694\uccad\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc7ac\uc804\uc1a1, \ub124\ud2b8\uc6cc\ud06c \uc7ac\uc5f0\uacb0, \ud0c0\uc784\uc544\uc6c3 \uc774\ud6c4\uc758 \uc7ac\uc2dc\ub3c4 \ub4f1\uc73c\ub85c \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc544\uc774\ud15c \uad6c\ub9e4 \uc694\uccad\uc744 \ubcf4\ub0b8 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc751\ub2f5\uc744 \ubc1b\uc9c0 \ubabb\ud574 \uac19\uc740 \uc694\uccad\uc744 \ub2e4\uc2dc \ubcf4\ub0bc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uccab \ubc88\uc9f8 \uc694\uccad\uc774 \uc774\ubbf8 \ucc98\ub9ac\ub410\ub2e4\uba74 \ub450 \ubc88\uc9f8 \uc694\uccad\uc740 \uc7ac\ud654 \ucc28\uac10\uc774\ub098 \uc544\uc774\ud15c \uc9c0\uae09\uc744 \ubc18\ubcf5\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub97c \ubc29\uc9c0\ud558\ub294 \ubc29\ubc95 \uc911 \ud558\ub098\uac00 Idempotency Key\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface PurchaseRequest {\n  playerId: string;\n  requestId: string;\n  itemId: string;\n}\n\ninterface PurchaseResult {\n  success: boolean;\n  itemId: string;\n}\n\nclass PurchaseService {\n  private results =\n    new Map&lt;string, PurchaseResult&gt;();\n\n  purchase(request: PurchaseRequest): PurchaseResult {\n    const key = `${request.playerId}:${request.requestId}`;\n\n    const previous = this.results.get(key);\n\n    if (previous) {\n      return previous;\n    }\n\n    \/\/ \uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \uc5ec\uae30\uc11c \uc7ac\ud654 \ud655\uc778,\n    \/\/ \uc7ac\ud654 \ucc28\uac10, \uc544\uc774\ud15c \uc9c0\uae09\uc744 \uc6d0\uc790\uc801\uc73c\ub85c \ucc98\ub9ac\ud574\uc57c \ud55c\ub2e4.\n\n    const result: PurchaseResult = {\n      success: true,\n      itemId: request.itemId\n    };\n\n    this.results.set(key, result);\n\n    return result;\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ucf54\ub4dc\ub294 \uac1c\ub150\uc744 \uc124\uba85\ud558\uae30 \uc704\ud55c \uc608\uc2dc\ub2e4. \uba54\ubaa8\ub9ac\uc758 <code>Map<\/code>\uc740 \uc11c\ubc84 \uc7ac\uc2dc\uc791 \ud6c4 \ub370\uc774\ud130\uac00 \uc0ac\ub77c\uc9c0\uace0, \uc5ec\ub7ec \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4 \uac04\uc5d0 \uacf5\uc720\ub418\uc9c0 \uc54a\uc73c\uba70, \ub3d9\uc2dc \uc694\uccad \uc2dc \uc911\ubcf5 \uc2e4\ud589\uc744 \uc644\uc804\ud788 \ubc29\uc9c0\ud558\uc9c0 \ubabb\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc7ac\ud654\uc640 \uc544\uc774\ud15c\uc744 \ucc98\ub9ac\ud560 \ub54c\ub294 \uc694\uccad \uc2dd\ubcc4\uc790\uc5d0 \uace0\uc720 \uc81c\uc57d \uc870\uac74\uc744 \uc801\uc6a9\ud558\uace0, \uc7ac\ud654 \ucc28\uac10\u00b7\uc544\uc774\ud15c \uc9c0\uae09\u00b7\ucc98\ub9ac \uacb0\uacfc \uae30\ub85d\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ud2b8\ub79c\uc7ad\uc158\uc73c\ub85c \ubb36\ub294 \ubc29\uc2dd \ub4f1\uc744 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\ubcf5 \uc694\uccad\uc744 \ub9c9\ub294 \uac83\uacfc \uba54\uc2dc\uc9c0 \uc21c\uc11c\ub97c \ubcf4\uc7a5\ud558\ub294 \uac83\uc740 \uc11c\ub85c \ub2e4\ub978 \ubb38\uc81c\ub2e4. Idempotency Key\ub294 \ub3d9\uc77c\ud55c \uc791\uc5c5\uc758 \ubc18\ubcf5 \uc2e4\ud589\uc744 \ub9c9\uace0, Sequence Number\ub294 \uc785\ub825\uc758 \uc21c\uc11c\ub97c \ud310\ub2e8\ud558\ub294 \ub370 \uc0ac\uc6a9\ub41c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ub3d9\uc2dc \uc694\uccad\uacfc \uc0c1\ud0dc \ubcc0\uacbd \uc81c\uc5b4<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\ub3d9\uc2dc\uc131 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\ub294 \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84\uc5d0\ub294 \uc5ec\ub7ec \ud50c\ub808\uc774\uc5b4\uc758 \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ub4e4\uc5b4\uc628\ub2e4. \uac19\uc740 \ud50c\ub808\uc774\uc5b4\uac00 \uc5ec\ub7ec \uc694\uccad\uc744 \ube60\ub974\uac8c \ubcf4\ub0bc \uc218\ub3c4 \uc788\uace0, \uc11c\ub85c \ub2e4\ub978 \ud50c\ub808\uc774\uc5b4\uac00 \uac19\uc740 \uc790\uc6d0\uc744 \ubcc0\uacbd\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uccb4\ub825\uc774 100\uc778 \ubaac\uc2a4\ud130\ub97c \ub450 \ud50c\ub808\uc774\uc5b4\uac00 \ub3d9\uc2dc\uc5d0 \uacf5\uaca9\ud55c\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub450 \uacf5\uaca9\uc774 \uac01\uac01 70\uc758 \ud53c\ud574\ub97c \uc785\ud78c\ub2e4\uba74 \ucd5c\uc885 \uccb4\ub825\uc740 0\uc774\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \ub450 \uc694\uccad\uc774 \ub3d9\uc77c\ud55c \uc774\uc804 \uccb4\ub825 100\uc744 \uc77d\uace0 \uac01\uac01 \uacb0\uacfc\ub97c \uacc4\uc0b0\ud55c \ub4a4 \ub36e\uc5b4\uc4f0\uba74, \ucd5c\uc885 \uccb4\ub825\uc774 30\uc73c\ub85c \ub0a8\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \uc774\ub97c Lost Update\ub77c\uace0 \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JavaScript\uac00 \ub2e8\uc77c \uc2a4\ub808\ub4dc\ub85c \uc2e4\ud589\ub418\ub354\ub77c\ub3c4 \ub3d9\uc2dc\uc131 \ubb38\uc81c\uac00 \uc0ac\ub77c\uc9c0\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \ube44\ub3d9\uae30 \uc791\uc5c5\uc774 \uc11c\ub85c \uad50\ucc28\ud560 \uc218 \uc788\uace0, \uc5ec\ub7ec \ud504\ub85c\uc138\uc2a4\ub098 \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4\uac00 \uac19\uc740 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud560 \uc218\ub3c4 \uc788\uae30 \ub54c\ubb38\uc774\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub2e8\uc77c Room \uc2e4\ud589 \ud750\ub984<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Room\uc758 \uac8c\uc784 \uc0c1\ud0dc\ub97c \ud558\ub098\uc758 \uc2e4\ud589 \ud750\ub984\uc5d0\uc11c \uc21c\ucc28\uc801\uc73c\ub85c \ubcc0\uacbd\ud558\uba74 \ub3d9\uc2dc\uc131 \ubb38\uc81c\ub97c \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface DamageCommand {\n  targetId: string;\n  damage: number;\n}\n\nclass Monster {\n  constructor(\n    public readonly id: string,\n    public hp: number\n  ) {}\n\n  applyDamage(damage: number): void {\n    if (this.hp &lt;= 0) {\n      return;\n    }\n\n    this.hp = Math.max(0, this.hp - damage);\n  }\n}\n\nclass RoomSimulation {\n  private monsters = new Map&lt;string, Monster&gt;();\n  private commands: DamageCommand&#91;] = &#91;];\n\n  enqueueDamage(command: DamageCommand): void {\n    this.commands.push(command);\n  }\n\n  update(): void {\n    const currentCommands = this.commands;\n    this.commands = &#91;];\n\n    for (const command of currentCommands) {\n      const monster = this.monsters.get(command.targetId);\n\n      if (!monster) {\n        continue;\n      }\n\n      monster.applyDamage(command.damage);\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\uc5d0\uc11c\ub294 \uc694\uccad\uc744 \uba85\ub839 \ud050\uc5d0 \ub123\uace0 \uac8c\uc784 \uc5c5\ub370\uc774\ud2b8 \ub2e8\uacc4\uc5d0\uc11c \uc21c\uc11c\ub300\ub85c \ucc98\ub9ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \ub85c\uc9c1\uc744 \ud558\ub098\uc758 \uc2dc\ubbac\ub808\uc774\uc158 \ub8e8\ud504\uc5d0\uc11c \uc2e4\ud589\ud558\uba74 \uc0c1\ud0dc \ubcc0\uacbd \uc21c\uc11c\ub97c \uba85\ud655\ud558\uac8c \uc815\uc758\ud560 \uc218 \uc788\ub2e4. \ub2e4\ub9cc \uc774 \ubc29\uc2dd\ub9cc\uc73c\ub85c \uc678\ubd80 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \ub3d9\uc2dc \uac31\uc2e0\uc774\ub098 \uc5ec\ub7ec \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4 \uc0ac\uc774\uc758 \uacbd\uc7c1 \uc0c1\ud0dc\uae4c\uc9c0 \ud574\uacb0\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Optimistic Locking\uacfc Pessimistic Locking<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc758 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud560 \ub54c\ub294 \uc7a0\uae08 \uc804\ub7b5\uc744 \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Optimistic Locking(\ub099\uad00\uc801 \uc7a0\uae08)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ucda9\ub3cc\uc774 \uc790\uc8fc \ubc1c\uc0dd\ud558\uc9c0 \uc54a\ub294\ub2e4\uace0 \uac00\uc815\ud558\uace0, \ub370\uc774\ud130\uc758 \ubc84\uc804\uc744 \ud655\uc778\ud574 \ubcc0\uacbd \ucda9\ub3cc\uc744 \uac10\uc9c0\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE inventory\nSET quantity = quantity - 1,\n    version = version + 1\nWHERE player_id = ?\n  AND item_id = ?\n  AND version = ?\n  AND quantity &gt;= 1;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubcc0\uacbd\ub41c \ud589\uc774 1\uac1c\ub77c\uba74 \ud574\ub2f9 \ubc84\uc804\uc758 \ub370\uc774\ud130\ub97c \uae30\uc900\uc73c\ub85c \uac31\uc2e0\uc5d0 \uc131\uacf5\ud55c \uac83\uc774\ub2e4. 0\uac1c\ub77c\uba74 \ub370\uc774\ud130\uac00 \ubcc0\uacbd\ub410\uac70\ub098 \uc218\ub7c9 \uc870\uac74\uc744 \ub9cc\uc871\ud558\uc9c0 \ubabb\ud55c \uac83\uc774\ubbc0\ub85c \uacb0\uacfc\ub97c \ud655\uc778\ud558\uace0 \uc7ac\uc2dc\ub3c4\ud558\uac70\ub098 \uc694\uccad\uc744 \uac70\ubd80\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pessimistic Locking(\ube44\uad00\uc801 \uc7a0\uae08)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub978 \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ub370\uc774\ud130\ub97c \ubcc0\uacbd\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \uc7a0\uae08\uc744 \ud68d\ub4dd\ud55c \ub4a4 \uc791\uc5c5\uc744 \uc218\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>START TRANSACTION;\n\nSELECT quantity\nFROM inventory\nWHERE player_id = ?\n  AND item_id = ?\nFOR UPDATE;\n\n-- \uc218\ub7c9 \ud655\uc778 \ud6c4 \ucc28\uac10 \ubc0f \uad00\ub828 \ub370\uc774\ud130 \ubcc0\uacbd\n\nCOMMIT;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \uc218\ub7c9 \uac80\uc99d, \ucc28\uac10, \uacb0\uacfc \uae30\ub85d\uc744 \ubaa8\ub450 \ud2b8\ub79c\uc7ad\uc158 \uc548\uc5d0\uc11c \ucc98\ub9ac\ud558\uace0, \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uba74 \ub864\ubc31\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub099\uad00\uc801 \uc7a0\uae08\uc740 \ucda9\ub3cc\uc774 \uc801\uc740 \ud658\uacbd\uc5d0 \uc801\ud569\ud558\uace0, \ube44\uad00\uc801 \uc7a0\uae08\uc740 \ucda9\ub3cc\uc774 \uc7a6\uac70\ub098 \uc791\uc5c5\uc758 \uc9c1\ub82c\ud654\uac00 \ud544\uc694\ud55c \uc0c1\ud669\uc5d0 \uc720\uc6a9\ud558\ub2e4. \ub2e4\ub9cc \uc7a0\uae08\uc740 \ub300\uae30 \uc2dc\uac04\uacfc \uad50\ucc29 \uc0c1\ud0dc\ub97c \uc720\ubc1c\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \ubc94\uc704\ub97c \ucd5c\uc18c\ud654\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uac8c\uc784 \uc0c1\ud0dc\uc640 \uc601\uad6c \ub370\uc774\ud130\uc758 \uad6c\ubd84<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \uac8c\uc784 \uc0c1\ud0dc\ub97c \ub9e4 \ud504\ub808\uc784 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4\uc758 \uc2e4\uc2dc\uac04 \uc704\uce58, \ubaac\uc2a4\ud130\uc758 \uc774\ub3d9, \ud22c\uc0ac\uccb4\uc758 \uc704\uce58\ub294 \uba54\ubaa8\ub9ac\uc5d0\uc11c \ucc98\ub9ac\ud558\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\ub2e4. \ubc18\uba74 \uc7ac\ud654, \uacb0\uc81c, \uc778\ubca4\ud1a0\ub9ac, \uc601\uad6c \ubcf4\uc0c1 \ub4f1\uc740 \uc601\uc18d\uc131\uacfc \uc815\ud569\uc131\uc744 \uace0\ub824\ud574 \uc800\uc7a5\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uc138\uc158\uc758 \uc2e4\uc2dc\uac04 \uc0c1\ud0dc\uc640 \uc601\uad6c \ub370\uc774\ud130\ub97c \ubd84\ub9ac\ud558\uba74 \ubd88\ud544\uc694\ud55c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ubd80\ud558\ub97c \uc904\uc774\uace0, \uc911\uc694\ud55c \ub370\uc774\ud130\uc758 \uc77c\uad00\uc131\uc744 \ub354 \uc5c4\uaca9\ud558\uac8c \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc804\uccb4 \uad6c\uc870 \uc815\ub9ac<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84\uc758 \uc8fc\uc694 \uad6c\uc131 \uc694\uc18c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5f0\uacb0\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client\n  \u2502\n  \u251c\u2500\u2500 \ub9e4\uce6d \uc694\uccad\n  \u25bc\nMatchmaking\n  \u2502\n  \u251c\u2500\u2500 \ub300\uae30\uc5f4 \uad00\ub9ac\n  \u251c\u2500\u2500 \ud50c\ub808\uc774\uc5b4 \uadf8\ub8f9 \uad6c\uc131\n  \u25bc\nRoom Manager\n  \u2502\n  \u251c\u2500\u2500 Room \uc0dd\uc131 \ubc0f \ubc30\uc815\n  \u25bc\nGame Room\n  \u2502\n  \u251c\u2500\u2500 \uc785\ub825 \uac80\uc99d\n  \u251c\u2500\u2500 \uac8c\uc784 \uc2dc\ubbac\ub808\uc774\uc158\n  \u251c\u2500\u2500 \uc0c1\ud0dc \ubcc0\uacbd\n  \u251c\u2500\u2500 \uc2a4\ub0c5\uc0f7 \ubc0f \uc774\ubca4\ud2b8 \uc804\uc1a1\n  \u25bc\nClient Synchronization\n  \u2502\n  \u251c\u2500\u2500 \ubcf4\uac04 \ubc0f \uc608\uce21\n  \u2514\u2500\u2500 \uc11c\ubc84 \uc0c1\ud0dc\uc5d0 \ub9de\ucdb0 \ubcf4\uc815\n\nPersistent Data\n  \u251c\u2500\u2500 \uc7ac\ud654 \ubc0f \uc778\ubca4\ud1a0\ub9ac\n  \u251c\u2500\u2500 \ub9e4\uce58 \uacb0\uacfc\n  \u2514\u2500\u2500 \uc601\uad6c \ubcf4\uc0c1 \ubc0f \uae30\ub85d<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\uc5d0\uc11c \uac01 \uad6c\uc131 \uc694\uc18c\ub294 \uba85\ud655\ud55c \ucc45\uc784\uc744 \uac00\uc838\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Matchmaking\uc740 \ud50c\ub808\uc774\uc5b4\ub97c \uc801\uc808\ud55c \uac8c\uc784 \uc138\uc158\uc5d0 \ubc30\uc815\ud55c\ub2e4.<\/li>\n\n\n\n<li>Room Manager\ub294 Room\uc758 \uc0dd\uc131\uacfc \uc218\uba85 \uc8fc\uae30\ub97c \uad00\ub9ac\ud55c\ub2e4.<\/li>\n\n\n\n<li>Game Room\uc740 \uc138\uc158 \ub0b4\ubd80\uc758 \uac8c\uc784 \uc0c1\ud0dc\ub97c \uad00\ub9ac\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc11c\ubc84 \uad8c\ud55c \ub85c\uc9c1\uc740 \uc785\ub825\uc744 \uac80\uc99d\ud558\uace0 \uac8c\uc784 \uacb0\uacfc\ub97c \ud310\uc815\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ub3d9\uae30\ud654 \uacc4\uce35\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \ud544\uc694\ud55c \uc0c1\ud0dc\uc640 \uc774\ubca4\ud2b8\ub97c \uc804\ub2ec\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc601\uad6c \ub370\uc774\ud130 \uacc4\uce35\uc740 \uc7ac\ud654\uc640 \uc778\ubca4\ud1a0\ub9ac \ub4f1 \ubcf4\uc874\ud574\uc57c \ud558\ub294 \uc815\ubcf4\ub97c \uc548\uc804\ud558\uac8c \ucc98\ub9ac\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \uc774 \uad6c\uc131 \uc694\uc18c\ub97c \ubc18\ub4dc\uc2dc \ubcc4\ub3c4 \uc11c\ubc84\ub098 \ud504\ub85c\uc138\uc2a4\ub85c \ubd84\ub9ac\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4. \ucd08\uae30\uc5d0\ub294 \ud558\ub098\uc758 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc548\uc5d0\uc11c \ubaa8\ub4c8\ub85c \ubd84\ub9ac\ud558\uace0, \ubd80\ud558\uc640 \uc6b4\uc601 \uc694\uad6c\uac00 \uc99d\uac00\ud558\uba74 \ud544\uc694\ud55c \ubd80\ubd84\ubd80\ud130 \ub3c5\ub9bd\uc801\uc73c\ub85c \ud655\uc7a5\ud560 \uc218 \uc788\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774\uc5b4 \uac8c\uc784 \uc11c\ubc84\ub294 \ub2e8\uc21c\ud788 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc744 \ubc1b\uc544 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub294 \uc11c\ubc84\uc640 \ub2e4\ub974\ub2e4. \uc5ec\ub7ec \ud50c\ub808\uc774\uc5b4\uac00 \ub3d9\uc2dc\uc5d0 \ud589\ub3d9\ud558\uace0, \uac01\uc790\uc758 \ub124\ud2b8\uc6cc\ud06c \uc9c0\uc5f0\uc774 \ub2e4\ub974\uba70, \ub3d9\uc77c\ud55c \uac8c\uc784 \uc0c1\ud0dc\ub97c \uc11c\ub85c \ub2e4\ub978 \uc2dc\uc810\uc5d0 \uad00\ucc30\ud558\uae30 \ub54c\ubb38\uc774\ub2e4. \uc774\ub7ec\ud55c \ud658\uacbd\uc5d0\uc11c \uc11c\ubc84\ub294 \ud50c\ub808\uc774\uc5b4\ub97c \uc801\uc808\ud55c \uac8c\uc784 \uc138\uc158\uc5d0 \ubc30\uce58\ud558\uace0, \uac8c\uc784\uc758 \uc815\ud569\uc131\uc744 \uc720\uc9c0\ud558\uba70, \uc5ec\ub7ec \uc694\uccad\uc774 \ub3d9\uc2dc\uc5d0 \ubc1c\uc0dd\ud558\ub354\ub77c\ub3c4 \uc77c\uad00\ub41c \uacb0\uacfc\ub97c \ubcf4\uc7a5\ud574\uc57c \ud55c\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 \uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84\ub97c \uc124\uacc4\ud560 \ub54c \ud544\uc694\ud55c [&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-2636","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\/2636","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=2636"}],"version-history":[{"count":2,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2636\/revisions"}],"predecessor-version":[{"id":2639,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2636\/revisions\/2639"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2636"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2636"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2636"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}