From 9f1e86fbb5138647d8c4d6c1c08c90e0c0b11dd7 Mon Sep 17 00:00:00 2001 From: GodUser1005 Date: Fri, 11 Oct 2024 02:11:16 +0900 Subject: [PATCH 1/7] =?UTF-8?q?mission:=203=EC=A3=BC=EC=B0=A8=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/chapter03/mission.md | 133 +++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 mission/chapter03/mission.md diff --git a/mission/chapter03/mission.md b/mission/chapter03/mission.md new file mode 100644 index 0000000..e3cc7c2 --- /dev/null +++ b/mission/chapter03/mission.md @@ -0,0 +1,133 @@ +# 미션 API 설계 + +### 홈 화면 +1. 홈 화면 보여주기 + - API Endpoint : + ``` + GET http://umc.com/home + ``` + - Request Header : + ``` + Bearer Token + ``` +2. 미션 도전 + - API Endpoint : + ``` + POST http://umc.com/missions/{mission-id} + ``` + - Path variable : + ``` + mission-id + ``` + - Request Header : + ``` + Bearer Token + ``` + +--- + + +### 마이페이지 리뷰 작성 +1. 리뷰 작성하기 + - API Endpoint : + ``` + POST http://umc.com/users/reviews + ``` + - Request body : + ``` + { + "score" : , + "content" : , + "images" : [ + { + "URL" : , + }, ... + ] + } + ``` + - Request Header : + ``` + Bearer Token, + content-type : Application/json + ``` +2. 내가 작성한 리뷰 + - API Endpoint : + ``` + GET http://umc.com/users/reviews + ``` + - Request Header : + ``` + Bearer Token + ``` + +--- + +### 미션 목록 조회 +1. 진행 중인 미션 조회 + - API Endpoint : + ``` + GET http://umc.com/users/missions + ``` + - Query string : + ``` + status=1 + ``` + - Request Header : + ``` + Bearer Token + ``` +2. 완료된 미션 조회 + - API Endpoint : + ``` + GET http://umc.com/users/missions + ``` + - Query string : + ``` + status=2 + ``` + - Request Header : + ``` + Bearer Token + ``` + +--- +### 미션 성공 누르기 +1. 미션 성공 + - API Endpoint : + ``` + PATCH http://umc.com/users/missions/{mission-id}/success + ``` + - Path variable : + ``` + mission-id + ``` + - Request Header : + ``` + Bearer Token + ``` +--- +### 회원가입 +1. 회원가입 + - API Endpoint : + ``` + POST http://umc.com/users + ``` + - Request body : + ``` + { + "name" : , + "gender" : , + "birth" : , + "address" : , + "food_categories" : [ + { + "food_category_id" : , + }, ... + ] + } + ``` + - Request Header : + ``` + content-type : Application/json + ``` + From 98799bc839c9db5066f082f75a928b682303eee6 Mon Sep 17 00:00:00 2001 From: GodUser1005 Date: Fri, 11 Oct 2024 02:14:29 +0900 Subject: [PATCH 2/7] =?UTF-8?q?chore:=20chapter02=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyword/{chatper02 => chapter02}/keyword.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename keyword/{chatper02 => chapter02}/keyword.md (100%) diff --git a/keyword/chatper02/keyword.md b/keyword/chapter02/keyword.md similarity index 100% rename from keyword/chatper02/keyword.md rename to keyword/chapter02/keyword.md From 8b35ef9de57b34b878d7e58a0f28fb0cdb9fa3cf Mon Sep 17 00:00:00 2001 From: GodUser1005 Date: Fri, 11 Oct 2024 02:22:21 +0900 Subject: [PATCH 3/7] =?UTF-8?q?keyword:=203=EC=A3=BC=EC=B0=A8=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyword/chapter03/keyword.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 keyword/chapter03/keyword.md diff --git a/keyword/chapter03/keyword.md b/keyword/chapter03/keyword.md new file mode 100644 index 0000000..3258a0e --- /dev/null +++ b/keyword/chapter03/keyword.md @@ -0,0 +1 @@ +3주차 키워드 없습니다 \ No newline at end of file From 6375a6effd6d82ad30a879a2a284cfd921b3d37f Mon Sep 17 00:00:00 2001 From: GodUser1005 Date: Fri, 11 Oct 2024 02:49:11 +0900 Subject: [PATCH 4/7] =?UTF-8?q?mission:=203=EC=A3=BC=EC=B0=A8=20node=20?= =?UTF-8?q?=EC=84=B8=ED=8C=85=20=EC=8B=A4=EC=8A=B5=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/chapter03/Hello_world.png | Bin 0 -> 15228 bytes mission/chapter03/nodemon.png | Bin 0 -> 12766 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mission/chapter03/Hello_world.png create mode 100644 mission/chapter03/nodemon.png diff --git a/mission/chapter03/Hello_world.png b/mission/chapter03/Hello_world.png new file mode 100644 index 0000000000000000000000000000000000000000..6fc9caf07c4f8c668ec58ea6a209e1f634297f2a GIT binary patch literal 15228 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 literal 0 HcmV?d00001 diff --git a/mission/chapter03/nodemon.png b/mission/chapter03/nodemon.png new file mode 100644 index 0000000000000000000000000000000000000000..18ba544c194ec27d6280cf601c5d73268396e8a3 GIT binary patch literal 12766 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 E0PCf>MF0Q* literal 0 HcmV?d00001 From 38abc2275a03a0b0e5eb505b2ceeed409bb8852c Mon Sep 17 00:00:00 2001 From: GodUser1005 Date: Fri, 11 Oct 2024 02:51:48 +0900 Subject: [PATCH 5/7] =?UTF-8?q?practice:=20node=EC=84=B8=ED=8C=85=20?= =?UTF-8?q?=EC=8B=A4=EC=8A=B5=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/nodejs_project/.gitignore | 1 + mission/nodejs_project/.vscode/settings.json | 3 + mission/nodejs_project/package-lock.json | 1174 ++++++++++++++++++ mission/nodejs_project/package.json | 20 + mission/nodejs_project/src/index.js | 13 + 5 files changed, 1211 insertions(+) create mode 100644 mission/nodejs_project/.gitignore create mode 100644 mission/nodejs_project/.vscode/settings.json create mode 100644 mission/nodejs_project/package-lock.json create mode 100644 mission/nodejs_project/package.json create mode 100644 mission/nodejs_project/src/index.js diff --git a/mission/nodejs_project/.gitignore b/mission/nodejs_project/.gitignore new file mode 100644 index 0000000..40b878d --- /dev/null +++ b/mission/nodejs_project/.gitignore @@ -0,0 +1 @@ +node_modules/ \ No newline at end of file diff --git a/mission/nodejs_project/.vscode/settings.json b/mission/nodejs_project/.vscode/settings.json new file mode 100644 index 0000000..baad46d --- /dev/null +++ b/mission/nodejs_project/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "javascript.preferences.importModuleSpecifierEnding": "js" +} \ No newline at end of file diff --git a/mission/nodejs_project/package-lock.json b/mission/nodejs_project/package-lock.json new file mode 100644 index 0000000..8ffb3bb --- /dev/null +++ b/mission/nodejs_project/package-lock.json @@ -0,0 +1,1174 @@ +{ + "name": "nodejs_project", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "nodejs_project", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "express": "^5.0.0" + }, + "devDependencies": { + "nodemon": "^3.1.7" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.0.1.tgz", + "integrity": "sha512-PagxbjvuPH6tv0f/kdVbFGcb79D236SLcDTs6DrQ7GizJ88S1UWP4nMXFEo/I4fdhGRGabvFfFjVGm3M7U8JwA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "3.1.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.5.2", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "^3.0.0", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/body-parser/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz", + "integrity": "sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.0.0.tgz", + "integrity": "sha512-V4UkHQc+B7ldh1YC84HCXHwf60M4BOMvp9rkvTUWCK5apqDC1Esnbid4wm6nFyVuDy8XMfETsJw5lsIGBWyo0A==", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.0.1", + "content-disposition": "^1.0.0", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "^1.2.1", + "debug": "4.3.6", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "^2.0.0", + "fresh": "2.0.0", + "http-errors": "2.0.0", + "merge-descriptors": "^2.0.0", + "methods": "~1.1.2", + "mime-types": "^3.0.0", + "on-finished": "2.4.1", + "once": "1.4.0", + "parseurl": "~1.3.3", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "router": "^2.0.0", + "safe-buffer": "5.2.1", + "send": "^1.1.0", + "serve-static": "^2.1.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "^2.0.0", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.0.0.tgz", + "integrity": "sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz", + "integrity": "sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w==", + "dependencies": { + "mime-db": "^1.53.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/router": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.0.0.tgz", + "integrity": "sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ==", + "dependencies": { + "array-flatten": "3.0.0", + "is-promise": "4.0.0", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "^8.0.0", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.1.0.tgz", + "integrity": "sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==", + "dependencies": { + "debug": "^4.3.5", + "destroy": "^1.2.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "http-errors": "^2.0.0", + "mime-types": "^2.1.35", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/send/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz", + "integrity": "sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA==", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz", + "integrity": "sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw==", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/mission/nodejs_project/package.json b/mission/nodejs_project/package.json new file mode 100644 index 0000000..d7551ae --- /dev/null +++ b/mission/nodejs_project/package.json @@ -0,0 +1,20 @@ +{ + "name": "nodejs_project", + "type": "module", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node src/index.js", + "dev" : "nodemon --exec node src/index.js" + }, + "author": "", + "license": "ISC", + "description": "", + "dependencies": { + "express": "^5.0.0" + }, + "devDependencies": { + "nodemon": "^3.1.7" + } +} diff --git a/mission/nodejs_project/src/index.js b/mission/nodejs_project/src/index.js new file mode 100644 index 0000000..9db9151 --- /dev/null +++ b/mission/nodejs_project/src/index.js @@ -0,0 +1,13 @@ +//const express = require('express') // -> CommonJS +import express from 'express' // -> ES Module + +const app = express() +const port = 3000 + +app.get('/', (req, res) => { + res.send('Hello World!') +}) + +app.listen(port, () => { + console.log(`Example app listening on port ${port}`) +}) \ No newline at end of file From 495b9004c9d3fa94f304ced8b98a6415ebbbd4c7 Mon Sep 17 00:00:00 2001 From: GodUser1005 Date: Fri, 11 Oct 2024 04:47:38 +0900 Subject: [PATCH 6/7] =?UTF-8?q?mission:=203=EC=A3=BC=EC=B0=A8=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98=20=EB=82=B4=EC=9A=A9=20=EC=88=98=EC=A0=95=20=EB=B0=8F?= =?UTF-8?q?=20=EB=B3=B4=EC=B6=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mission/chapter03/mission.md | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/mission/chapter03/mission.md b/mission/chapter03/mission.md index e3cc7c2..c955038 100644 --- a/mission/chapter03/mission.md +++ b/mission/chapter03/mission.md @@ -2,7 +2,7 @@ ### 홈 화면 1. 홈 화면 보여주기 - - API Endpoint : + - API Endpoint : ``` GET http://umc.com/home ``` @@ -11,7 +11,7 @@ Bearer Token ``` 2. 미션 도전 - - API Endpoint : + - API Endpoint : ``` POST http://umc.com/missions/{mission-id} ``` @@ -29,7 +29,7 @@ ### 마이페이지 리뷰 작성 1. 리뷰 작성하기 - - API Endpoint : + - API Endpoint : ``` POST http://umc.com/users/reviews ``` @@ -51,7 +51,7 @@ content-type : Application/json ``` 2. 내가 작성한 리뷰 - - API Endpoint : + - API Endpoint : ``` GET http://umc.com/users/reviews ``` @@ -64,7 +64,7 @@ ### 미션 목록 조회 1. 진행 중인 미션 조회 - - API Endpoint : + - API Endpoint : ``` GET http://umc.com/users/missions ``` @@ -77,7 +77,7 @@ Bearer Token ``` 2. 완료된 미션 조회 - - API Endpoint : + - API Endpoint : ``` GET http://umc.com/users/missions ``` @@ -93,10 +93,16 @@ --- ### 미션 성공 누르기 1. 미션 성공 - - API Endpoint : + - API Endpoint : ``` - PATCH http://umc.com/users/missions/{mission-id}/success + PATCH http://umc.com/users/missions/{mission-id} ``` + - Request body : + ``` + { + "status" : "2" + } + ``` - Path variable : ``` mission-id @@ -108,7 +114,7 @@ --- ### 회원가입 1. 회원가입 - - API Endpoint : + - API Endpoint : ``` POST http://umc.com/users ``` From 0fce3b73af1b87bce2423236453c29684cbeaac6 Mon Sep 17 00:00:00 2001 From: GodUser1005 Date: Fri, 11 Oct 2024 04:48:03 +0900 Subject: [PATCH 7/7] =?UTF-8?q?keyword:=203=EC=A3=BC=EC=B0=A8=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20=EC=A0=95=EB=A6=AC=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyword/chapter03/keyword.md | 99 +++++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/keyword/chapter03/keyword.md b/keyword/chapter03/keyword.md index 3258a0e..feab763 100644 --- a/keyword/chapter03/keyword.md +++ b/keyword/chapter03/keyword.md @@ -1 +1,98 @@ -3주차 키워드 없습니다 \ No newline at end of file +## REST +### REST(Representational State Transfer)란? +자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든것을 의미 + +1. HTTP URI(Uniform Resource Identifier) 를 통해 자원(Resource)를 명시하고 +2. HTTP Method(POST, GET, PUT, PATCH, DELETE 등)을 통해 +3. 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다. + +### CRUD Operation +소프트웨어가 가지는 기본적인 데이터 처리기능인 Create, Read, Update, Delete를 묶어서 부르는 것이며 아래의 HTTP Method는 다음과 같이 CRUD에 해당한다. +- Create : POST +- Read : GET +- Update : PUT, PATCH +- Delete : DELETE + +### REST의 특징 +1. Server-Client(서버-클라이언트 구조) + - 자원을 가진 쪽이 Server, 자원을 요청하는 쪽이 Client가 된다 + +2. Stateless(무상태) + - HTTP 프로토콜이 Stateless Protocol 이므로 REST도 Stateless를 갖는다. + - Client의 Context를 서버에 저장하지 않는다. + - 세션, 쿠키 같은 context정보를 신경쓰지 않아도 된다 + - Server는 Client의 각 요청을 완전 별개의 것으로 인식하고 처리한다. + - Client가 이전에 어떤 요청을 했다고 해서 그 요청과 어떠한 연관성도 가지지 않는다. + - Server의 처리방식에 일관성을 부여하고 부담이 줄어드며, 서비스의 자유도가 높아진다. + +3. Cacheable(캐시 처리 가능) + - HTTP 프로토콜을 그대로 사용하기 때문에 HTTP의 가장 강력한 특징 중 하나인 캐싱기능을 적용할 수 있다. + - Last-Modified 태그나 E-Tag를 이용해 캐싱구현이 가능하다 + - 대량의 요청을 효율적으로 처리하기위해 캐시가 필요된다. + - 캐시 사용을 통해 응답시간이 빨라지고 REST Server 트랜잭션이 발생하지 않아 응답시간, 성능, 서버의 자원이용률을 향상 시킨다. + - 캐시 메모리 처럼 반복되는 요청에 대한 데이터는 임시로 저장하여 서버까지 가지않도록 하는 것이다. + +4. Layered System(계층화) + - Client는 REST API Server만 호출 한다 + - REST Server는 여러 계층으로 구성될 수 있다. + - Proxy, gateway 같은 네트워크 기반의 중간 매체를 사용할 수 있다. + +5. Uniformed Interface(인터페이스 일관성) + - URI로 지정한 Resource에 대한 조작을 통일되고 한정적인 인터페이스로만 수행한다. +--- + +## REST API +### API란? +프로그램간의 데이터를 주고받을 수 있도록, 상호작용이 가능하도록 하는 것 +- 예시 : 어떤 프로그램에서 지도 정보를 사용하기위해 카카오맵의 API를 사용한다 + +### REST API란? +REST 기반으로 서비스 API를 구현한 것 + +### REST API의 특징 +- HTTP표준을 기반으로 구현하기 때문에, HTTP를 지원하는 프로그래밍 언어(자바, C#, 웹 등)로 서버-클라이언트를 구현할 수 있다. + +### REST API 설계 기본 규칙 +- 참고 리소스 원형 + - 도큐먼트 : 객체 인스턴스나 DB 레코드와 비슷한 개념, 컬렉션에 있는 구체적인 멤버를 지칭함 + - 컬렉션 : 서버에서 관리하는 directory resource + - 스토어 : 클라이언트에서 관리하는 리소스 저장소, 클라이언트에 종속 + +1. URI는 정보의 자원을 표현해야 한다. + - resource는 동사보다는 명사, 대문자 보다는 소문자 사용 + - resource의 도큐먼트 이름으로는 단수명사를 사용해야 한다. + - GET items/1 + - resource의 컬렉션 이름으로는 복수명사를 사용해야 한다. + - GET items + - resource의 스토어 이름으로는 복수명사를 사용해야 한다. + +2. 자원에 대한 행위는 HTTP Method로 표현한다. + - URI에 HTTP method가 들어가선 안된다. + - URI에 행위에 대한 동사표현이 들어가선 안된다. + - 경로부분중 변하는 부분은 유일한(unique) 값으로 대체한다(Path variable) + + +### REST API 설계 규칙 +1. 슬래시 구분자(/)는 계층 관계를 나타내는데 사용한다. +2. URI 마지막 문자로 슬래시(/)를 포함하지 않는다. + - GET http://umc.com/users/missions/ (x) +3. 하이픈(-)은 URI 가독성을 높이는데 사용한다. +4. 언더스코어(_)는 URI에 사용하지 않는다. +5. URI 경로에는 소문자를 사용한다.(대소문자가 구별이 되므로) +6. 파일확장자는 URI에 포함하지 않는다. + - REST API에서 메시지 바디 내용을 포맷을 나타내기 위한 파일 확장자를 URI안에 포함시키지 않는다. + - Accept header를 사용한다. +7. 리소스 간에는 연관 관계가 있는 경우 + - /리소스명/리소스ID/관계가 있는 다른 리소스명 + - ex) GET /users/{userid}/devices + + +--- +## RESTful API +### RESTful 이란? +- REST 원리를 따르는 시스템을 RESTful 하다 라고 지칭한다 + +- RESTful한 API를 구현하는 근본적인 목적이 성능 향상에 있는 것이 아니라 일관적인 컨벤션을 통한 API의 이해도 및 호환성을 높이는 것이 주 동기이니, 성능이 중요한 상황에서는 굳이 RESTful한 API를 구현할 필요는 없다. + + +