{"id":1681,"date":"2026-04-30T15:16:54","date_gmt":"2026-04-30T15:16:54","guid":{"rendered":"https:\/\/wayhope.kro.kr\/?p=1681"},"modified":"2026-08-31T07:32:41","modified_gmt":"2026-08-31T07:32:41","slug":"node-js-%ec%84%9c%eb%b2%84-%ea%b0%9c%eb%b0%9c-%ed%95%b5%ec%8b%ac-%ec%a0%95%eb%a6%ac","status":"publish","type":"post","link":"https:\/\/wayhope.kro.kr\/?p=1681","title":{"rendered":"Node.js REST API \uc11c\ubc84 \uac1c\ubc1c \ud575\uc2ec \uc815\ub9ac"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Node.js REST API \uc11c\ubc84 \uac1c\ubc1c \ud575\uc2ec \uc815\ub9ac<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\ub294 JavaScript\ub97c \ube0c\ub77c\uc6b0\uc800 \ubc16\uc5d0\uc11c \uc2e4\ud589\ud560 \uc218 \uc788\uac8c \ud574\uc8fc\ub294 \ub7f0\ud0c0\uc784\uc774\ub2e4. Chrome\uc758 V8 JavaScript \uc5d4\uc9c4\uc744 \uae30\ubc18\uc73c\ub85c \ub3d9\uc791\ud558\uba70, \uc11c\ubc84 \uac1c\ubc1c\uc5d0\uc11c\ub294 HTTP \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uace0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \ud1b5\uc2e0\ud558\ub294 API \uc11c\ubc84\ub97c \ub9cc\ub4dc\ub294 \uc6a9\ub3c4\ub85c \ub9ce\uc774 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js \uc790\uccb4\uac00 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc778 \uac83\uc740 \uc544\ub2c8\ub2e4. HTTP \uc11c\ubc84\ub97c \uc9c1\uc811 \ub9cc\ub4e4 \uc218 \uc788\ub294 <code>http<\/code> \ubaa8\ub4c8\uc744 \uc81c\uacf5\ud558\uace0, Express \uac19\uc740 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \ucd94\uac00\ud574\uc11c \ub77c\uc6b0\ud305, \ubbf8\ub4e4\uc6e8\uc5b4, \uc694\uccad \ucc98\ub9ac \ub4f1\uc744 \ud3b8\ud558\uac8c \uad6c\uc131\ud558\ub294 \ubc29\uc2dd\uc774 \uc77c\ubc18\uc801\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">REST API \uc11c\ubc84\uc758 \uc804\uccb4\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; HTTP Request -&gt; Node.js -&gt; Express -&gt; Middleware -&gt; Router -&gt; Controller -&gt; Service -&gt; Repository -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc751\ub2f5\uc740 \ubc18\ub300 \ubc29\ud5a5\uc73c\ub85c \uc804\ub2ec\ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Database -&gt; Repository -&gt; Service -&gt; Controller -&gt; HTTP Response -&gt; Client\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uc5d0\uc11c \uc11c\ubc84 \uac1c\ubc1c\uc744 \uc774\ud574\ud558\ub824\uba74 <code>HTTP<\/code>, <code>Routing<\/code>, <code>Middleware<\/code>, <code>Controller<\/code>, <code>Service<\/code>, <code>Database<\/code>, <code>Authentication<\/code>\uc774 \uc5b4\ub5a4 \uad00\uacc4\ub85c \uc5f0\uacb0\ub418\ub294\uc9c0\ub97c \ubcf4\ub294 \uac83\uc774 \uc911\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\">Node.js\uc640 Express<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\ub294 JavaScript \ucf54\ub4dc\ub97c \uc11c\ubc84\uc5d0\uc11c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \ub7f0\ud0c0\uc784\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ube0c\ub77c\uc6b0\uc800\uc5d0\uc11c\ub294 JavaScript\uac00 \uc8fc\ub85c DOM \uc870\uc791\uc774\ub098 \uc0ac\uc6a9\uc790 \uc785\ub825 \ucc98\ub9ac\uc5d0 \uc0ac\uc6a9\ub418\uc9c0\ub9cc, Node.js\uc5d0\uc11c\ub294 \ud30c\uc77c \uc2dc\uc2a4\ud15c, \ub124\ud2b8\uc6cc\ud06c, \ud504\ub85c\uc138\uc2a4, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uac19\uc740 \uc11c\ubc84 \uae30\ub2a5\uc5d0 \uc811\uadfc\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uc758 \uae30\ubcf8 <code>http<\/code> \ubaa8\ub4c8\ub9cc\uc73c\ub85c\ub3c4 HTTP \uc11c\ubc84\ub97c \uc9c1\uc811 \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const http = require('http');\n\nconst server = http.createServer((req, res) =&gt; {\n    res.writeHead(200, {\n        'Content-Type': 'application\/json'\n    });\n\n    res.end(JSON.stringify({\n        message: 'Hello'\n    }));\n});\n\nserver.listen(3000);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc2e4\uc81c API \uc11c\ubc84\uc5d0\uc11c\ub294 \ub77c\uc6b0\ud305, JSON \ud30c\uc2f1, \uc778\uc99d, \uc5d0\ub7ec \ucc98\ub9ac \uac19\uc740 \uae30\ub2a5\uc774 \ud544\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 \uc791\uc5c5\uc744 \uc9c1\uc811 \uad6c\uc131\ud558\ub294 \ub300\uc2e0 Express \uac19\uc740 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const express = require('express');\n\nconst app = express();\n\napp.use(express.json());\n\napp.get('\/users', (req, res) =&gt; {\n    res.json({\n        users: &#91;]\n    });\n});\n\napp.listen(3000);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uad00\uacc4\ub97c \uc815\ub9ac\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JavaScript -&gt; Node.js -&gt; Express -&gt; HTTP API Server\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uac00 \uc2e4\ud589 \ud658\uacbd\uc774\ub77c\uba74 Express\ub294 \uadf8 \uc704\uc5d0\uc11c HTTP \uc11c\ubc84\ub97c \uad6c\uc131\ud558\uae30 \uc704\ud55c \ud504\ub808\uc784\uc6cc\ud06c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">REST API<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">REST API\ub294 HTTP\uc758 \uad6c\uc870\ub97c \uc774\uc6a9\ud574 \uc11c\ubc84\uc758 \ub9ac\uc18c\uc2a4\ub97c \ub2e4\ub8e8\ub294 API \uc124\uacc4 \ubc29\uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0ac\uc6a9\uc790 \ub370\uc774\ud130\ub97c \uad00\ub9ac\ud55c\ub2e4\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/users\nGET \/users\/10\nPOST \/users\nPUT \/users\/10\nPATCH \/users\/10\nDELETE \/users\/10\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">HTTP Method\ub294 \uc694\uccad\uc758 \uc758\ub3c4\ub97c \ud45c\ud604\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET -&gt; \ub370\uc774\ud130 \uc870\ud68c\nPOST -&gt; \ub370\uc774\ud130 \uc0dd\uc131\nPUT -&gt; \ub370\uc774\ud130 \uc804\uccb4 \uc218\uc815\nPATCH -&gt; \ub370\uc774\ud130 \uc77c\ubd80 \uc218\uc815\nDELETE -&gt; \ub370\uc774\ud130 \uc0ad\uc81c\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">REST API\uc5d0\uc11c\ub294 URL\uc774 \ud2b9\uc815 \ub3d9\uc791\ubcf4\ub2e4 \ub9ac\uc18c\uc2a4\ub97c \ud45c\ud604\ud558\ub294 \ubc29\ud5a5\uc73c\ub85c \uc124\uacc4\ub418\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/getUsers\nPOST \/createUser\nDELETE \/deleteUser\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubcf4\ub2e4\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\uac00 \uc790\uc5f0\uc2a4\ub7fd\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/users\nPOST \/users\nDELETE \/users\/:id\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">REST\uac00 \ubaa8\ub4e0 API\uc758 \uc808\ub300\uc801\uc778 \uaddc\uce59\uc774\ub77c\ub294 \uc758\ubbf8\ub294 \uc544\ub2c8\ub2e4. \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ud300\uc758 \uaddc\uce59\uc774\ub098 API \ud2b9\uc131\uc5d0 \ub530\ub77c \uc77c\ubd80 \ubcc0\ud615\ud574\uc11c \uc0ac\uc6a9\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\">HTTP Request\uc640 Response<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">API \uc11c\ubc84\uc758 \uac00\uc7a5 \uae30\ubcf8\uc801\uc778 \uc5ed\ud560\uc740 HTTP Request\ub97c \ubc1b\uace0 HTTP Response\ub97c \ubc18\ud658\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ub2e4\uc74c \uc694\uccad\uc744 \ubcf4\ub0b8\ub2e4\uace0 \uc0dd\uac01\ud574\ubcf4\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; GET \/users\/10 -&gt; Node.js Server\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc694\uccad\uc5d0\ub294 Header, URL, Parameter, Body \ub4f1\uc758 \uc815\ubcf4\uac00 \ud3ec\ud568\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/users\/10 HTTP\/1.1\nHost: example.com\nAuthorization: Bearer TOKEN\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\ub294 \uc694\uccad\uc744 \ubd84\uc11d\ud558\uace0 \ud544\uc694\ud55c \ub85c\uc9c1\uc744 \uc218\ud589\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP Request -&gt; Routing -&gt; Business Logic -&gt; Database -&gt; HTTP Response\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc751\ub2f5\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \ud615\ud0dc\uac00 \ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP\/1.1 200 OK\nContent-Type: application\/json\n\n{\n    \"id\": 10,\n    \"name\": \"user\"\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.get('\/users\/:id', (req, res) =&gt; {\n    const id = req.params.id;\n\n    res.json({\n        id: id,\n        name: 'user'\n    });\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc11c <code>:id<\/code>\ub294 URL Parameter\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/users\/10 -&gt; id = 10\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uc5d0\uc11c\ub294 <code>req.params<\/code>\ub97c \ud1b5\ud574 \uc811\uadfc\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\">Query Parameter\uc640 Request Body<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">HTTP \uc694\uccad\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud558\ub294 \ubc29\uc2dd\uc774 \ubaa9\uc801\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\uc815 \ub9ac\uc18c\uc2a4\ub97c \uc2dd\ubcc4\ud558\ub294 \uac12\uc740 URL Parameter\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/users\/10 -&gt; URL Parameter -&gt; id = 10\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac80\uc0c9, \uc815\ub82c, \ud398\uc774\uc9c0\ub124\uc774\uc158 \uac19\uc740 \uc870\uac74\uc740 Query Parameter\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/users?page=2&amp;limit=20 -&gt; Query Parameter -&gt; page = 2, limit = 20\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uc5d0\uc11c\ub294 <code>req.query<\/code>\ub85c \uac00\uc838\uc628\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.get('\/users', (req, res) =&gt; {\n    const page = req.query.page;\n    const limit = req.query.limit;\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">POST\ub098 PUT \uac19\uc740 \uc694\uccad\uc5d0\uc11c JSON \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud560 \ub54c\ub294 Request Body\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"name\": \"user\",\n    \"age\": 25\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uc5d0\uc11c JSON Middleware\ub97c \ub4f1\ub85d\ud558\uba74 <code>req.body<\/code>\ub97c \ud1b5\ud574 \uc811\uadfc\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP Request -&gt; express.json() -&gt; req.body\n<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use(express.json());\n\napp.post('\/users', (req, res) =&gt; {\n    const { name, age } = req.body;\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc815\ub9ac\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Resource Identifier -&gt; URL Parameter\nSearch \/ Filter \/ Sort \/ Pagination -&gt; Query Parameter\nCreate \/ Update Data -&gt; Request Body\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Routing<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Routing\uc740 HTTP Method\uc640 URL\uc5d0 \ub530\ub77c \uc5b4\ub5a4 \ucf54\ub4dc\ub97c \uc2e4\ud589\ud560\uc9c0 \uacb0\uc815\ud558\ub294 \uacfc\uc815\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP Request -&gt; Method + URL \ud655\uc778 -&gt; Route \uc120\ud0dd -&gt; Handler \uc2e4\ud589\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\uc758\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.get('\/users', getUsers);\napp.get('\/users\/:id', getUser);\napp.post('\/users', createUser);\napp.delete('\/users\/:id', deleteUser);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">API\uac00 \ucee4\uc9c0\uba74 \ubaa8\ub4e0 Route\ub97c \ud558\ub098\uc758 \ud30c\uc77c\uc5d0 \ub123\ub294 \ubc29\uc2dd\uc740 \uad00\ub9ac\ud558\uae30 \uc5b4\ub824\uc6cc\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c Express Router\ub97c \uc0ac\uc6a9\ud574 \uae30\ub2a5\ubcc4\ub85c \ub77c\uc6b0\ud2b8\ub97c \ubd84\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const router = express.Router();\n\nrouter.get('\/', getUsers);\nrouter.get('\/:id', getUser);\nrouter.post('\/', createUser);\n\nmodule.exports = router;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub9ac\uace0 \uc11c\ubc84\uc5d0\uc11c Router\ub97c \uc5f0\uacb0\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use('\/users', userRouter);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub7ec\uba74 \uc2e4\uc81c \uc694\uccad \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/users -&gt; \/users Router -&gt; getUsers\nGET \/users\/10 -&gt; \/users Router -&gt; getUser\nPOST \/users -&gt; \/users Router -&gt; createUser\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Routing\uc758 \uc5ed\ud560\uc740 \uc694\uccad\uc744 \uc801\uc808\ud55c \ucc98\ub9ac \ucf54\ub4dc\uc5d0 \uc5f0\uacb0\ud558\ub294 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Router \uc548\uc5d0 \ubaa8\ub4e0 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ub123\ub294 \uac83\uc740 \ubcc4\uac1c\uc758 \ubb38\uc81c\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Middleware<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uc5d0\uc11c \uc911\uc694\ud55c \uac1c\ub150 \uc911 \ud558\ub098\uac00 Middleware\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Middleware\ub294 \uc694\uccad\uc774 Route Handler\uc5d0 \ub3c4\ub2ec\ud558\uae30 \uc804\uc774\ub098 \ucc98\ub9ac \uacfc\uc815\uc5d0\uc11c \uc2e4\ud589\ub418\ub294 \ud568\uc218\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Middleware -&gt; Middleware -&gt; Route Handler -&gt; Response\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub85c\uadf8\ub97c \uae30\ub85d\ud558\ub294 Middleware\ub97c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use((req, res, next) =&gt; {\n    console.log(req.method, req.url);\n    next();\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>next()<\/code>\uac00 \ud638\ucd9c\ub418\uba74 \ub2e4\uc74c Middleware \ub610\ub294 Route Handler\ub85c \ub118\uc5b4\uac04\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Middleware -&gt; next() -&gt; Next Middleware -&gt; Route Handler\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc778\uc99d\ub3c4 Middleware\ub85c \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use(authMiddleware);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud2b9\uc815 API\uc5d0\ub9cc \uc801\uc6a9\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>router.get('\/profile', authMiddleware, getProfile);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Middleware\ub97c \uc0ac\uc6a9\ud558\uba74 \uc778\uc99d, \ub85c\uae45, \uc694\uccad \uac80\uc99d, \uc5d0\ub7ec \ucc98\ub9ac \uac19\uc740 \uacf5\ud1b5 \uae30\ub2a5\uc744 API \ub85c\uc9c1\uacfc \ubd84\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\ud45c\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Logging -&gt; Authentication -&gt; Validation -&gt; Router -&gt; Controller\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Controller\uc640 Business Logic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uac04\ub2e8\ud55c API\ub77c\uba74 Route Handler\uc5d0\uc11c \ubaa8\ub4e0 \uc791\uc5c5\uc744 \ucc98\ub9ac\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.post('\/users', async (req, res) =&gt; {\n    const user = await db.users.insert(req.body);\n\n    res.json(user);\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc11c\ube44\uc2a4\uac00 \ucee4\uc9c0\uba74 \uc0ac\uc6a9\uc790 \uc0dd\uc131 \uc804\uc5d0 \uc774\uba54\uc77c \uc911\ubcf5 \ud655\uc778, \ube44\ubc00\ubc88\ud638 \uc554\ud638\ud654, \uad8c\ud55c \ud655\uc778, \ub370\uc774\ud130 \uac80\uc99d \uac19\uc740 \ub85c\uc9c1\uc774 \ucd94\uac00\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub7f0 \ub85c\uc9c1\uc744 \ud558\ub098\uc758 Handler\uc5d0 \uacc4\uc18d \ub123\uc73c\uba74 \ucf54\ub4dc\uac00 \ubcf5\uc7a1\ud574\uc9c4\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uadf8\ub798\uc11c \uc11c\ubc84\ub97c \uc5ec\ub7ec \uacc4\uce35\uc73c\ub85c \ub098\ub204\ub294 \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Route -&gt; Controller -&gt; Service -&gt; Repository -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \uacc4\uce35\uc758 \uc5ed\ud560\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \uc0dd\uac01\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Route -&gt; HTTP Method\uc640 URL\uc744 Controller\uc5d0 \uc5f0\uacb0\nController -&gt; HTTP Request\uc640 Response \ucc98\ub9ac\nService -&gt; Business Logic \ucc98\ub9ac\nRepository -&gt; Database \uc811\uadfc\nDatabase -&gt; \uc2e4\uc81c \ub370\uc774\ud130 \uc800\uc7a5\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0ac\uc6a9\uc790 \uc0dd\uc131 API\ub97c \uc608\ub85c \ub4e4\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/users -&gt; UserController -&gt; UserService -&gt; UserRepository -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Service\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UserService -&gt; \uc774\uba54\uc77c \uc911\ubcf5 \ud655\uc778 -&gt; \ube44\ubc00\ubc88\ud638 \uc554\ud638\ud654 -&gt; \uc0ac\uc6a9\uc790 \uc0dd\uc131 -&gt; UserRepository\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub2e4\ub9cc \uc774 \uad6c\uc870\ub97c \ubaa8\ub4e0 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub611\uac19\uc774 \uc801\uc6a9\ud560 \ud544\uc694\ub294 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc791\uc740 \ud504\ub85c\uc81d\ud2b8\uc5d0\uc11c \uc9c0\ub098\uce58\uac8c \ub9ce\uc740 \uacc4\uce35\uc744 \ub9cc\ub4e4\uba74 \uc624\ud788\ub824 \ucf54\ub4dc\uac00 \ubcf5\uc7a1\ud574\uc9c8 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uc694\ud55c \uac83\uc740 HTTP \ucc98\ub9ac\uc640 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59, \ub370\uc774\ud130 \uc811\uadfc\uc744 \ud544\uc694 \uc774\uc0c1\uc73c\ub85c \uc11e\uc9c0 \uc54a\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\">Database \uc5f0\uacb0<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js API \uc11c\ubc84\ub294 \uc77c\ubc18\uc801\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \ud1b5\uc2e0\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">MySQL\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub97c \ubcf4\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Node.js -&gt; Controller -&gt; Service -&gt; Repository -&gt; MySQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Repository\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc811\uadfc\uc744 \ub2f4\ub2f9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Service -&gt; Repository -&gt; SQL Query -&gt; MySQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">ORM\uc744 \uc0ac\uc6a9\ud55c\ub2e4\uba74 \uac1d\uccb4 \uc911\uc2ec\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \ub2e4\ub8f0 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ub300\ub85c SQL\uc744 \uc9c1\uc811 \uc2e4\ud589\ud558\ub294 \ubc29\uc2dd\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5b4\ub5a4 \ubc29\uc2dd\uc744 \uc120\ud0dd\ud558\ub4e0 API Route\ub9c8\ub2e4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc811\uadfc \ucf54\ub4dc\ub97c \uc9c1\uc811 \uc791\uc131\ud558\uae30\ubcf4\ub2e4\ub294 \ubcc4\ub3c4\uc758 \ub370\uc774\ud130 \uc811\uadfc \uacc4\uce35\uc73c\ub85c \ubd84\ub9ac\ud558\ub294 \uac83\uc774 \uad00\ub9ac\uc5d0 \uc720\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ub610\ud55c DB \uc5f0\uacb0\uc744 \uc694\uccad\ub9c8\ub2e4 \uc0c8\ub85c \uc0dd\uc131\ud558\uae30\ubcf4\ub2e4 Connection Pool\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc77c\ubc18\uc801\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node.js -&gt; Connection Pool -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Connection Pool\uc5d0\ub294 \uc5ec\ub7ec DB \uc5f0\uacb0\uc774 \uc900\ube44\ub418\uc5b4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node.js -&gt; Connection Pool -&gt; Connection 1 -&gt; MySQL\nNode.js -&gt; Connection Pool -&gt; Connection 2 -&gt; MySQL\nNode.js -&gt; Connection Pool -&gt; Connection 3 -&gt; MySQL\nNode.js -&gt; Connection Pool -&gt; Connection 4 -&gt; MySQL\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc694\uccad\uc774 \ub4e4\uc5b4\uc624\uba74 \uae30\uc874 \uc5f0\uacb0\uc744 \uac00\uc838\uc640 \uc0ac\uc6a9\ud558\uace0 \uc791\uc5c5\uc774 \ub05d\ub098\uba74 Pool\uc5d0 \ubc18\ud658\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Connection Pool\uc5d0\uc11c \uc5f0\uacb0 \ud68d\ub4dd -&gt; Query -&gt; \uc5f0\uacb0 \ubc18\ud658\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ud558\uba74 \uc694\uccad\ub9c8\ub2e4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc5f0\uacb0\uc744 \uc0c8\ub85c \uc0dd\uc131\ud558\ub294 \ube44\uc6a9\uc744 \uc904\uc77c \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\">\ube44\ub3d9\uae30 \ucc98\ub9ac\uc640 Event Loop<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js \uc11c\ubc84\ub97c \uc774\ud574\ud560 \ub54c \ube44\ub3d9\uae30 \ucc98\ub9ac\ub3c4 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\ub294 JavaScript \uc2e4\ud589\uc744 \uae30\ubcf8\uc801\uc73c\ub85c \ud558\ub098\uc758 \uba54\uc778 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ucc98\ub9ac\ud558\uba74\uc11c I\/O \uc791\uc5c5\uc744 \ube44\ub3d9\uae30\uc801\uc73c\ub85c \ucc98\ub9ac\ud558\ub294 \uad6c\uc870\ub97c \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc694\uccad\uc744 \uae30\ub2e4\ub9ac\ub294 \ub3d9\uc548 \ub2e4\ub978 \uc694\uccad\uc744 \ucc98\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.get('\/users', async (req, res) =&gt; {\n    const users = await getUsersFromDatabase();\n\n    res.json(users);\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ucf54\ub4dc\ub9cc \ubcf4\uba74 <code>await<\/code>\uc5d0\uc11c \uc11c\ubc84\uac00 \uba48\ucd94\ub294 \uac83\ucc98\ub7fc \ubcf4\uc77c \uc218 \uc788\uc9c0\ub9cc Node.js \ud504\ub85c\uc138\uc2a4 \uc804\uccb4\uac00 DB \uc751\ub2f5\uc744 \uae30\ub2e4\ub9ac\uba70 \uc815\uc9c0\ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ub150\uc801\uc73c\ub85c \ub2e4\uc74c\uacfc \uac19\uc774 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request A -&gt; DB Request -&gt; Waiting\nRequest B -&gt; Processing\nRequest C -&gt; Processing\nRequest D -&gt; Processing\nDB Response A -&gt; Request A Processing -&gt; Response A\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\uac00 I\/O \uc911\uc2ec\uc758 \uc11c\ubc84 \uac1c\ubc1c\uc5d0\uc11c \ub9ce\uc774 \uc0ac\uc6a9\ub418\ub294 \uc774\uc720 \uc911 \ud558\ub098\uac00 \uc774\ub7f0 \ube44\ub3d9\uae30 \ucc98\ub9ac \uad6c\uc870\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc CPU \uc5f0\uc0b0\uc740 \ub2e4\ub974\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JavaScript \uc2e4\ud589 \uc2a4\ub808\ub4dc\uc5d0\uc11c \ub9e4\uc6b0 \ubb34\uac70\uc6b4 CPU \uc791\uc5c5\uc744 \uc7a5\uc2dc\uac04 \uc218\ud589\ud558\uba74 \ub2e4\ub978 \uc694\uccad \ucc98\ub9ac\uc5d0\ub3c4 \uc601\ud5a5\uc744 \uc904 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CPU Heavy Task -&gt; Event Loop \uc810\uc720 -&gt; \ub2e4\ub978 Request \ucc98\ub9ac \uc9c0\uc5f0\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub530\ub77c\uc11c Node.js\ub294 \ubaa8\ub4e0 \uc885\ub958\uc758 \uc11c\ubc84 \uc5f0\uc0b0\uc5d0 \ubb34\uc870\uac74 \uc801\ud569\ud55c \uac83\uc774 \uc544\ub2c8\ub77c <strong>I\/O \uc911\uc2ec \uc791\uc5c5\uacfc CPU \uc911\uc2ec \uc791\uc5c5\uc758 \ud2b9\uc131\uc744 \uad6c\ubd84\ud574\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Error Handling<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">API \uc11c\ubc84\uc5d0\uc11c\ub294 \uc815\uc0c1\uc801\uc778 \uc694\uccad\ub9cc \ub4e4\uc5b4\uc628\ub2e4\uace0 \uac00\uc815\ud560 \uc218 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc798\ubabb\ub41c \uc694\uccad, \uc778\uc99d \uc2e4\ud328, \uad8c\ud55c \ubd80\uc871, \ub370\uc774\ud130 \ubbf8\uc874\uc7ac, \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc624\ub958 \ub4f1 \ub2e4\uc591\ud55c \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uc5d0\uc11c\ub294 Error Middleware\ub97c \ud1b5\ud574 \uacf5\ud1b5\uc801\uc778 \uc624\ub958 \ucc98\ub9ac\ub97c \uad6c\uc131\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Middleware -&gt; Controller -&gt; Service -&gt; Error -&gt; Error Middleware -&gt; HTTP Response\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use((err, req, res, next) =&gt; {\n    console.error(err);\n\n    res.status(500).json({\n        message: 'Internal Server Error'\n    });\n});\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">HTTP Status Code\ub3c4 \uc0c1\ud669\uc5d0 \ub9de\uac8c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>200 -&gt; OK\n201 -&gt; Created\n400 -&gt; Bad Request\n401 -&gt; Unauthorized\n403 -&gt; Forbidden\n404 -&gt; Not Found\n409 -&gt; Conflict\n500 -&gt; Internal Server Error\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc778\uc99d\ub418\uc9c0 \uc54a\uc740 \uc0ac\uc6a9\uc790\uac00 \uc778\uc99d\uc774 \ud544\uc694\ud55c API\uc5d0 \uc811\uadfc\ud558\uba74 <code>401<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc778\uc99d\uc740 \ub418\uc5c8\uc9c0\ub9cc \ud574\ub2f9 \uc791\uc5c5\uc744 \uc218\ud589\ud560 \uad8c\ud55c\uc774 \uc5c6\ub2e4\uba74 <code>403<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc624\ub958 \ucc98\ub9ac\uc758 \uc804\uccb4 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Validation -&gt; Authentication -&gt; Business Logic -&gt; Error Detection -&gt; Error Handling -&gt; Response\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Status Code\ubfd0\ub9cc \uc544\ub2c8\ub77c API\uc758 \uc624\ub958 \uc751\ub2f5 \ud615\uc2dd\ub3c4 \uc77c\uad00\ub418\uac8c \uc720\uc9c0\ud558\ub294 \uac83\uc774 \ud074\ub77c\uc774\uc5b8\ud2b8 \uac1c\ubc1c\uc5d0 \uc720\ub9ac\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\">Authentication\uacfc JWT<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">REST API\uc5d0\uc11c\ub294 \uc11c\ubc84\uc5d0 \uc138\uc158\uc744 \uc800\uc7a5\ud558\ub294 \ubc29\uc2dd\ubfd0 \uc544\ub2c8\ub77c \ud1a0\ud070 \uae30\ubc18 \uc778\uc99d\ub3c4 \ub9ce\uc774 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JWT\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0 \uc77c\ubc18\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Login -&gt; ID \/ Password \uac80\uc99d -&gt; JWT \ubc1c\uae09 -&gt; Client \uc800\uc7a5 -&gt; API Request -&gt; JWT \uac80\uc99d -&gt; User \uc2dd\ubcc4 -&gt; Business Logic\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">API \uc694\uccad\uc5d0\uc11c\ub294 \uc77c\ubc18\uc801\uc73c\ub85c Authorization Header\uc5d0 \ud1a0\ud070\uc744 \uc804\ub2ec\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Authorization: Bearer JWT -&gt; API Server\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Middleware\uc5d0\uc11c JWT\ub97c \uac80\uc99d\ud55c \ub4a4 \uc0ac\uc6a9\uc790 \uc815\ubcf4\ub97c \uc694\uccad \uac1d\uccb4\uc5d0 \ub123\uc744 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Auth Middleware -&gt; JWT \uac80\uc99d -&gt; User \uc815\ubcf4 \ucd94\ucd9c -&gt; req.user -&gt; Controller\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">JWT \uc790\uccb4\uac00 \ub85c\uadf8\uc778 \uc2dc\uc2a4\ud15c\uc774\ub098 \uad8c\ud55c \uad00\ub9ac \uc2dc\uc2a4\ud15c\uc744 \uc81c\uacf5\ud558\ub294 \uac83\uc740 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JWT\ub294 \uc778\uc99d \uc815\ubcf4\ub97c \ud45c\ud604\ud558\uace0 \uc804\ub2ec\ud558\uae30 \uc704\ud55c \ud1a0\ud070 \ud615\uc2dd\uc774\uace0, \uc2e4\uc81c \uc0ac\uc6a9\uc790 \uc778\uc99d\uacfc \uad8c\ud55c \uc815\ucc45\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uad6c\ud604\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 \ub2e4\uc74c \uc694\uc18c\ub3c4 \ud568\uaed8 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JWT -&gt; Signature \uac80\uc99d -&gt; Expiration \uac80\uc99d -&gt; User \uc2dd\ubcc4 -&gt; Authorization \uac80\uc0ac\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Refresh Token\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\ub3c4 \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Login -&gt; Access Token \ubc1c\uae09 + Refresh Token \ubc1c\uae09 -&gt; Client -&gt; Access Token \ub9cc\ub8cc -&gt; Refresh Token \uac80\uc99d -&gt; Access Token \uc7ac\ubc1c\uae09\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Validation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \ubcf4\ub0b4\ub294 \ub370\uc774\ud130\ub97c \uadf8\ub300\ub85c \uc2e0\ub8b0\ud574\uc11c\ub294 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud68c\uc6d0\uac00\uc785 \uc694\uccad\uc774 \ub2e4\uc74c\uacfc \uac19\uc774 \ub4e4\uc5b4\uc628\ub2e4\uace0 \ud558\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"email\": \"test@example.com\",\n    \"password\": \"1234\"\n}\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84\uc5d0\uc11c\ub294 \uc774\uba54\uc77c \ud615\uc2dd, \ube44\ubc00\ubc88\ud638 \uae38\uc774, \ud544\uc218 \ud544\ub4dc \ub4f1\uc744 \uac80\uc99d\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Validation -&gt; Authentication -&gt; Controller -&gt; Service -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Validation\uc744 Middleware\ub098 \ubcc4\ub3c4\uc758 Schema \uacc4\uce35\uc73c\ub85c \ubd84\ub9ac\ud558\uba74 API\ub9c8\ub2e4 \ubc18\ubcf5\ub418\ub294 \uac80\uc99d \ucf54\ub4dc\ub97c \uc904\uc77c \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uc694\ud55c \uac83\uc740 \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0\uc11c \uac80\uc99d\ud588\ub2e4\uace0 \ud558\ub354\ub77c\ub3c4 \uc11c\ubc84\uc5d0\uc11c \ub2e4\uc2dc \uac80\uc99d\ud574\uc57c \ud55c\ub2e4\ub294 \uc810\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client Validation -&gt; Request -&gt; Server Validation -&gt; Business Logic\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc11c\ubc84 \uc785\uc7a5\uc5d0\uc11c \uc678\ubd80\uc5d0\uc11c \ub4e4\uc5b4\uc624\ub294 \ubaa8\ub4e0 \uc694\uccad\uc740 \uc2e0\ub8b0\ud560 \uc218 \uc5c6\ub294 \uc785\ub825\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Validation\uc740 \ub2e8\uc21c\ud55c \ud3b8\uc758 \uae30\ub2a5\uc774 \uc544\ub2c8\ub77c <strong>\uc678\ubd80 \uc785\ub825\uacfc \ub0b4\ubd80 \uc2dc\uc2a4\ud15c \uc0ac\uc774\uc758 \uacbd\uacc4<\/strong>\ub97c \ub2f4\ub2f9\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\">\ud658\uacbd \ubcc0\uc218\uc640 \uc124\uc815 \uad00\ub9ac<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">DB \ube44\ubc00\ubc88\ud638\ub098 JWT Secret \uac19\uc740 \ubbfc\uac10\ud55c \uac12\uc744 \uc18c\uc2a4 \ucf54\ub4dc\uc5d0 \uc9c1\uc811 \uc791\uc131\ud558\uba74 \uc548 \ub41c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const dbPassword = 'my-password';\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ub300\uc2e0 \ud658\uacbd \ubcc0\uc218\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const dbPassword = process.env.DB_PASSWORD;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac1c\ubc1c \ud658\uacbd\uc5d0\uc11c\ub294 <code>.env<\/code> \ud30c\uc77c\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PORT=3000\nDB_HOST=localhost\nDB_USER=root\nDB_PASSWORD=password\nJWT_SECRET=secret\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud658\uacbd \ubcc0\uc218\uc758 \uae30\ubcf8\uc801\uc778 \ud750\ub984\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Environment -&gt; Node.js Process -&gt; process.env -&gt; Application Configuration\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>.env<\/code>\uc5d0\ub294 \ubbfc\uac10\ud55c \uc815\ubcf4\uac00 \ub4e4\uc5b4\uac08 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 Git\uc5d0 \uadf8\ub300\ub85c \ucee4\ubc0b\ud558\uc9c0 \uc54a\ub3c4\ub85d \uad00\ub9ac\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc6b4\uc601 \ud658\uacbd\uc5d0\uc11c\ub294 Docker, Kubernetes, \ud074\ub77c\uc6b0\ub4dc \ud658\uacbd\uc758 Secret\uc774\ub098 \ud658\uacbd \ubcc0\uc218 \uad00\ub9ac \uc2dc\uc2a4\ud15c \ub4f1\uc744 \uc0ac\uc6a9\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\">API \uc11c\ubc84\uc758 \uc804\uccb4 \uad6c\uc870<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc55e\uc5d0\uc11c \uc124\uba85\ud55c \ub0b4\uc6a9\uc744 \ud558\ub098\ub85c \ubb36\uc73c\uba74 \uc77c\ubc18\uc801\uc778 Node.js REST API \uc11c\ubc84\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud750\ub984\uc73c\ub85c \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; HTTP Request -&gt; Express -&gt; Middleware -&gt; Router -&gt; Controller -&gt; Service -&gt; Repository -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uac01 \ub2e8\uacc4\uc5d0\uc11c \ub2f4\ub2f9\ud558\ub294 \uc5ed\ud560\uc740 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; API \uc694\uccad \uc0dd\uc131\nHTTP -&gt; Request\uc640 Response \uc804\ub2ec\nExpress -&gt; HTTP \uc11c\ubc84 \uad6c\uc131\nMiddleware -&gt; \uacf5\ud1b5 \uc694\uccad \ucc98\ub9ac\nRouter -&gt; Endpoint\uc640 Handler \uc5f0\uacb0\nController -&gt; HTTP \uc694\uccad\uacfc \uc751\ub2f5 \ucc98\ub9ac\nService -&gt; Business Logic \ucc98\ub9ac\nRepository -&gt; Database \uc811\uadfc\nDatabase -&gt; \ub370\uc774\ud130 \uc800\uc7a5 \ubc0f \uc870\ud68c\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc751\ub2f5\uc740 \ubc18\ub300 \ubc29\ud5a5\uc73c\ub85c \uc774\ub3d9\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Database -&gt; Repository -&gt; Service -&gt; Controller -&gt; HTTP Response -&gt; Client\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc778\uc99d\uacfc \uac80\uc99d\uae4c\uc9c0 \ud3ec\ud568\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; HTTP Request -&gt; Logging -&gt; Authentication -&gt; Validation -&gt; Router -&gt; Controller -&gt; Service -&gt; Repository -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uba74 \ubcc4\ub3c4\uc758 Error Handling \uacc4\uce35\uc73c\ub85c \uc804\ub2ec\ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Request -&gt; Middleware -&gt; Controller -&gt; Service -&gt; Error -&gt; Error Middleware -&gt; HTTP Response\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Node.js\uc640 \ub2e4\ub978 \uc11c\ubc84 \uae30\uc220\uc758 \uad00\uacc4<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js REST API \uc11c\ubc84\ub294 \ud558\ub098\uc758 \uc644\uc131\ub41c \uc11c\ubc84 \uc544\ud0a4\ud14d\ucc98\ub77c\uae30\ubcf4\ub2e4 \uc11c\ubc84\ub97c \uad6c\uc131\ud558\ub294 \uc2e4\ud589 \ud658\uacbd\uacfc \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \uac00\uae5d\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud544\uc694\ud55c \uae30\ub2a5\uc5d0 \ub530\ub77c \uc5ec\ub7ec \uae30\uc220\uc744 \uc870\ud569\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node.js -&gt; Express -&gt; REST API\nNode.js -&gt; MySQL -&gt; Persistent Data\nNode.js -&gt; Redis -&gt; Cache \/ Session\nNode.js -&gt; Kafka -&gt; Event Streaming\nNode.js -&gt; JWT -&gt; Authentication\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc804\uccb4 \uc2dc\uc2a4\ud15c\uc73c\ub85c \ubb36\uc73c\uba74 \ub2e4\uc74c\uacfc \uac19\uc740 \uad6c\uc870\uac00 \ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Node.js -&gt; Express -&gt; Service -&gt; MySQL\n                                  |\n                                  -&gt; Redis\n                                  |\n                                  -&gt; Kafka\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Express\uac00 HTTP \uc694\uccad\uc744 \ubc1b\uace0, Service\uac00 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ucc98\ub9ac\ud558\uace0, MySQL\uc774 \uc601\uc18d \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud558\uace0, Redis\uac00 \uce90\uc2dc\ub098 \uc138\uc158\uc5d0 \uc0ac\uc6a9\ub418\uace0, Kafka\uac00 \uc11c\ube44\uc2a4 \uac04 \ube44\ub3d9\uae30 \uc774\ubca4\ud2b8 \uc804\ub2ec\uc744 \ub2f4\ub2f9\ud558\ub294 \uc2dd\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">GraphQL\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 REST \ub300\uc2e0 GraphQL\uc744 API \uacc4\uce35\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; Node.js -&gt; GraphQL -&gt; Service -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uc694\ud55c \uac83\uc740 Node.js\uac00 \uc774\ub7f0 \uae30\ub2a5\uc744 \uc790\ub3d9\uc73c\ub85c \uc81c\uacf5\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c\ub294 \uc810\uc774\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Node.js -&gt; Runtime\nExpress -&gt; HTTP Framework\nJWT -&gt; Authentication Mechanism\nMySQL -&gt; Database\nRedis -&gt; In-Memory Data Store\nKafka -&gt; Event Streaming Platform\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ud544\uc694\ud55c \uae30\uc220\uc744 \uc870\ud569\ud574\uc11c \ud558\ub098\uc758 \uc11c\ubc84 \uc2dc\uc2a4\ud15c\uc744 \uad6c\uc131\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\">\uc2e4\ubb34\uc5d0\uc11c \uc0dd\uac01\ud574\uc57c \ud560 \ubd80\ubd84<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uac04\ub2e8\ud55c CRUD API\ub294 Node.js\uc640 Express\ub9cc\uc73c\ub85c\ub3c4 \ube60\ub974\uac8c \ub9cc\ub4e4 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc \uc2e4\uc81c \uc11c\ube44\uc2a4\uc5d0\uc11c\ub294 API \ud558\ub098\ub97c \ub9cc\ub4dc\ub294 \uac83\ubcf4\ub2e4 \uc6b4\uc601 \uac00\ub2a5\ud55c \uad6c\uc870\ub97c \ub9cc\ub4dc\ub294 \uac83\uc774 \ub354 \uc911\uc694\ud558\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2e4\ubb34\uc5d0\uc11c\ub294 \ub2e4\uc74c \uc694\uc18c\ub97c \ud568\uaed8 \uace0\ub824\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Authentication\nAuthorization\nValidation\nError Handling\nLogging\nDatabase Connection Pool\nTransaction\nCaching\nRate Limiting\nSecurity\nEnvironment Configuration\nMonitoring\nTesting\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\ubb38\uc81c\uac00 \uc0dd\uae30\ub294 \ub300\ud45c\uc801\uc778 \uad6c\uc870\ub294 Controller\uc5d0\uc11c \ubaa8\ub4e0 \uae30\uc220\uc744 \uc9c1\uc811 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Controller -&gt; Database\nController -&gt; Redis\nController -&gt; JWT\nController -&gt; Kafka\nController -&gt; Business Logic\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774\ub807\uac8c \ub418\uba74 Controller\uac00 HTTP \ucc98\ub9ac\ubd80\ud130 \ube44\uc988\ub2c8\uc2a4 \uaddc\uce59, \ub370\uc774\ud130\ubca0\uc774\uc2a4, \uce90\uc2dc, \uba54\uc2dc\uc9c0 \ucc98\ub9ac\uae4c\uc9c0 \ubaa8\ub450 \ub2f4\ub2f9\ud558\uac8c \ub41c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ubc18\ub300\ub85c \ubaa8\ub4e0 \ucf54\ub4dc\ub97c \ud558\ub098\uc758 Service\uc5d0 \ubab0\uc544\ub123\ub294 \uac83\ub3c4 \ubb38\uc81c\uac00 \ub420 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Controller -&gt; Massive Service -&gt; Everything\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc911\uc694\ud55c \uac83\uc740 \uacc4\uce35\uc744 \ubb34\uc870\uac74 \ub9ce\uc774 \ub9cc\ub4dc\ub294 \uac83\uc774 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\ubcc0\uacbd\ub418\ub294 \ucc45\uc784\uc744 \uc801\uc808\ud55c \uacbd\uacc4\ub85c \ubd84\ub9ac\ud558\ub294 \uac83<\/strong>\uc774 \ud575\uc2ec\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\">\uc11c\ubc84 \uc694\uccad\uc758 \uc804\uccb4 \ud750\ub984<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js REST API \uc11c\ubc84\uc5d0\uc11c \ud558\ub098\uc758 \uc694\uccad\uc774 \ub4e4\uc5b4\uc640 \ucc98\ub9ac\ub418\ub294 \uacfc\uc815\uc744 \uc804\uccb4\uc801\uc73c\ub85c \uc5f0\uacb0\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client\n-&gt; HTTP Request\n-&gt; Express\n-&gt; Middleware\n-&gt; Authentication\n-&gt; Validation\n-&gt; Router\n-&gt; Controller\n-&gt; Service\n-&gt; Repository\n-&gt; Database\n-&gt; Repository\n-&gt; Service\n-&gt; Controller\n-&gt; HTTP Response\n-&gt; Client\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc608\ub97c \ub4e4\uc5b4 \uc0ac\uc6a9\uc790 \uc870\ud68c\ub77c\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>GET \/users\/10\n-&gt; Authentication\n-&gt; Validation\n-&gt; User Router\n-&gt; User Controller\n-&gt; User Service\n-&gt; User Repository\n-&gt; MySQL\n-&gt; User Repository\n-&gt; User Service\n-&gt; User Controller\n-&gt; JSON Response\n-&gt; Client\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc0ac\uc6a9\uc790 \uc0dd\uc131\uc774\ub77c\uba74:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>POST \/users\n-&gt; Authentication\n-&gt; Validation\n-&gt; User Router\n-&gt; User Controller\n-&gt; User Service\n-&gt; Email \uc911\ubcf5 \ud655\uc778\n-&gt; Password \uc554\ud638\ud654\n-&gt; User Repository\n-&gt; MySQL\n-&gt; User Repository\n-&gt; User Service\n-&gt; User Controller\n-&gt; HTTP Response\n-&gt; Client\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \ud750\ub984\uc744 \uc774\ud574\ud558\uba74 Express\uc758 \uac1c\ubcc4 API\ub97c \uc678\uc6b0\ub294 \uac83\ubcf4\ub2e4 \uc11c\ubc84\uac00 \uc2e4\uc81c\ub85c \uc5b4\ub5bb\uac8c \ub3d9\uc791\ud558\ub294\uc9c0 \ud6e8\uc52c \uba85\ud655\ud558\uac8c \ubcfc \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\">\uc815\ub9ac<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js REST API \uc11c\ubc84\uc758 \ud575\uc2ec \uad6c\uc870\ub294 \ub2e4\uc74c\uacfc \uac19\uc774 \uc815\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Client -&gt; HTTP Request -&gt; Middleware -&gt; Router -&gt; Controller -&gt; Service -&gt; Repository -&gt; Database\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc751\ub2f5\uc740 \ubc18\ub300 \ubc29\ud5a5\uc73c\ub85c \ub3cc\uc544\uc628\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Database -&gt; Repository -&gt; Service -&gt; Controller -&gt; HTTP Response -&gt; Client\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js\ub294 JavaScript\ub97c \uc11c\ubc84\uc5d0\uc11c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \ub7f0\ud0c0\uc784\uc774\uace0, Express\ub294 \uadf8 \uc704\uc5d0\uc11c HTTP API\ub97c \uad6c\uc131\ud558\uae30 \uc27d\uac8c \ud574\uc8fc\ub294 \ud504\ub808\uc784\uc6cc\ud06c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">REST API\uc5d0\uc11c\ub294 HTTP Method\uc640 URL\uc744 \uc774\uc6a9\ud574 \ub9ac\uc18c\uc2a4\ub97c \ud45c\ud604\ud558\uace0, URL Parameter, Query Parameter, Request Body \ub4f1\uc744 \ud1b5\ud574 \ub370\uc774\ud130\ub97c \uc804\ub2ec\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Middleware\ub294 \uc778\uc99d, \uac80\uc99d, \ub85c\uae45 \uac19\uc740 \uacf5\ud1b5 \ucc98\ub9ac\ub97c \ub2f4\ub2f9\ud560 \uc218 \uc788\uace0, Router\ub294 \uc694\uccad\uc744 \uc801\uc808\ud55c Handler\uc5d0 \uc5f0\uacb0\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Controller\ub294 HTTP \uc694\uccad\uacfc \uc751\ub2f5\uc744 \ub2e4\ub8e8\uace0, Service\ub294 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ucc98\ub9ac\ud558\uba70, Repository\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc811\uadfc\uc744 \ub2f4\ub2f9\ud558\ub3c4\ub85d \ubd84\ub9ac\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc5ec\uae30\uc5d0 JWT, Redis, MySQL, Kafka \uac19\uc740 \uae30\uc220\uc744 \ubaa9\uc801\uc5d0 \ub9de\uac8c \uc870\ud569\ud574\uc11c \ud558\ub098\uc758 \uc11c\ubc84 \uc2dc\uc2a4\ud15c\uc744 \uad6c\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js \uc11c\ubc84 \uac1c\ubc1c\uc5d0\uc11c \uc911\uc694\ud55c \uac83\uc740 Express \ubb38\ubc95 \uc790\uccb4\uac00 \uc544\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>HTTP Request\n-&gt; Middleware\n-&gt; Router\n-&gt; Controller\n-&gt; Service\n-&gt; Repository\n-&gt; Database\n-&gt; Response\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\uc694\uccad\uc774 \ub4e4\uc5b4\uc640\uc11c \uc5b4\ub5a4 \uacc4\uce35\uc744 \uac70\uccd0 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\uace0, \ub2e4\uc2dc \uc5b4\ub5a4 \ud615\ud0dc\ub85c \uc751\ub2f5\ub418\ub294\uc9c0\ub97c \uc774\ud574\ud558\ub294 \uac83<\/strong>\uc774 \ud575\uc2ec\uc774\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc774 \uad6c\uc870\uac00 \uc7a1\ud788\uba74 Express\uc758 \uc138\ubd80 \uae30\ub2a5\uc774\ub098 \ub2e4\ub978 Node.js \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ucd94\uac00\ub85c \ud559\uc2b5\ud560 \ub54c\ub3c4 \uac01\uac01\uc758 \uae30\uc220\uc774 \uc5b4\ub290 \uc704\uce58\uc5d0\uc11c \uc5b4\ub5a4 \uc5ed\ud560\uc744 \ub2f4\ub2f9\ud558\ub294\uc9c0 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc5f0\uacb0\ud560 \uc218 \uc788\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Node.js REST API \uc11c\ubc84 \uac1c\ubc1c \ud575\uc2ec \uc815\ub9ac Node.js\ub294 JavaScript\ub97c \ube0c\ub77c\uc6b0\uc800 \ubc16\uc5d0\uc11c \uc2e4\ud589\ud560 \uc218 \uc788\uac8c \ud574\uc8fc\ub294 \ub7f0\ud0c0\uc784\uc774\ub2e4. Chrome\uc758 V8 JavaScript \uc5d4\uc9c4\uc744 \uae30\ubc18\uc73c\ub85c \ub3d9\uc791\ud558\uba70, \uc11c\ubc84 \uac1c\ubc1c\uc5d0\uc11c\ub294 HTTP \uc694\uccad\uc744 \ucc98\ub9ac\ud558\uace0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc640 \ud1b5\uc2e0\ud558\ub294 API \uc11c\ubc84\ub97c \ub9cc\ub4dc\ub294 \uc6a9\ub3c4\ub85c \ub9ce\uc774 \uc0ac\uc6a9\ud55c\ub2e4. Node.js \uc790\uccb4\uac00 \uc6f9 \ud504\ub808\uc784\uc6cc\ud06c\uc778 \uac83\uc740 \uc544\ub2c8\ub2e4. HTTP \uc11c\ubc84\ub97c \uc9c1\uc811 \ub9cc\ub4e4 \uc218 \uc788\ub294 http \ubaa8\ub4c8\uc744 \uc81c\uacf5\ud558\uace0, Express \uac19\uc740 \ud504\ub808\uc784\uc6cc\ud06c\ub97c \ucd94\uac00\ud574\uc11c \ub77c\uc6b0\ud305, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49],"tags":[],"class_list":["post-1681","post","type-post","status-publish","format-standard","hentry","category-server"],"_links":{"self":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1681","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=1681"}],"version-history":[{"count":3,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1681\/revisions"}],"predecessor-version":[{"id":1968,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=\/wp\/v2\/posts\/1681\/revisions\/1968"}],"wp:attachment":[{"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1681"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1681"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wayhope.kro.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1681"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}