{"id":2641,"date":"2026-10-24T08:38:56","date_gmt":"2026-10-24T08:38:56","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=2641"},"modified":"2026-10-24T08:38:56","modified_gmt":"2026-10-24T08:38:56","slug":"%ec%8b%a4%ec%8b%9c%ea%b0%84-%ea%b2%8c%ec%9e%84-%ec%84%9c%eb%b2%84%ec%9d%98-%ec%97%b0%ea%b2%b0-%eb%b0%8f-%ec%84%b8%ec%85%98-%ea%b4%80%eb%a6%ac","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=2641","title":{"rendered":"\uc2e4\uc2dc\uac04 \uac8c\uc784 \uc11c\ubc84\uc758 \uc5f0\uacb0 \ubc0f \uc138\uc158 \uad00\ub9ac"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774 \uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c \uc5f0\uacb0 \ubc0f \uc138\uc158 \uad00\ub9ac\ub294 \ub2e8\uc21c\ud788 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc811\uc18d \uc5ec\ubd80\ub97c \ud655\uc778\ud558\ub294 \uc791\uc5c5\uc774 \uc544\ub2c8\ub2e4. \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c4 \ud50c\ub808\uc774\uc5b4\ub97c \uc5b4\ub5bb\uac8c \ucc98\ub9ac\ud560 \uac83\uc778\uc9c0, \uc7ac\uc811\uc18d\ud55c \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc\ub97c \uc5b4\ub5bb\uac8c \ubcf5\uad6c\ud560 \uac83\uc778\uc9c0, \uc11c\ubc84 \uc885\ub8cc \uc2dc \uc9c4\ud589 \uc911\uc778 \uac8c\uc784\uc744 \uc5b4\ub5bb\uac8c \uc548\uc804\ud558\uac8c \uc815\ub9ac\ud560 \uac83\uc778\uc9c0\uae4c\uc9c0 \ud3ec\ud568\ud558\ub294 \uc11c\ubc84 \uc124\uacc4\uc758 \ud575\uc2ec \uc601\uc5ed\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 WebSocket \uae30\ubc18 \uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c\ub294 \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c0\ub294 \uc0c1\ud669\uc774 \uc5b8\uc81c\ub4e0\uc9c0 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8 \uac15\uc81c \uc885\ub8cc, \ubaa8\ubc14\uc77c \ub124\ud2b8\uc6cc\ud06c \uc804\ud658, \uc77c\uc2dc\uc801\uc778 \ud328\ud0b7 \uc190\uc2e4, \uc11c\ubc84 \uc7a5\uc560 \ub4f1 \ub2e4\uc591\ud55c \uc6d0\uc778\uc774 \uc874\uc7ac\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c \uc5f0\uacb0 \uc885\ub8cc\uc640 \uac8c\uc784 \ud1f4\uc7a5\uc744 \ub3d9\uc77c\ud558\uac8c \ucde8\uae09\ud558\uba74 \uc77c\uc2dc\uc801\uc778 \ub124\ud2b8\uc6cc\ud06c \ubb38\uc81c\ub9cc\uc73c\ub85c \ud50c\ub808\uc774\uc5b4\uac00 \uac8c\uc784\uc5d0\uc11c \uc81c\uac70\ub420 \uc218 \uc788\ub2e4. \ubc18\ub300\ub85c \uc5f0\uacb0\uc774 \ub04a\uae34 \ud50c\ub808\uc774\uc5b4\ub97c \ubb34\uae30\ud55c \uc720\uc9c0\ud558\uba74 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc138\uc158\uc774 \ub204\uc801\ub418\uc5b4 \uc11c\ubc84 \uc790\uc6d0\uc744 \ub0ad\ube44\ud558\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc5f0\uacb0 \uad00\ub9ac \uc2dc\uc2a4\ud15c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\ub97c \ud574\uacb0\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc5f0\uacb0 \uc885\ub8cc\uc640 \uac8c\uc784 \ud1f4\uc7a5\uc744 \uad6c\ubd84\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc7ac\uc811\uc18d \uc2dc \uae30\uc874 \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc\ub97c \ubcf5\uad6c\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc138\uc158\uc758 \uc720\ud6a8 \uae30\uac04\uacfc \ud0c0\uc784\uc544\uc6c3\uc744 \uad00\ub9ac\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ub3d9\uc77c \uacc4\uc815\uc758 \uc911\ubcf5 \uc811\uc18d\uc744 \uc81c\uc5b4\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc11c\ubc84 \uc885\ub8cc \uc2dc \uc5f0\uacb0\uacfc \uac8c\uc784 \uc0c1\ud0dc\ub97c \uc548\uc804\ud558\uac8c \uc815\ub9ac\ud55c\ub2e4.<\/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\">\uc5f0\uacb0 \uc885\ub8cc\uc640 \uac8c\uc784 \ud1f4\uc7a5\uc758 \ucc28\uc774<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc5f0\uacb0 \uc885\ub8cc(Connection Disconnect)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5f0\uacb0 \uc885\ub8cc\ub294 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84 \uc0ac\uc774\uc758 \ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0\uc774 \ub04a\uc5b4\uc9c4 \uc0c1\ud0dc\ub97c \uc758\ubbf8\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4\uac00 \uac8c\uc784\uc744 \uc9c4\ud589\ud558\ub358 \uc911 Wi-Fi\uc5d0\uc11c \ubaa8\ubc14\uc77c \ub370\uc774\ud130\ub85c \uc804\ud658\ud558\uac70\ub098, \ub124\ud2b8\uc6cc\ud06c \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud558\uac70\ub098, \uac8c\uc784 \ud504\ub85c\uc138\uc2a4\uac00 \uac15\uc81c \uc885\ub8cc\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7ec\ud55c \uc0c1\ud669\uc5d0\uc11c\ub294 \uc11c\ubc84\uac00 \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc5c6\uc9c0\ub9cc, \ud50c\ub808\uc774\uc5b4\uac00 \uac8c\uc784\uc744 \uc644\uc804\ud788 \ub5a0\ub098\ub824 \ud588\ub294\uc9c0\ub294 \uc54c \uc218 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc5f0\uacb0 \uc885\ub8cc\uac00 \ubc1c\uc0dd\ud588\ub2e4\uace0 \ud574\uc11c \ubc18\ub4dc\uc2dc \uac8c\uc784\uc5d0\uc11c \ud50c\ub808\uc774\uc5b4\ub97c \uc81c\uac70\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uac8c\uc784 \ud1f4\uc7a5(Game Leave)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \ud1f4\uc7a5\uc740 \ud50c\ub808\uc774\uc5b4\uac00 \ud604\uc7ac \uac8c\uc784 \uc138\uc158\uc5d0\uc11c \ub098\uac00\uaca0\ub2e4\ub294 \uc758\uc0ac\ub97c \ud45c\uc2dc\ud558\uac70\ub098, \uc11c\ubc84\uac00 \uc815\ucc45\uc5d0 \ub530\ub77c \ud574\ub2f9 \ud50c\ub808\uc774\uc5b4\ub97c \uac8c\uc784\uc5d0\uc11c \uc81c\uac70\ud558\ub294 \ud589\uc704\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc740 \uc0c1\ud669\uc774 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud50c\ub808\uc774\uc5b4\uac00 \ub85c\ube44\uc5d0\uc11c \ub098\uac00\uae30 \ubc84\ud2bc\uc744 \ub204\ub978\ub2e4.<\/li>\n\n\n\n<li>\ud50c\ub808\uc774\uc5b4\uac00 \uac8c\uc784 \uc885\ub8cc\ub97c \uc694\uccad\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ube44\uc815\uc0c1\uc801\uc778 \ud589\uc704\ub85c \uc778\ud574 \uc11c\ubc84\uac00 \ud50c\ub808\uc774\uc5b4\ub97c \uac15\uc81c \ud1f4\uc7a5\uc2dc\ud0a8\ub2e4.<\/li>\n\n\n\n<li>\uc7ac\uc811\uc18d \uc720\uc608 \uc2dc\uac04\uc774 \ub9cc\ub8cc\ub418\uc5b4 \uc11c\ubc84\uac00 \ud50c\ub808\uc774\uc5b4\ub97c \uc81c\uac70\ud55c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \ud1f4\uc7a5\uc740 \ub2e8\uc21c\ud55c \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \uc885\ub8cc\ubcf4\ub2e4 \ub354 \ud070 \uc758\ubbf8\ub97c \uac00\uc9c4\ub2e4. \ud50c\ub808\uc774\uc5b4\ub97c \ubc29\uc5d0\uc11c \uc81c\uac70\ud558\uace0, \uc778\uc6d0\uc218\ub97c \uac31\uc2e0\ud558\uace0, \uac8c\uc784 \uaddc\uce59\uc5d0 \ub530\ub77c \uc804\ud22c\ub098 \ub9e4\uce58 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud574\uc57c \ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub450 \uc0c1\ud0dc\ub97c \ubd84\ub9ac\ud574\uc57c \ud558\ub294 \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 4\uc778 \ud611\ub3d9 \uacf5\ud3ec \uac8c\uc784\uc5d0\uc11c \ud50c\ub808\uc774\uc5b4 \ud55c \uba85\uc774 \uc778\ud130\ub137 \uc5f0\uacb0 \ubb38\uc81c\ub85c \uc811\uc18d\uc744 \uc783\uc5c8\ub2e4\uace0 \uac00\uc815\ud558\uc790.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5f0\uacb0 \uc885\ub8cc\uc640 \uac8c\uc784 \ud1f4\uc7a5\uc744 \ub3d9\uc77c\ud558\uac8c \ucc98\ub9ac\ud558\uba74 \ud574\ub2f9 \ud50c\ub808\uc774\uc5b4\ub294 \uc989\uc2dc \ubc29\uc5d0\uc11c \uc81c\uac70\ub41c\ub2e4. \ub2e4\uc2dc \uc811\uc18d\ud558\ub354\ub77c\ub3c4 \uae30\uc874 \ubc29\uc73c\ub85c \ub3cc\uc544\uac08 \uc218 \uc5c6\uace0, \ub2e4\ub978 \ud50c\ub808\uc774\uc5b4\uc758 \uc9c4\ud589 \uc0c1\ud0dc\uc5d0\ub3c4 \ubd88\ud544\uc694\ud55c \uc601\ud5a5\uc744 \uc904 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ub300\ub85c \uc5f0\uacb0 \uc885\ub8cc \uc0c1\ud0dc\ub97c \ubcc4\ub3c4\ub85c \uad00\ub9ac\ud558\uba74 \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \ud50c\ub808\uc774\uc5b4\uc758 \uc790\ub9ac\ub97c \uc720\uc9c0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c \uc11c\ubc84\ub294 \ud50c\ub808\uc774\uc5b4\uc758 \uce90\ub9ad\ud130\ub97c \uc77c\uc2dc\uc801\uc73c\ub85c \ube44\ud65c\uc131\ud654\ud558\uac70\ub098 AI\ub85c \ub300\uccb4\ud558\uace0, \uc7ac\uc811\uc18d\uc774 \uc131\uacf5\ud558\uba74 \uae30\uc874 \uc0c1\ud0dc\ub97c \ubcf5\uad6c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud575\uc2ec\uc740 <strong>\ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0 \uc0c1\ud0dc\uc640 \uac8c\uc784 \ucc38\uc5ec \uc0c1\ud0dc\ub97c \ubcc4\ub3c4\uc758 \uc0c1\ud0dc\ub85c \uad00\ub9ac\ud558\ub294 \uac83<\/strong>\uc774\ub2e4.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\uad6c\ubd84<\/th><th>\uc5f0\uacb0 \uc885\ub8cc<\/th><th>\uac8c\uc784 \ud1f4\uc7a5<\/th><\/tr><tr><td>\uc758\ubbf8<\/td><td>\ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0 \uc911\ub2e8<\/td><td>\uac8c\uc784 \ucc38\uc5ec \uc885\ub8cc<\/td><\/tr><tr><td>\ubc1c\uc0dd \uc6d0\uc778<\/td><td>\ub124\ud2b8\uc6cc\ud06c \uc7a5\uc560, \ud504\ub85c\uc138\uc2a4 \uc885\ub8cc<\/td><td>\uc0ac\uc6a9\uc790 \uc694\uccad, \uc11c\ubc84 \uc815\ucc45<\/td><\/tr><tr><td>\ubc29\uc5d0\uc11c \uc81c\uac70<\/td><td>\uc989\uc2dc \uc81c\uac70\ud558\uc9c0 \uc54a\uc744 \uc218 \uc788\uc74c<\/td><td>\uc77c\ubc18\uc801\uc73c\ub85c \uc81c\uac70<\/td><\/tr><tr><td>\uc7ac\uc811\uc18d<\/td><td>\uae30\uc874 \uc138\uc158 \ubcf5\uad6c \uac00\ub2a5<\/td><td>\uc0c8\ub85c\uc6b4 \ucc38\uc5ec \uc808\ucc28\uac00 \ud544\uc694\ud560 \uc218 \uc788\uc74c<\/td><\/tr><tr><td>\uac8c\uc784 \uc0c1\ud0dc<\/td><td>\uc720\uc608 \uae30\uac04 \ub3d9\uc548 \uc720\uc9c0 \uac00\ub2a5<\/td><td>\uac8c\uc784 \uaddc\uce59\uc5d0 \ub530\ub77c \uc815\ub9ac<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\uc5f0\uacb0 \ubc0f \uc138\uc158 \uc0c1\ud0dc \uba38\uc2e0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5f0\uacb0 \uad00\ub9ac \ub85c\uc9c1\uc774 \ubcf5\uc7a1\ud574\uc9c0\ub294 \uac83\uc744 \ubc29\uc9c0\ud558\ub824\uba74 \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc\ub97c \uba85\uc2dc\uc801\uc73c\ub85c \uc815\uc758\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub2e4\uc74c\uacfc \uac19\uc740 \uc0c1\ud0dc \uba38\uc2e0\uc744 \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CONNECTED\n    |\n    | \uc5f0\uacb0 \uc885\ub8cc\n    v\nDISCONNECTED\n    |\n    | \uc7ac\uc811\uc18d \uc131\uacf5\n    v\nCONNECTED\n\nDISCONNECTED\n    |\n    | \uc720\uc608 \uc2dc\uac04 \ub9cc\ub8cc\n    v\nLEFT\n\nCONNECTED\n    |\n    | \uba85\uc2dc\uc801\uc778 \ud1f4\uc7a5 \uc694\uccad\n    v\nLEFT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uc0c1\ud0dc\uc758 \uc758\ubbf8\ub294 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CONNECTED<\/code>: \ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84\uac00 \uc815\uc0c1\uc801\uc73c\ub85c \ud1b5\uc2e0\ud558\ub294 \uc0c1\ud0dc<\/li>\n\n\n\n<li><code>DISCONNECTED<\/code>: \uc5f0\uacb0\uc740 \ub04a\uc5b4\uc84c\uc9c0\ub9cc \uae30\uc874 \uac8c\uc784 \ucc38\uc5ec \uc0c1\ud0dc\ub97c \uc720\uc9c0\ud558\ub294 \uc0c1\ud0dc<\/li>\n\n\n\n<li><code>LEFT<\/code>: \uac8c\uc784 \ucc38\uc5ec\uac00 \uc885\ub8cc\ub418\uc5b4 \uc138\uc158 \uc815\ub9ac\uac00 \uc644\ub8cc\ub41c \uc0c1\ud0dc<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \uc5f0\uacb0 \uc0c1\ud0dc\uc640 \uac8c\uc784 \ucc38\uc5ec \uc0c1\ud0dc\ub97c \ub354 \uc138\ubd84\ud654\ud560 \uc218\ub3c4 \uc788\ub2e4. \uc608\ub97c \ub4e4\uc5b4 \uc778\uc99d \uc644\ub8cc, \ub9e4\uce6d \ub300\uae30, \uac8c\uc784 \uc9c4\ud589, \uc7ac\uc811\uc18d \ub300\uae30, \ud1f4\uc7a5 \ucc98\ub9ac \uc911 \ub4f1\uc758 \uc0c1\ud0dc\ub97c \ubcc4\ub3c4\ub85c \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uc694\ud55c \uc810\uc740 \uc0c1\ud0dc \uc804\uc774 \uc870\uac74\uc744 \uba85\ud655\ud558\uac8c \uc815\uc758\ud558\ub294 \uac83\uc774\ub2e4. \uc5ec\ub7ec \uc774\ubca4\ud2b8\uac00 \ub3d9\uc2dc\uc5d0 \ubc1c\uc0dd\ud558\ub354\ub77c\ub3c4 \uc774\ubbf8 \ud1f4\uc7a5 \ucc98\ub9ac\ub41c \ud50c\ub808\uc774\uc5b4\uac00 \ub2e4\uc2dc \ubcf5\uad6c\ub418\uac70\ub098, \ub3d9\uc77c\ud55c \ud1f4\uc7a5 \ucc98\ub9ac\uac00 \uc5ec\ub7ec \ubc88 \uc2e4\ud589\ub418\uc9c0 \uc54a\ub3c4\ub85d \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 \uc0c1\ud0dc \ubcf5\uad6c(Reconnection and State Recovery)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc7ac\uc811\uc18d\uc774 \ud544\uc694\ud55c \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc2dc\uac04 \uac8c\uc784\uc5d0\uc11c\ub294 \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc774 \uc77c\uc2dc\uc801\uc73c\ub85c \ub04a\uc5b4\uc9c8 \uc218 \uc788\ub2e4. \uc11c\ubc84\uac00 \uc774\ub97c \ud56d\uc0c1 \uc601\uad6c\uc801\uc778 \uc774\ud0c8\ub85c \ud310\ub2e8\ud558\uba74 \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc774 \ub098\ube60\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc7ac\uc811\uc18d \uc2dc\uc2a4\ud15c\uc740 \uae30\uc874 \ud50c\ub808\uc774\uc5b4\ub97c \uc2dd\ubcc4\ud558\uace0, \ud574\ub2f9 \ud50c\ub808\uc774\uc5b4\uac00 \uc18d\ud588\ub358 \uac8c\uc784 \uc0c1\ud0dc\ub97c \ubcf5\uc6d0\ud558\ub294 \uae30\ub2a5\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\ubc18\uc801\uc778 \ucc98\ub9ac \uacfc\uc815\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0 \uc885\ub8cc\n        |\n        v\n\uc11c\ubc84\uac00 \uc5f0\uacb0 \uc885\ub8cc \uac10\uc9c0\n        |\n        v\n\ud50c\ub808\uc774\uc5b4\ub97c DISCONNECTED\ub85c \ubcc0\uacbd\n        |\n        v\n\uc7ac\uc811\uc18d \uc720\uc608 \uc2dc\uac04 \ub3d9\uc548 \uc138\uc158 \uc720\uc9c0\n        |\n        v\n\ud074\ub77c\uc774\uc5b8\ud2b8 \uc7ac\uc811\uc18d \uc694\uccad\n        |\n        v\n\uc778\uc99d \ubc0f \uc138\uc158 \uac80\uc99d\n        |\n        v\n\uae30\uc874 \ud50c\ub808\uc774\uc5b4 \uc0c1\ud0dc \ubcf5\uad6c\n        |\n        v\n\ucd5c\uc2e0 \uac8c\uc784 \uc0c1\ud0dc \uc804\uc1a1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc7ac\uc811\uc18d\uc774 \uc131\uacf5\ud558\ub824\uba74 \uae30\uc874 \ud50c\ub808\uc774\uc5b4\ub97c \uc2dd\ubcc4\ud560 \uc218 \uc788\uc5b4\uc57c \ud55c\ub2e4. \ub2e8\uc21c\ud788 \uc0c8\ub85c\uc6b4 WebSocket \uc5f0\uacb0\uc774 \uc0dd\uc131\ub418\uc5c8\ub2e4\ub294 \uc0ac\uc2e4\ub9cc\uc73c\ub85c \uae30\uc874 \ud50c\ub808\uc774\uc5b4\ub77c\uace0 \ud310\ub2e8\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc7ac\uc811\uc18d \ud1a0\ud070<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc7ac\uc811\uc18d\ud560 \ub54c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \ubcc4\ub3c4\uc758 \uc7ac\uc811\uc18d \ud1a0\ud070\uc744 \ubc1c\uae09\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface ReconnectSession {\n  playerId: string;\n  roomId: string;\n  tokenHash: string;\n  expiresAt: number;\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>playerId<\/code>: \uae30\uc874 \ud50c\ub808\uc774\uc5b4 \uc2dd\ubcc4\uc790<\/li>\n\n\n\n<li><code>roomId<\/code>: \uae30\uc874 \ud50c\ub808\uc774\uc5b4\uac00 \uc18d\ud55c \ubc29<\/li>\n\n\n\n<li><code>tokenHash<\/code>: \uc7ac\uc811\uc18d \ud1a0\ud070 \uac80\uc99d\uc5d0 \uc0ac\uc6a9\ud560 \ud574\uc2dc\uac12<\/li>\n\n\n\n<li><code>expiresAt<\/code>: \uc7ac\uc811\uc18d \ud5c8\uc6a9 \ub9cc\ub8cc \uc2dc\uac01<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uc7ac\uc811\uc18d \uc694\uccad\uacfc \ud568\uaed8 \ud1a0\ud070\uc744 \uc804\ub2ec\ud55c\ub2e4. \uc11c\ubc84\ub294 \ud1a0\ud070\uc758 \uc720\ud6a8\uc131, \ub9cc\ub8cc \uc5ec\ubd80, \ubc29\uc758 \uc874\uc7ac \uc5ec\ubd80, \ud50c\ub808\uc774\uc5b4 \uc0c1\ud0dc \ub4f1\uc744 \uac80\uc99d\ud55c \ub4a4 \uae30\uc874 \uc138\uc158\uc744 \ubcf5\uad6c\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ud1a0\ud070 \uc6d0\ubb38\uc744 \ub85c\uadf8\uc5d0 \ub0a8\uae30\uac70\ub098 \ud3c9\ubb38\uc73c\ub85c \uc601\uad6c \uc800\uc7a5\ud558\uc9c0 \uc54a\ub294 \uac83\uc774 \uc88b\ub2e4. \ud1a0\ud070\uc740 \ucda9\ubd84\ud55c \ubb34\uc791\uc704\uc131\uc744 \ud655\ubcf4\ud558\uace0, \ub9cc\ub8cc \uc2dc\uac04\uacfc \uc7ac\uc0ac\uc6a9 \uc815\ucc45\uc744 \uba85\ud655\ud558\uac8c \uc124\uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc7ac\uc811\uc18d \uc0c1\ud0dc \ubcf5\uad6c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc744 \ubcf5\uad6c\ud588\ub2e4\uace0 \ud574\uc11c \uac8c\uc784 \uc0c1\ud0dc\uae4c\uc9c0 \uc790\ub3d9\uc73c\ub85c \ubcf5\uad6c\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud50c\ub808\uc774\uc5b4\uac00 \uc5f0\uacb0\uc744 \uc783\uc740 \ub3d9\uc548 \ub2e4\ub978 \ud50c\ub808\uc774\uc5b4\ub4e4\uc774 \uc774\ub3d9\ud558\uace0, \uc801\uc774 \uacf5\uaca9\ud558\uace0, \uc544\uc774\ud15c\uc774 \uc0ac\uc6a9\ub418\uc5c8\uc744 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc11c\ubc84\ub294 \uc7ac\uc811\uc18d\ud55c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \ucd5c\uc2e0 \uc0c1\ud0dc\ub97c \uc804\ub2ec\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>interface PlayerSnapshot {\n  playerId: string;\n  position: {\n    x: number;\n    y: number;\n    z: number;\n  };\n  health: number;\n  inventory: string&#91;];\n  lastProcessedInputSequence: number;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uc2a4\ub0c5\uc0f7\uc740 \uac1c\ub150\uc801\uc778 \uc608\uc2dc\ub2e4. \uc2e4\uc81c\ub85c\ub294 \uac8c\uc784 \uaddc\uce59\uc5d0 \ub530\ub77c \ud544\uc694\ud55c \uc0c1\ud0dc\ub9cc \ud3ec\ud568\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub294 \uc778\uc99d\ub41c \ud50c\ub808\uc774\uc5b4\uc758 \ucd5c\uc2e0 \uc0c1\ud0dc\ub97c \uc77d\uace0, \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc804\ub2ec\ud55c\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \uae30\uc874 \ud654\uba74\uc744 \uc11c\ubc84 \uc0c1\ud0dc\uc5d0 \ub9de\ucdb0 \uac31\uc2e0\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>lastProcessedInputSequence<\/code>\ucc98\ub7fc \ub9c8\uc9c0\ub9c9\uc73c\ub85c \ucc98\ub9ac\ud55c \uc785\ub825 \ubc88\ud638\ub97c \uad00\ub9ac\ud558\uba74 \uc7ac\uc811\uc18d \uacfc\uc815\uc5d0\uc11c \uc774\ubbf8 \ucc98\ub9ac\ud55c \uc785\ub825\uc744 \uc911\ubcf5 \uc801\uc6a9\ud558\ub294 \ubb38\uc81c\ub3c4 \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc0c1\ud0dc \ubcf5\uad6c\uc5d0\uc11c \uc8fc\uc758\ud560 \uc810<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ubcf4\uad00\ud55c \ub370\uc774\ud130\ub97c \ubb34\uc870\uac74 \uc2e0\ub8b0\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uccb4\ub825, \uc7ac\ud654, \uc778\ubca4\ud1a0\ub9ac, \uc544\uc774\ud15c \uc18c\uc720\uad8c, \uacf5\uaca9 \uacb0\uacfc \ub4f1 \uc911\uc694\ud55c \uc0c1\ud0dc\ub294 \uc11c\ubc84\uac00 \uad8c\ud55c\uc744 \uac00\uc9c0\uace0 \uc788\uc5b4\uc57c \ud55c\ub2e4. \ud074\ub77c\uc774\uc5b8\ud2b8\ub294 \ubcf5\uad6c \uc694\uccad\uc744 \ubcf4\ub0bc \uc218 \uc788\uc9c0\ub9cc, \ubcf5\uad6c\ud560 \uc2e4\uc81c \uc0c1\ud0dc\ub294 \uc11c\ubc84\uac00 \uacb0\uc815\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c \uc7ac\uc811\uc18d\uc740 \uae30\uc874 \uc138\uc158\uc744 \ubcf5\uad6c\ud558\ub294 \uc791\uc5c5\uc774\uc9c0, \uac8c\uc784 \uc0c1\ud0dc\ub97c \uc774\uc804 \uc2dc\uc810\uc73c\ub85c \ub418\ub3cc\ub9ac\ub294 \uc791\uc5c5\uc774 \uc544\ub2c8\ub2e4. \uc11c\ubc84\uac00 \uc774\ubbf8 \ud655\uc815\ud55c \uac8c\uc784 \uc9c4\ud589 \uacb0\uacfc\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \uc720\uc9c0\ub418\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\">\uc138\uc158 \uc720\uc9c0\uc640 \ud0c0\uc784\uc544\uc6c3(Session Management and Timeout)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc138\uc158\uc774\ub780 \ubb34\uc5c7\uc778\uac00?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc138\uc158\uc740 \ud2b9\uc815 \uc0ac\uc6a9\uc790\uc758 \uc778\uc99d \uc0c1\ud0dc\ub098 \uac8c\uc784 \ucc38\uc5ec \uc0c1\ud0dc\ub97c \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \uc720\uc9c0\ud558\uae30 \uc704\ud55c \ub17c\ub9ac\uc801 \ub2e8\uc704\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WebSocket \uc5f0\uacb0\uacfc \uc138\uc158\uc740 \ub3d9\uc77c\ud55c \uac1c\ub150\uc774 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc5f0\uacb0(Connection): \uc2e4\uc81c \ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0 \uacbd\ub85c<\/li>\n\n\n\n<li>\uc138\uc158(Session): \uc0ac\uc6a9\uc790\uc758 \uc778\uc99d \ubc0f \uac8c\uc784 \ucc38\uc5ec\ub97c \ub098\ud0c0\ub0b4\ub294 \ub17c\ub9ac\uc801 \uc0c1\ud0dc<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\ub098\uc758 \uc138\uc158\uc774 \uc5f0\uacb0 \uc885\ub8cc \ud6c4\uc5d0\ub3c4 \uc77c\uc815 \uc2dc\uac04 \uc720\uc9c0\ub420 \uc218 \uc788\ub2e4. \uc774 \uad6c\uc870\uac00 \uc788\uc5b4\uc57c \ub124\ud2b8\uc6cc\ud06c\uac00 \uc77c\uc2dc\uc801\uc73c\ub85c \ub04a\uc5b4\uc84c\uc744 \ub54c \uae30\uc874 \uac8c\uc784 \ucc38\uc5ec \uc0c1\ud0dc\ub97c \ubcf5\uad6c\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud0c0\uc784\uc544\uc6c3\uc758 \uc885\ub958<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc138\uc158 \uad00\ub9ac\uc5d0\uc11c\ub294 \ubaa9\uc801\uc5d0 \ub530\ub77c \uc11c\ub85c \ub2e4\ub978 \ud0c0\uc784\uc544\uc6c3\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc5f0\uacb0 \ud0c0\uc784\uc544\uc6c3(Connection Timeout)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5f0\uacb0\uc744 \uc124\uc815\ud558\ub294 \uacfc\uc815\uc774 \uc77c\uc815 \uc2dc\uac04 \uc548\uc5d0 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc744 \ub54c \uc5f0\uacb0 \uc2dc\ub3c4\ub97c \uc911\ub2e8\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc720\ud734 \ud0c0\uc784\uc544\uc6c3(Idle Timeout)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \uc720\ud6a8\ud55c \ud65c\ub3d9\uc774 \uc5c6\uc73c\uba74 \uc5f0\uacb0\uc774\ub098 \uc138\uc158\uc744 \uc885\ub8cc\ud558\ub294 \uc815\ucc45\uc774\ub2e4. \ub2e4\ub9cc \uc2e4\uc2dc\uac04 \uac8c\uc784\uc5d0\uc11c\ub294 \uc785\ub825\uc774 \uc5c6\ub294 \ud50c\ub808\uc774\uc5b4\ub3c4 \uc815\uc0c1\uc801\uc778 \uc0ac\uc6a9\uc790\uc77c \uc218 \uc788\uc73c\ubbc0\ub85c, \ub2e8\uc21c\ud788 \uac8c\uc784 \uc785\ub825\uc774 \uc5c6\ub2e4\ub294 \uc774\uc720\ub9cc\uc73c\ub85c \uc885\ub8cc\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ud558\ud2b8\ube44\ud2b8 \ud0c0\uc784\uc544\uc6c3(Heartbeat Timeout)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uc640 \uc11c\ubc84\uac00 \uc8fc\uae30\uc801\uc73c\ub85c Ping\/Pong \ub610\ub294 \ubcc4\ub3c4\uc758 \ud558\ud2b8\ube44\ud2b8 \uba54\uc2dc\uc9c0\ub97c \uad50\ud658\ud558\uace0, \uc77c\uc815 \uc2dc\uac04 \ub3d9\uc548 \uc751\ub2f5\uc774 \uc5c6\uc73c\uba74 \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c4 \uac83\uc73c\ub85c \ud310\ub2e8\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc7ac\uc811\uc18d \uc720\uc608 \uc2dc\uac04(Reconnection Grace Period)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c4 \ub4a4 \uae30\uc874 \uac8c\uc784 \uc138\uc158\uc744 \uc720\uc9c0\ud558\ub294 \uc2dc\uac04\uc774\ub2e4. \uc774 \uc2dc\uac04\uc774 \uc9c0\ub098\uba74 \uc11c\ubc84\ub294 \ud50c\ub808\uc774\uc5b4\ub97c \ud1f4\uc7a5 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc778\uc99d \uc138\uc158 \ub9cc\ub8cc(Session Expiration)<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc778\uc99d \uc815\ubcf4\uc758 \uc720\ud6a8 \uae30\uac04\uc774 \ub9cc\ub8cc\ub418\ub294 \uc2dc\uc810\uc774\ub2e4. \uac8c\uc784 \uc5f0\uacb0\uc774 \uc0b4\uc544 \uc788\ub354\ub77c\ub3c4 \uc778\uc99d \uc815\ucc45\uc5d0 \ub530\ub77c \uc7ac\uc778\uc99d\uc774 \ud544\uc694\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud558\ud2b8\ube44\ud2b8 \uad6c\ud604 \uc608\uc2dc<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uc640 WebSocket\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \ud558\ud2b8\ube44\ud2b8\ub97c \ud1b5\ud574 \uc5f0\uacb0 \uc0c1\ud0dc\ub97c \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import WebSocket from \"ws\";\n\nconst HEARTBEAT_INTERVAL_MS = 10_000;\nconst HEARTBEAT_TIMEOUT_MS = 30_000;\n\ninterface ClientConnection {\n  ws: WebSocket;\n  lastPongAt: number;\n}\n\nfunction startHeartbeat(\n  clients: Set&lt;ClientConnection&gt;\n): NodeJS.Timeout {\n  return setInterval(() =&gt; {\n    const now = Date.now();\n\n    for (const client of clients) {\n      if (\n        now - client.lastPongAt &gt;\n        HEARTBEAT_TIMEOUT_MS\n      ) {\n        client.ws.terminate();\n        continue;\n      }\n\n      if (client.ws.readyState === WebSocket.OPEN) {\n        client.ws.ping();\n      }\n    }\n  }, HEARTBEAT_INTERVAL_MS);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>ws<\/code> \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c\ub294 Pong \uc774\ubca4\ud2b8\ub97c \ubc1b\uc544 \ub9c8\uc9c0\ub9c9 \uc751\ub2f5 \uc2dc\uac01\uc744 \uac31\uc2e0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ws.on(\"pong\", () =&gt; {\n  client.lastPongAt = Date.now();\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \ucf54\ub4dc\ub294 \ud558\ud2b8\ube44\ud2b8\uc758 \ud575\uc2ec \uc6d0\ub9ac\ub97c \ubcf4\uc5ec\uc8fc\ub294 \uc608\uc2dc\ub2e4. \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \uc5f0\uacb0 \uac1d\uccb4\uc758 \ub4f1\ub85d\uacfc \uc81c\uac70, \ud0c0\uc774\uba38 \uc815\ub9ac, \uc774\ubca4\ud2b8 \uc911\ubcf5 \uc2e4\ud589, \uc885\ub8cc \uc911\uc778 \uc11c\ubc84\uc758 \uc0c1\ud0dc \ub4f1\uc744 \ud568\uaed8 \ucc98\ub9ac\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c <code>terminate()<\/code>\ub294 \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc744 \uac15\uc81c\ub85c \uc885\ub8cc\ud558\ub294 \ub3d9\uc791\uc774\ub2e4. \uc774\uac83\ub9cc\uc73c\ub85c \uac8c\uc784 \uc138\uc158\uc744 \ud1f4\uc7a5 \ucc98\ub9ac\ud588\ub2e4\uace0 \uac04\uc8fc\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4. \uc5f0\uacb0 \uc885\ub8cc \uc774\ubca4\ud2b8\ub97c \ud1b5\ud574 \ubcc4\ub3c4\uc758 \uc138\uc158 \uc0c1\ud0dc \uc804\uc774 \ub85c\uc9c1\uc774 \uc2e4\ud589\ub418\uc5b4\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud0c0\uc784\uc544\uc6c3\uc744 \ud558\ub098\ub85c \ud1b5\ud569\ud558\uba74 \uc548 \ub418\ub294 \uc774\uc720<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \uc0c1\ud669\uc5d0 \ub3d9\uc77c\ud55c \ud0c0\uc784\uc544\uc6c3\uc744 \uc801\uc6a9\ud558\uba74 \ubd88\ud544\uc694\ud55c \uc885\ub8cc\ub098 \uc790\uc6d0 \ub0ad\ube44\uac00 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ud558\ud2b8\ube44\ud2b8 \uc751\ub2f5\uc774 \uc5c6\ub2e4\ub294 \uc774\uc720\ub85c \uac8c\uc784 \uc138\uc158\uc744 \uc989\uc2dc \uc0ad\uc81c\ud558\uba74, \uc77c\uc2dc\uc801\uc778 \ub124\ud2b8\uc6cc\ud06c \uc7a5\uc560\uac00 \ubc1c\uc0dd\ud588\uc744 \ub54c \uc7ac\uc811\uc18d \uae30\ud68c\ub97c \uc783\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ub300\ub85c \uc7ac\uc811\uc18d \uc720\uc608 \uc2dc\uac04\uc744 \uc9c0\ub098\uce58\uac8c \uae38\uac8c \uc124\uc815\ud558\uba74 \uc2e4\uc81c\ub85c \uc774\ud0c8\ud55c \ud50c\ub808\uc774\uc5b4\uc758 \uc790\ub9ac\uac00 \uc624\ub7ab\ub3d9\uc548 \uc810\uc720\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc5f0\uacb0 \uac10\uc9c0 \ud0c0\uc784\uc544\uc6c3\uacfc \uac8c\uc784 \uc138\uc158 \uc720\uc9c0 \uc2dc\uac04\uc744 \ubd84\ub9ac\ud558\uace0, \uac8c\uc784 \uc7a5\ub974\uc640 \uc11c\ubc84 \uc815\ucc45\uc5d0 \ub9de\ucdb0 \uac01\uac01 \uc124\uc815\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\">\uc911\ubcf5 \uc138\uc158 \ubc29\uc9c0(Duplicate Session Prevention)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\uc911\ubcf5 \uc138\uc158\uc774 \ubc1c\uc0dd\ud558\ub294 \uc6d0\uc778<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\ubcf5 \uc138\uc158\uc740 \ub3d9\uc77c\ud55c \uc0ac\uc6a9\uc790\uac00 \uc5ec\ub7ec \uc5f0\uacb0\uc744 \ud1b5\ud574 \ub3d9\uc2dc\uc5d0 \uac8c\uc784 \uc11c\ubc84\uc5d0 \uc811\uc18d\ud558\uac70\ub098, \uc7ac\uc811\uc18d \uacfc\uc815\uc5d0\uc11c \uae30\uc874 \uc5f0\uacb0\uacfc \uc0c8 \uc5f0\uacb0\uc774 \ub3d9\uc2dc\uc5d0 \uc0b4\uc544 \uc788\ub294 \uc0c1\ud0dc\ub97c \uc758\ubbf8\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 \uc6d0\uc778\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ub3d9\uc77c \uacc4\uc815\uc73c\ub85c \uc5ec\ub7ec \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \ub85c\uadf8\uc778\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ub124\ud2b8\uc6cc\ud06c\uac00 \ub04a\uc5b4\uc9c4 \ub4a4 \uc7ac\uc811\uc18d\uc744 \uc2dc\ub3c4\ud588\uc9c0\ub9cc \uae30\uc874 \uc5f0\uacb0\uc774 \uc544\uc9c1 \uc815\ub9ac\ub418\uc9c0 \uc54a\uc558\ub2e4.<\/li>\n\n\n\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc7ac\uc811\uc18d \uc694\uccad\uc744 \uc5ec\ub7ec \ubc88 \uc804\uc1a1\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc11c\ubc84\uac00 \uc5f0\uacb0 \uc885\ub8cc \uc774\ubca4\ud2b8\ub97c \ucc98\ub9ac\ud558\uae30 \uc804\uc5d0 \uc0c8\ub85c\uc6b4 \uc5f0\uacb0\uc774 \ub4f1\ub85d\ub41c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\ubcf5 \uc138\uc158\uc744 \ubc29\uce58\ud558\uba74 \ub3d9\uc77c \uacc4\uc815\uc774 \uc5ec\ub7ec \ubc88 \uac8c\uc784 \uba85\ub839\uc744 \uc804\uc1a1\ud558\uac70\ub098, \ud55c \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc\uac00 \uc11c\ub85c \ub2e4\ub978 \uc5f0\uacb0\uc5d0\uc11c \uac31\uc2e0\ub418\ub294 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub2e8\uc77c \uc138\uc158 \uc815\ucc45<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ub3d9\uc77c \uacc4\uc815\uc5d0 \ud558\ub098\uc758 \ud65c\uc131 \uc138\uc158\ub9cc \ud5c8\uc6a9\ud558\ub824\uba74 \uacc4\uc815 \uc2dd\ubcc4\uc790\ub97c \uae30\uc900\uc73c\ub85c \ud604\uc7ac \uc138\uc158\uc744 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const activeSessions = new Map&lt;\n  string,\n  WebSocket\n&gt;();\n\nfunction registerSession(\n  playerId: string,\n  ws: WebSocket\n): void {\n  const existing = activeSessions.get(playerId);\n\n  if (existing &amp;&amp; existing !== ws) {\n    existing.close(4001, \"Replaced by new session\");\n  }\n\n  activeSessions.set(playerId, ws);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704 \uc608\uc2dc\ub294 \ub2e8\uc77c Node.js \ud504\ub85c\uc138\uc2a4 \uc548\uc5d0\uc11c \uc911\ubcf5 \uc5f0\uacb0\uc744 \ucc98\ub9ac\ud558\ub294 \uae30\ubcf8\uc801\uc778 \uad6c\uc870\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc774\uac83\ub9cc\uc73c\ub85c \uc644\uc804\ud55c \uc911\ubcf5 \uc138\uc158 \ubc29\uc9c0\uac00 \ubcf4\uc7a5\ub418\uc9c0\ub294 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uae30\uc874 \uc5f0\uacb0\uc774 \uc885\ub8cc\ub418\ub294 \uacfc\uc815\uc5d0\uc11c <code>close<\/code> \uc774\ubca4\ud2b8\uac00 \ub2a6\uac8c \ub3c4\ucc29\ud560 \uc218 \uc788\ub2e4. \uc774\ub54c \uae30\uc874 \uc5f0\uacb0\uc758 \uc885\ub8cc \ud578\ub4e4\ub7ec\uac00 <code>activeSessions.delete(playerId)<\/code>\ub97c \ubb34\uc870\uac74 \uc2e4\ud589\ud558\uba74 \uc0c8 \uc5f0\uacb0\uae4c\uc9c0 \ub4f1\ub85d\ub41c \uc0c1\ud0dc\uc5d0\uc11c \uc138\uc158 \uc815\ubcf4\uac00 \uc0ad\uc81c\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc81c\uac70\ud560 \ub54c\ub294 \ud604\uc7ac \ub4f1\ub85d\ub41c \uc5f0\uacb0\uc774 \uc2e4\uc81c\ub85c \uc790\uc2e0\uc778\uc9c0 \ud655\uc778\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function unregisterSession(\n  playerId: string,\n  ws: WebSocket\n): void {\n  if (activeSessions.get(playerId) === ws) {\n    activeSessions.delete(playerId);\n  }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ucc98\ub7fc \uc138\uc158\uc744 \ub4f1\ub85d\ud55c \uc5f0\uacb0\uacfc \uc81c\uac70\ub97c \uc694\uccad\ud55c \uc5f0\uacb0\uc774 \ub3d9\uc77c\ud55c\uc9c0 \uac80\uc99d\ud558\uba74 \uc624\ub798\ub41c \uc5f0\uacb0\uc774 \uc0c8 \uc5f0\uacb0\uc758 \uc0c1\ud0dc\ub97c \ud6fc\uc190\ud558\ub294 \ubb38\uc81c\ub97c \ubc29\uc9c0\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ubd84\uc0b0 \uc11c\ubc84\uc5d0\uc11c\uc758 \uc911\ubcf5 \uc138\uc158 \ubc29\uc9c0<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uac00 \uc5ec\ub7ec \uc778\uc2a4\ud134\uc2a4\ub85c \uc6b4\uc601\ub41c\ub2e4\uba74 <code>Map<\/code>\ub9cc\uc73c\ub85c\ub294 \ucda9\ubd84\ud558\uc9c0 \uc54a\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc11c\ubc84 A\uc640 \uc11c\ubc84 B\uac00 \uac01\uac01 \uac19\uc740 \uc0ac\uc6a9\uc790\uc758 \uc5f0\uacb0\uc744 \uad00\ub9ac\ud558\uba74 \ub450 \uc11c\ubc84 \ubaa8\ub450 \ud574\ub2f9 \uc0ac\uc6a9\uc790\ub97c \ud65c\uc131 \uc0c1\ud0dc\ub85c \ud310\ub2e8\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub54c Redis\uc640 \uac19\uc740 \uacf5\uc720 \uc800\uc7a5\uc18c\ub97c \uc774\uc6a9\ud574 \uc138\uc158 \uc18c\uc720\uad8c\uc744 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ub150\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc740 \uc815\ubcf4\ub97c \uc800\uc7a5\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>session:{playerId}\n    ownerServerId\n    connectionId\n    generation\n    expiresAt<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c <code>generation<\/code>\uc740 \uc0c8\ub85c\uc6b4 \uc138\uc158 \uc18c\uc720\uad8c\uc774 \ubd80\uc5ec\ub420 \ub54c \uc99d\uac00\ud558\ub294 \uc138\ub300 \ubc88\ud638\ub2e4. \uc774\uc804 \uc5f0\uacb0\uc5d0\uc11c \ub2a6\uac8c \ub3c4\ucc29\ud55c \uc791\uc5c5\uc774 \uc0c8\ub85c\uc6b4 \uc138\uc158\uc758 \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \uac80\uc99d\ud558\ub294 \ub370 \ud65c\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e8, Redis\uc5d0 \ub2e8\uc21c\ud788 \uac12\uc744 \uae30\ub85d\ud558\ub294 \uac83\ub9cc\uc73c\ub85c \uc6d0\uc790\uc131\uc774 \uc790\ub3d9 \ubcf4\uc7a5\ub418\uc9c0\ub294 \uc54a\ub294\ub2e4. \uc5ec\ub7ec \uc11c\ubc84\uac00 \ub3d9\uc2dc\uc5d0 \uc138\uc158\uc744 \ub4f1\ub85d\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \uc870\uac74\ubd80 \uac31\uc2e0, \uc6d0\uc790\uc801 \uc2a4\ud06c\ub9bd\ud2b8 \ub610\ub294 \uc801\uc808\ud55c \uc7a0\uae08 \uc804\ub7b5\uc744 \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c \uc5f0\uacb0\uc774 \ub04a\uae34 \uc11c\ubc84\uc758 \uc138\uc158 \uc815\ubcf4\uac00 \uc601\uad6c\ud788 \ub0a8\uc9c0 \uc54a\ub3c4\ub85d \ub9cc\ub8cc \uc2dc\uac04\uc744 \uc124\uc815\ud558\uace0, \ud558\ud2b8\ube44\ud2b8\ub098 \uc784\ub300(Lease) \uac31\uc2e0\uc744 \ud1b5\ud574 \uc18c\uc720\uad8c\uc744 \uad00\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc911\ubcf5 \uc138\uc158 \uc815\ucc45\uc740 \uc11c\ube44\uc2a4\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c4\ub2e4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\ubaa8\ub4e0 \uac8c\uc784\uc774 \ubc18\ub4dc\uc2dc \uae30\uc874 \uc5f0\uacb0\uc744 \uc885\ub8cc\ud574\uc57c \ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uacbd\uc7c1 \uac8c\uc784: \uacc4\uc815\ub2f9 \ub2e8\uc77c \ud65c\uc131 \uc138\uc158\uc744 \uac15\uc81c\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\ud611\ub3d9 \uac8c\uc784: \uacc4\uc815\ub2f9 \ub2e8\uc77c \uc138\uc158\uc744 \uc720\uc9c0\ud558\ub418 \uc7ac\uc811\uc18d\uc744 \ud5c8\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/li>\n\n\n\n<li>\uc5ec\ub7ec \uae30\uae30 \uc9c0\uc6d0 \uc11c\ube44\uc2a4: \uc778\uc99d \uc138\uc158\uc740 \uc5ec\ub7ec \uac1c \ud5c8\uc6a9\ud558\ub418 \ud2b9\uc815 \uac8c\uc784 \ub9e4\uce58\uc5d0\ub294 \ud558\ub098\ub9cc \ucc38\uc5ec\ud558\ub3c4\ub85d \uc81c\ud55c\ud560 \uc218 \uc788\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c \uc778\uc99d \uc138\uc158, \uac8c\uc784 \uc5f0\uacb0, \ub9e4\uce58 \ucc38\uc5ec\ub97c \uad6c\ubd84\ud574 \uc911\ubcf5 \ud5c8\uc6a9 \ubc94\uc704\ub97c \uc124\uacc4\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\">Graceful Shutdown<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Graceful Shutdown\uc774\ub780?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Graceful Shutdown\uc740 \uc11c\ubc84\ub97c \uc885\ub8cc\ud560 \ub54c \uc9c4\ud589 \uc911\uc778 \uc791\uc5c5\uacfc \uc5f0\uacb0\uc744 \uac00\ub2a5\ud55c \ud55c \uc548\uc804\ud558\uac8c \uc815\ub9ac\ud558\ub294 \uc808\ucc28\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \ud504\ub85c\uc138\uc2a4\ub97c \uc989\uc2dc \uc885\ub8cc\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\uc9c4\ud589 \uc911\uc778 \uc694\uccad\uc774 \ucc98\ub9ac\ub418\uc9c0 \ubabb\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uac8c\uc784 \uc0c1\ud0dc\uac00 \uc800\uc7a5\ub418\uae30 \uc804\uc5d0 \ud504\ub85c\uc138\uc2a4\uac00 \uc885\ub8cc\ub41c\ub2e4.<\/li>\n\n\n\n<li>WebSocket \uc5f0\uacb0\uc774 \uc608\uace0 \uc5c6\uc774 \ub04a\uc5b4\uc9c4\ub2e4.<\/li>\n\n\n\n<li>\uc138\uc158 \uc18c\uc720\uad8c\uc774\ub098 \ub9e4\uce58 \uc0c1\ud0dc\uac00 \uc798\ubabb \uc720\uc9c0\ub41c\ub2e4.<\/li>\n\n\n\n<li>\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc11c\ubc84 \uc7a5\uc560\uc640 \uc815\uc0c1\uc801\uc778 \uc11c\ubc84 \uc885\ub8cc\ub97c \uad6c\ubd84\ud558\uae30 \uc5b4\ub835\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\ud788 \ucee8\ud14c\uc774\ub108 \ud658\uacbd\uc5d0\uc11c \ubc30\ud3ec\ud558\uac70\ub098 \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4\ub97c \uad50\uccb4\ud560 \ub54c Graceful Shutdown\uc740 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\uc77c\ubc18\uc801\uc778 \uc885\ub8cc \uc808\ucc28<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>SIGTERM \/ SIGINT \uc218\uc2e0\n        |\n        v\n\uc11c\ubc84\ub97c \uc885\ub8cc \uc0c1\ud0dc\ub85c \uc804\ud658\n        |\n        v\n\uc2e0\uaddc \uc5f0\uacb0 \ubc0f \ub9e4\uce6d \uc694\uccad \ucc28\ub2e8\n        |\n        v\n\uae30\uc874 \uc5f0\uacb0\uc5d0 \uc11c\ubc84 \uc885\ub8cc \uc548\ub0b4\n        |\n        v\n\uc9c4\ud589 \uc911\uc778 \uc791\uc5c5 \uc815\ub9ac \ubc0f \uc0c1\ud0dc \uc800\uc7a5\n        |\n        v\nWebSocket \uc5f0\uacb0 \uc885\ub8cc\n        |\n        v\nDB \/ Redis \/ \uae30\ud0c0 \uc790\uc6d0 \uc815\ub9ac\n        |\n        v\n\ud504\ub85c\uc138\uc2a4 \uc885\ub8cc<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc885\ub8cc \uc21c\uc11c\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 \uc2e0\uaddc \uc791\uc5c5\uc744 \uba3c\uc800 \ucc28\ub2e8\ud558\uace0, \uc774\ubbf8 \uc9c4\ud589 \uc911\uc778 \uc791\uc5c5\uc744 \uc815\ub9ac\ud55c \ub4a4 \uc790\uc6d0\uc744 \ud574\uc81c\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac8c\uc784 \uc11c\ubc84\ub77c\uba74 \uc885\ub8cc \uc2dc\uc810\uc5d0 \ubaa8\ub4e0 \uac8c\uc784\uc744 \ubb34\uc870\uac74 \uc800\uc7a5\ud558\uace0 \ub05d\ub0b4\ub294 \uac83\uc774 \ud56d\uc0c1 \ucd5c\uc120\uc740 \uc544\ub2c8\ub2e4. \uac8c\uc784\uc758 \uc77c\uad00\uc131 \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub530\ub77c \ub9e4\uce58\ub97c \uc911\ub2e8\ud558\uac70\ub098, \ub2e4\ub978 \uc11c\ubc84\ub85c \uc774\uc804\ud558\uac70\ub098, \uc9c4\ud589 \uc0c1\ud0dc\ub97c \uc800\uc7a5\ud558\uace0 \uc7ac\uc811\uc18d\uc744 \ud5c8\uc6a9\ud558\ub294 \ub4f1\uc758 \uc815\ucc45\uc744 \uc120\ud0dd\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Node.js \uc11c\ubc84 \uc885\ub8cc \uc608\uc2dc<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import http from \"node:http\";\nimport { WebSocketServer } from \"ws\";\n\nconst server = http.createServer();\nconst wss = new WebSocketServer({ server });\n\nlet shuttingDown = false;\n\nserver.listen(3000);\n\nasync function shutdown(): Promise&lt;void&gt; {\n  if (shuttingDown) return;\n  shuttingDown = true;\n\n  \/\/ 1. \uc2e0\uaddc \uc5f0\uacb0 \ubc0f \ub9e4\uce6d \uc694\uccad\uc744 \ucc28\ub2e8\ud55c\ub2e4.\n  \/\/ \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 readiness \uc0c1\ud0dc\ub97c false\ub85c \ubcc0\uacbd\ud55c\ub2e4.\n\n  \/\/ 2. \uc9c4\ud589 \uc911\uc778 \uac8c\uc784 \uc791\uc5c5\uc744 \uc815\ub9ac\ud55c\ub2e4.\n  \/\/ \uc2e4\uc81c \uad6c\ud604\uc5d0\uc11c\ub294 \uac8c\uc784\ubcc4 \uc815\ucc45\uc5d0 \ub530\ub77c \uc0c1\ud0dc\ub97c \uc800\uc7a5\ud55c\ub2e4.\n\n  \/\/ 3. \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc885\ub8cc\ub97c \uc54c\ub9b0\ub2e4.\n  for (const ws of wss.clients) {\n    if (ws.readyState === ws.OPEN) {\n      ws.send(JSON.stringify({\n        type: \"SERVER_SHUTDOWN\",\n        message: \"Server is shutting down\"\n      }));\n    }\n  }\n\n  \/\/ 4. WebSocket \uc11c\ubc84\uc758 \uc5f0\uacb0\uc744 \uc885\ub8cc\ud55c\ub2e4.\n  wss.close();\n\n  for (const ws of wss.clients) {\n    ws.close(1001, \"Server shutting down\");\n  }\n\n  \/\/ 5. HTTP \uc11c\ubc84\uc758 \uc2e0\uaddc \uc5f0\uacb0 \uc218\ub77d\uc744 \uc911\ub2e8\ud55c\ub2e4.\n  server.close();\n\n  \/\/ 6. DB, Redis \ub4f1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc790\uc6d0\uc744 \uc815\ub9ac\ud55c\ub2e4.\n  \/\/ await database.close();\n  \/\/ await redis.quit();\n}\n\nprocess.on(\"SIGTERM\", () =&gt; {\n  void shutdown();\n});\n\nprocess.on(\"SIGINT\", () =&gt; {\n  void shutdown();\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ucf54\ub4dc\ub294 \uc885\ub8cc \uc808\ucc28\ub97c \uc124\uba85\ud558\uae30 \uc704\ud55c \uae30\ubcf8 \uc608\uc2dc\ub2e4. \uc6b4\uc601 \ud658\uacbd\uc5d0 \uc801\uc6a9\ud558\ub824\uba74 \ucd94\uac00\uc801\uc778 \ucc98\ub9ac\uac00 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>wss.close()<\/code>\uc640 <code>server.close()<\/code>\uc758 \uc644\ub8cc \ucf5c\ubc31 \ub610\ub294 Promise\ub97c \uae30\ub2e4\ub9b0\ub2e4.<\/li>\n\n\n\n<li>\uc885\ub8cc \uc548\ub0b4 \uba54\uc2dc\uc9c0\uac00 \uc804\uc1a1\ub418\uae30 \uc804\uc5d0 \uc5f0\uacb0\uc744 \ub2eb\uc9c0 \uc54a\ub3c4\ub85d \ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc885\ub8cc \uc81c\ud55c \uc2dc\uac04\uc744 \uc124\uc815\ud558\uace0, \uc81c\ud55c \uc2dc\uac04 \ub0b4\uc5d0 \uc815\ub9ac\ub418\uc9c0 \uc54a\uc740 \uc5f0\uacb0\uc740 \uac15\uc81c\ub85c \uc885\ub8cc\ud55c\ub2e4.<\/li>\n\n\n\n<li>\uc911\ubcf5\ub41c \uc885\ub8cc \uc2e0\ud638\uac00 \ubc1c\uc0dd\ud574\ub3c4 \uc815\ub9ac \uc791\uc5c5\uc774 \ud55c \ubc88\ub9cc \uc2e4\ud589\ub418\ub3c4\ub85d \ud55c\ub2e4.<\/li>\n\n\n\n<li>\ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 Redis\uc758 \uc5f0\uacb0\uc744 \uc2e4\uc81c\ub85c \ud574\uc81c\ud558\uace0, \uc2e4\ud328 \uc2dc \uc815\ucc45\uc744 \uc801\uc6a9\ud55c\ub2e4.<\/li>\n\n\n\n<li>\ucee8\ud14c\uc774\ub108\ub098 \ud504\ub85c\uc138\uc2a4 \uad00\ub9ac\uc790\uac00 \uc9c0\uc815\ud55c \uc885\ub8cc \uc720\uc608 \uc2dc\uac04 \uc548\uc5d0 \uc791\uc5c5\uc744 \ub9c8\uce5c\ub2e4.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c <code>close()<\/code>\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \uc815\uc0c1\uc801\uc778 WebSocket \uc885\ub8cc \uc808\ucc28\ub97c \uc2dc\uc791\ud558\uc9c0\ub9cc, \uc0c1\ub300\ubc29\uc758 \uc751\ub2f5\uc774 \uc5c6\uc73c\uba74 \uc5f0\uacb0\uc774 \uacc4\uc18d \ub0a8\uc744 \uc218 \uc788\ub2e4. \ub530\ub77c\uc11c \uc77c\uc815 \uc2dc\uac04 \ud6c4 <code>terminate()<\/code>\ub85c \uac15\uc81c \uc885\ub8cc\ud558\ub294 \ubcf4\uc870 \uc808\ucc28\uac00 \ud544\uc694\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ub85c\ub4dc \ubc38\ub7f0\uc11c\uc640\uc758 \uc5f0\uacc4<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\ub7ec \uc11c\ubc84 \uc778\uc2a4\ud134\uc2a4\ub97c \uc6b4\uc601\ud55c\ub2e4\uba74 Graceful Shutdown\uc740 \ub85c\ub4dc \ubc38\ub7f0\uc11c\uc640\ub3c4 \uc5f0\uacc4\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub97c \uc885\ub8cc\ud558\uae30 \uc804\uc5d0 \uc2e0\uaddc \ud2b8\ub798\ud53d\uc744 \ubc1b\uc9c0 \uc54a\ub3c4\ub85d readiness \uc0c1\ud0dc\ub97c \ubcc0\uacbd\ud558\uace0, \ub85c\ub4dc \ubc38\ub7f0\uc11c\uac00 \ud574\ub2f9 \uc11c\ubc84\ub85c \uc2e0\uaddc \uc694\uccad\uc744 \ubcf4\ub0b4\uc9c0 \uc54a\ub3c4\ub85d \ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \ub85c\ub4dc \ubc38\ub7f0\uc11c\uc5d0\uc11c \uc11c\ubc84\ub97c \uc81c\uc678\ud588\ub2e4\uace0 \ud574\uc11c \uae30\uc874 WebSocket \uc5f0\uacb0\uc774 \uc790\ub3d9\uc73c\ub85c \uc885\ub8cc\ub418\uac70\ub098 \ub2e4\ub978 \uc11c\ubc84\ub85c \uc774\ub3d9\ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4. \uae30\uc874 \uc5f0\uacb0\uc758 \ucc98\ub9ac \ubc29\uc2dd\uc740 \ubcc4\ub3c4\ub85c \uc124\uacc4\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud544\uc694\ud558\ub2e4\uba74 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc7ac\uc811\uc18d \uc548\ub0b4\ub97c \uc804\uc1a1\ud558\uace0, \uc7ac\uc811\uc18d \uc2dc \uc0c8\ub85c\uc6b4 \uc11c\ubc84\uc5d0\uc11c \uae30\uc874 \uac8c\uc784 \uc0c1\ud0dc\ub97c \ubcf5\uad6c\ud558\ub3c4\ub85d \uad6c\uc131\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\">\uc5f0\uacb0 \ubc0f \uc138\uc158 \uad00\ub9ac\uc5d0\uc11c \uace0\ub824\ud574\uc57c \ud560 \ubcf4\uc548 \ubb38\uc81c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc138\uc158 \uad00\ub9ac\uc5d0\ub294 \uc0ac\uc6a9\uc790 \uc778\uc99d\ubfd0 \uc544\ub2c8\ub77c \uc5f0\uacb0 \uc18c\uc720\uad8c\uacfc \uc0c1\ud0dc \ubcc0\uacbd \uad8c\ud55c\ub3c4 \ud3ec\ud568\ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc7ac\uc811\uc18d \ud1a0\ud070 \ud0c8\ucde8<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc7ac\uc811\uc18d \ud1a0\ud070\uc774 \uc720\ucd9c\ub418\uba74 \uacf5\uaca9\uc790\uac00 \ub2e4\ub978 \uc0ac\uc6a9\uc790\uc758 \uc138\uc158\uc744 \ud0c8\ucde8\ud560 \uc218 \uc788\ub2e4. \ud1a0\ud070\uc758 \ucda9\ubd84\ud55c \ubb34\uc791\uc704\uc131, \uc548\uc804\ud55c \uc804\uc1a1, \ub9cc\ub8cc, \uc7ac\uc0ac\uc6a9 \uc81c\ud55c\uc744 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc138\uc158 \uace0\uc815 \ubc0f \uc138\uc158 \ud0c8\ucde8<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc778\uc99d \uc804\ud6c4\uc5d0 \uc138\uc158 \uc2dd\ubcc4\uc790\ub97c \uc801\uc808\ud788 \uac31\uc2e0\ud558\uace0, \uc138\uc158 \uc18c\uc720\uad8c\uc744 \uc11c\ubc84\uc5d0\uc11c \uac80\uc99d\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc911\ubcf5 \uc694\uccad \ubc0f \uc7ac\uc0dd \uacf5\uaca9<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc7ac\uc811\uc18d \uc694\uccad\uc774\ub098 \uac8c\uc784 \uba85\ub839\uc774 \ubc18\ubcf5\ub418\uc5b4\ub3c4 \uac19\uc740 \uc791\uc5c5\uc774 \uc911\ubcf5 \uc2e4\ud589\ub418\uc9c0 \uc54a\ub3c4\ub85d \uc694\uccad \uc2dd\ubcc4\uc790, \uc21c\uc11c \ubc88\ud638, \uba71\ub4f1\uc131 \uc815\ucc45 \ub4f1\uc744 \uc801\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uad8c\ud55c \uac80\uc99d<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc804\ub2ec\ud55c <code>playerId<\/code>\ub098 <code>roomId<\/code>\ub9cc\uc73c\ub85c \ubcf5\uad6c \ub300\uc0c1 \uc138\uc158\uc744 \uacb0\uc815\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4. \uc778\uc99d\ub41c \uc0ac\uc6a9\uc790\uc640 \uc138\uc158\uc758 \uc18c\uc720\uad8c\uc774 \uc77c\uce58\ud558\ub294\uc9c0 \uc11c\ubc84\uc5d0\uc11c \ud655\uc778\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc11c\ube44\uc2a4 \uac70\ubd80 \uacf5\uaca9<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc9e7\uc740 \uc2dc\uac04\uc5d0 \ub300\ub7c9\uc758 \uc5f0\uacb0\uc774\ub098 \uc7ac\uc811\uc18d \uc694\uccad\uc774 \ubc1c\uc0dd\ud560 \uc218 \uc788\uc73c\ubbc0\ub85c \uc5f0\uacb0 \uc218 \uc81c\ud55c, \uc694\uccad \ube48\ub3c4 \uc81c\ud55c, \uc778\uc99d \uc804 \uc5f0\uacb0 \uc81c\ud55c \ub4f1\uc758 \ubc29\uc5b4\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 \uc124\uacc4 \uccb4\ud06c\ub9ac\uc2a4\ud2b8<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>\ud56d\ubaa9<\/th><th>\ud655\uc778\ud560 \uc0ac\ud56d<\/th><\/tr><tr><td>\uc5f0\uacb0 \uc885\ub8cc<\/td><td>\uc5f0\uacb0 \uc885\ub8cc\uc640 \uac8c\uc784 \ud1f4\uc7a5\uc744 \uad6c\ubd84\ud588\ub294\uac00?<\/td><\/tr><tr><td>\uc0c1\ud0dc \uba38\uc2e0<\/td><td>\uc0c1\ud0dc \uc804\uc774\uc640 \uc911\ubcf5 \uc2e4\ud589 \ubc29\uc9c0 \uaddc\uce59\uc774 \uc788\ub294\uac00?<\/td><\/tr><tr><td>\uc7ac\uc811\uc18d<\/td><td>\uae30\uc874 \ud50c\ub808\uc774\uc5b4\ub97c \uc548\uc804\ud558\uac8c \uc2dd\ubcc4\ud560 \uc218 \uc788\ub294\uac00?<\/td><\/tr><tr><td>\uc0c1\ud0dc \ubcf5\uad6c<\/td><td>\uc11c\ubc84 \uad8c\ud55c \uc0c1\ud0dc\ub97c \uae30\uc900\uc73c\ub85c \ubcf5\uad6c\ud558\ub294\uac00?<\/td><\/tr><tr><td>\ud0c0\uc784\uc544\uc6c3<\/td><td>\uc5f0\uacb0 \uac10\uc9c0\uc640 \uc7ac\uc811\uc18d \uc720\uc608 \uc2dc\uac04\uc744 \ubd84\ub9ac\ud588\ub294\uac00?<\/td><\/tr><tr><td>\ud558\ud2b8\ube44\ud2b8<\/td><td>\uc751\ub2f5\uc774 \uc5c6\ub294 \uc5f0\uacb0\uc744 \ud0d0\uc9c0\ud560 \uc218 \uc788\ub294\uac00?<\/td><\/tr><tr><td>\uc911\ubcf5 \uc138\uc158<\/td><td>\ub3d9\uc77c \uacc4\uc815\uc758 \uc5f0\uacb0 \uc815\ucc45\uc774 \uba85\ud655\ud55c\uac00?<\/td><\/tr><tr><td>\ubd84\uc0b0 \ud658\uacbd<\/td><td>\uc5ec\ub7ec \uc11c\ubc84\uc5d0\uc11c \uc138\uc158 \uc18c\uc720\uad8c\uc744 \uc77c\uad00\ub418\uac8c \uad00\ub9ac\ud558\ub294\uac00?<\/td><\/tr><tr><td>Graceful Shutdown<\/td><td>\uc2e0\uaddc \uc791\uc5c5 \ucc28\ub2e8\ubd80\ud130 \uc790\uc6d0 \ud574\uc81c\uae4c\uc9c0 \uc21c\uc11c\uac00 \uc815\uc758\ub418\uc5b4 \uc788\ub294\uac00?<\/td><\/tr><tr><td>\ubcf4\uc548<\/td><td>\uc7ac\uc811\uc18d \ud1a0\ud070, \uad8c\ud55c \uac80\uc99d, \uc694\uccad \uc7ac\uc0dd \ubc29\uc5b4\uac00 \uc801\uc6a9\ub418\uc5b4 \uc788\ub294\uac00?<\/td><\/tr><tr><td>\uad00\uce21 \uac00\ub2a5\uc131<\/td><td>\uc5f0\uacb0 \uc218, \uc7ac\uc811\uc18d \uc131\uacf5\ub960, \uc138\uc158 \ub9cc\ub8cc \uc218, \uc885\ub8cc \uc2dc\uac04 \ub4f1\uc744 \uae30\ub85d\ud558\ub294\uac00?<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\uc2e4\uc2dc\uac04 \uba40\ud2f0\ud50c\ub808\uc774 \uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c \uc5f0\uacb0 \ubc0f \uc138\uc158 \uad00\ub9ac\ub294 \ub2e8\uc21c\ud788 \ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc811\uc18d \uc5ec\ubd80\ub97c \ud655\uc778\ud558\ub294 \uc791\uc5c5\uc774 \uc544\ub2c8\ub2e4. \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c4 \ud50c\ub808\uc774\uc5b4\ub97c \uc5b4\ub5bb\uac8c \ucc98\ub9ac\ud560 \uac83\uc778\uc9c0, \uc7ac\uc811\uc18d\ud55c \ud50c\ub808\uc774\uc5b4\uc758 \uc0c1\ud0dc\ub97c \uc5b4\ub5bb\uac8c \ubcf5\uad6c\ud560 \uac83\uc778\uc9c0, \uc11c\ubc84 \uc885\ub8cc \uc2dc \uc9c4\ud589 \uc911\uc778 \uac8c\uc784\uc744 \uc5b4\ub5bb\uac8c \uc548\uc804\ud558\uac8c \uc815\ub9ac\ud560 \uac83\uc778\uc9c0\uae4c\uc9c0 \ud3ec\ud568\ud558\ub294 \uc11c\ubc84 \uc124\uacc4\uc758 \ud575\uc2ec \uc601\uc5ed\uc774\ub2e4. \ud2b9\ud788 WebSocket \uae30\ubc18 \uac8c\uc784 \uc11c\ubc84\uc5d0\uc11c\ub294 \ub124\ud2b8\uc6cc\ud06c \uc5f0\uacb0\uc774 \ub04a\uc5b4\uc9c0\ub294 \uc0c1\ud669\uc774 \uc5b8\uc81c\ub4e0\uc9c0 \ubc1c\uc0dd\ud560 \uc218 [&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-2641","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\/2641","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=2641"}],"version-history":[{"count":1,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2641\/revisions"}],"predecessor-version":[{"id":2642,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/2641\/revisions\/2642"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}