- ๐ nodemon์ ํ์ฉํ์ฌ refresh ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
- ๐ ๋ผ์ฐํ (Routing)์ด๋?
- ๐ Rest-API ๋ง๋ค๊ธฐ
- ๐ Rest-API ์์ฒญ ์ค์ต (POSTMAN)
- ๐ ํธ๋ํฐ ๋ฒํธ๋ฅผ ๋ฐ์ ์ธ์ฆ ํ ํฐ ๋ง๋ค๊ธฐ -> Rest-API๋ก ๋ง๋ค๊ธฐ
- ๐ Swagger๋ฅผ ํ์ฉํ API-Docs ๋ง๋ค๊ธฐ
๊ทธ๋์์ ์์ค์ฝ๋๋ฅผ ์์ ํ๊ฒ ๋๋ฉด API ์๋ต์ ๋ฐ์์ค๊ธฐ ์ ์ ๋ง์ฝ ์๋ฒ๊ฐ ์ผ์ ธ์์๋ค๋ฉด ์๋ฒ๋ฅผ ๋ซ๊ณ ๋ค์ ์ด์ด์ผ ํ๋ ๋ถํธํจ์ด ์์๋ค.
์ด๋ฌํ ๋ถํธํจ์ ํด๊ฒฐํ ์ ์๋ ๋๊ตฌ๊ฐ ์๋๋ฐ, ๋ฐ๋ก nodemon
์ด๋ค. nodemon์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์์ค์ฝ๋๋ฅผ ์์ ํ ๋๋ง๋ค ๋งค๋ฒ ์๋ฒ๋ฅผ ๋ซ๊ณ ์ฌ๋ ๊ณผ์ ์์ด ์ฆ๊ฐ์ ์ผ๋ก ์๋ฒ๊ฐ refresh๋์ด ์์ ๋ ์ฝ๋๊ฐ ์ ์ฉ๋๋ค.
์ด์ nodemon์ ์ฌ์ฉํ๊ธฐ ์ํด ํ์ํ ํ์ํ ์ ์ฐจ์ ๋ํด ์์๋ณด๋๋ก ํ์!
๋จผ์ , nodemon์ ์ค์นํ๊ณ ์ ํ๋ ํด๋์ ๋ณธ์ธ์ด ์์นํด ์๋์ง ํ์ธ๋ถํฐ ํด์ผํ๋ค. ๊ทธ ํ, ํฐ๋ฏธ๋์ ๋ช
๋ น์ด ls
๋ฅผ ์ฝ๋ ฅํ์ฌ package.json
ํ์ผ์ด ์๋์ง ํ์ธํ๋ค. ๋ง์ฝ, package.json์ด ์๋ค๋ฉด yarn init
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์ฌ ํ์ผ์ ๋ง๋ ๋ค. ํ์ธ์ด ์ ๋ถ ๋๋๋ค๋ฉด yarn add nodemon
๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์ฌ nodemon์ ์ค์นํ๋ค. ์ค์น๊ฐ ์๋ฃ๋๋ฉด package.json ํ์ผ ์์ nodemon์ด ์ถ๊ฐ๋์ด์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
package.json ํ์ผ์ scripts
๋ถ๋ถ์ ์์ฑํ์ฌ์ผ ํ๋ค. scripts ๋ถ๋ถ์ ์์ฑ์ ํตํด ์ฐ๋ฆฌ๊ฐ ์๋ฒ๋ฅผ ์คํํ ๋, ์ํ๋ ๋ช
๋ น์ด๋ฅผ ์ค์ ํ ์ ์๋ค. ์๋๋ฅผ ๋ณด๊ฒ ๋๋ฉด start:dev
๋ผ๋ ๋ช
๋ น์ด๋ฅผ ๋ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
{ "name": "03-01-rest-api-express", "version": "1.0.0", "main": "index.js", "license": "MIT", "type": "module", "scripts": { "start:dev": "nodemon index.js" }, "dependencies": { "express": "^4.18.1", "nodemon": "^2.0.19" } }
์ด์ ๋ถํฐ yarn start:dev
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๊ฐ ์ด๋ฆฌ๊ฒ ๋๋ค. ๋ฌผ๋ก ์์ ์ด ์ํ ๋, script ๋ถ๋ถ์ ์์ ํ๋ฉด ๋ค๋ฅธ ๋ช
๋ น์ด๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
ํฐ๋ฏธ๋์ ๋ณด๋ฉด
start:dev
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌnodemon
์ด ์๋๋์ด ๋ณ๋๋ก ์๋ฒ๋ฅผ ์ด๊ณ ๋ซ์ง ์์๋ ์์ค์ฝ๋๊ฐ ๋ฐ๋ก ์ ์ฉ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Nodemon ์ค์นํ๊ณ ์ฌ์ฉํ๋ ๋ฒ ์ ๋ฆฌ
- ์ค์นํ๊ณ ์ํ๋ ํด๋์ ์์น ํ์ธํ๊ธฐ
pcackage.json
ํ์ผ ์ ๋ฌด ํ์ธํ๊ธฐ (์๋ค๋ฉดyarn init
ํ์ฌ ๋ง๋ค๊ธฐ)yarn add nodemon
๋ช ๋ น์ด ์ ๋ ฅํ์ฌ nodemon ์ค์นํ๊ธฐpackage.json
ํ์ผ์์nodemon
์ถ๊ฐ๋์๋์ง ํ์ธ ํscripts
๋ถ๋ถ ์์ฑํ๊ธฐ (์์ ๋ช ๋ น์ด ๋ง๋ค๊ธฐ)
๋ผ์ฐํ
์ด๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ(Request)๋ฅผ ํ์ ๋, ์๋ต(Response)ํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋งํ๋ค.
๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
app
: express์ ์ธ์คํด์ค
METHOD
: HTTP์ ๋ฉ์๋(POST, PUT, DELETE, GET)
PATH
: ์๋ฒ์์์ ๊ฒฝ๋ก
HANDLER
: ๋ผ์ฐํฐ๊ฐ ์ผ์นํ ๋, ์คํ๋๋ ํจ์app.METHOD(PATH, HANDLER)
// ํํ์ด์ง์์ 'Hello World!๋ก ์๋ต' app.get('/', function (req, res) { res.send('Hello World!'); }); // user ๋ผ์ฐํธ์ ๋ํ PUT ์์ฒญ์ ์๋ต app.put('/user', function (req, res) { res.send('Got a PUT request at /user'); });
Rest-api์์ ์กฐํํ๋ ๋ฉ์๋๋ GET
์ด๋ค. ๋ฐ๋ผ์ ๋ง์ฝ /boards
๋ผ๋ ์๋ํฌ์ธํธ๋ก GET ์์ฒญ์ด ๋ค์ด์จ๋ค๋ฉด, ๋ฐ์ดํฐ๊ฐ ์กฐํ๋ ์ ์๋๋ก ๋ก์ง์ ์์ฑํ์ฌ์ผ ํ๋ค.
์์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ถ๋ถ์ ํ์ตํ์ง ๋ชปํด ๋น์ฅ์ ๊ฒฐ๊ณผ๊ฐ์ ํ๋ํ๋ ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๊ณ ์ค์ต์ ์งํํ๋ค.
๋ณดํต ๋ฐ์ดํฐ๋ ํ๋์ ๊ฐ์ผ๋ก๋ง ์๋ ๊ฒฝ์ฐ๋ ๋ง์ด ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ๋ฐ์ดํฐ๊ฐ ๊ตฌ์ฑ๋์ด ์์ ๋๋ ๋ฐฐ์ด ์์ ๊ฐ์ฒด๊ฐ ๋ค์ด์๋ ํํ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ฆ, ๊ฒ์๊ธ ํ๋๋ ๊ฐ์ฒด๋ก ํํํ๊ณ , ๊ฒ์๊ธ๋ค์ ๋ชจ์ result๋ผ๋ ํ๋์ ๋ฐฐ์ด์ ๋ด๋ ํ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
์๋์ get
ํจ์๋ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ํ์ดํ ํจ์๋ฅผ ๋ฐ๊ณ ์์ผ๋ฉฐ, req
์ res
๋ผ๋ ๋ณ์๋ค์ ๋ฐ๊ณ ์๋ค. req๋ (request)๋ฅผ ์ค์ฌ์ ์ฌ์ฉํ๋ ๋ณ์๋ช
์ด๋ฉฐ, ์ฌ๊ธฐ์๋ ๋ธ๋ผ์ฐ์ ์์ ๋ณด๋ธ HTTP ์์ฒญ์ด ๋ค์ด์๋ค.
res๋ (response)๋ฅผ ์ค์ฌ ์ฌ์ฉํ๋ ๋ณ์๋ช
์ด๋ฉฐ, ์๋ฒ์์ ๋ธ๋ผ์ฐ์ ๋ก ์๋ต์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ค.
// index.js // const express = require('express') import express from 'express' const app = express() app.get('/boards', (req, res) => { // 1. ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ก์ง => DB์ ์ ์ํด์ ๋ฐ์ดํฐ ๊บผ๋ด์ค๊ธฐ const result = [ { number: 1, writer: "์ฒ ์", title: "์ ๋ชฉ์ ๋๋ค~~", contents: "๋ด์ฉ์ด์์!!!" }, { number: 2, writer: "์ํฌ", title: "์ํฌ์ ๋๋ค~~", contents: "์ํฌ์ด์์!!!" }, { number: 3, writer: "ํ์ด", title: "ํ์ด์ ๋๋ค~~", contents: "ํ์ด์ด์์!!!" }, ] // 2. ๊บผ๋ด์จ ๊ฒฐ๊ณผ ์๋ต ์ฃผ๊ธฐ res.send(result); }); app.listen(3000, () => { console.log("๋ฐฑ์๋ API ์๋ฒ๊ฐ ์ผ์ก์ด์!!!") })
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ฒ์๊ธ์ ๋ฑ๋กํ๋ API๋ฅผ ๋ง๋ค์ด๋ณด์!
๋ฐ์ดํฐ๋ฅผ ๋ฑ๋กํ๋ ๋ฉ์๋๋ POST
์ด๋ค. ๋ฐ๋ผ์ /boards
๋ก POST
์์ฒญ์ด ์์ ๋, ๋ฐ์ด๋ฒ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฒ์ผ๋ก ๊ฐ์ ์ ํ๊ณ '๊ฒ์๋ฌผ ๋ฑ๋ก์ ์ฑ๊ณตํ์์ต๋๋ค!!'๋ผ๋ ์๋ต ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋๋ก ํด๋ณด์.
ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ ๋ณด๋ธ(request) ๋ฐ์ดํฐ๋ req
์ ์ ์ฅ ๋์ด ์๋ค. ์ฌ๊ธฐ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ดํด๋ณด๊ฒ ๋๋ฉด ์ค์ ๋ฐ์ดํฐ๋ req.body
์์ ๋ด๊ฒจ์ ธ ์ค๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ req.body ๊ฐ์ฒด ์์ ์๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๊ธฐ ์ํด ํ์ธ์ ํ๊ณ res.send()
๋ฅผ ํตํด ์๋ต ๋ฉ์์ง๋ฅผ ๋ณด๋ธ๋ค. ์ด๋ฒ ์ค์ต๋๋ ์์ง ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐฐ์ฐ์ง ๋ชปํด ํ๋์ฝ๋ฉ์ผ๋ก ๋์์ด ์ด๋ฃจ์ด์ก์ง๋ง, ํฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ต์ ํตํด api๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ์ง๊ธ์ ํ์ต ๋ก์ง์ด ๋งค์ฐ ์ค์ํ๋ค!!
// index.js // const express = require('express') import express from 'express'; const app = express(); app.get('/boards', (req, res) => { // 1. ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ก์ง => DB์ ์ ์ํด์ ๋ฐ์ดํฐ ๊บผ๋ด์ค๊ธฐ const result = [ { number: 1, writer: "์ฒ ์", title: "์ ๋ชฉ์ ๋๋ค~~", contents: "๋ด์ฉ์ด์์!!!" }, { number: 2, writer: "์ํฌ", title: "์ํฌ์ ๋๋ค~~", contents: "์ํฌ์ด์์!!!" }, { number: 3, writer: "ํ์ด", title: "ํ์ด์ ๋๋ค~~", contents: "ํ์ด์ด์์!!!" }, ] // 2. ๊บผ๋ด์จ ๊ฒฐ๊ณผ ์๋ต ์ฃผ๊ธฐ res.send(result); }); app.post('/boards', (req, res) => { // 1. ๋ธ๋ผ์ฐ์ ์์ ๋ณด๋ด์ค ๋ฐ์ดํฐ ํ์ธํ๊ธฐ console.log(req) console.log("=========================") console.log(req.body) // ์ถ๊ฐ // 2. DB์ ์ ์ ํ, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ => ๋ฐ์ดํฐ ์ ์ฅํ๋ค๊ณ ๊ฐ์ // 3. DB์ ์ ์ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์๋ต(response) ์ฃผ๊ธฐ res.send("๊ฒ์๋ฌผ ๋ฑ๋ก์ ์ฑ๊ณตํ์์ต๋๋ค.") }); app.listen(3000, () => { console.log("๋ฐฑ์๋ API ์๋ฒ๊ฐ ์ผ์ก์ด์!!!"); });
์ง๊ธ๊น์ง ์๋ฒ๋ฅผ ์ฌ๋ ๊ฒ๋ ๋ฐฐ์ฐ๊ณ , api๋ก ์์ฒญ์ ๋ณด๋์ ๋, ์๋ต์ ๋ฐ๋ ๋ก์ง๋ ํ์ตํ์๋ค.
์ด์ ์ค์ ๋ก api์ ์์ฒญ์ ๋ณด๋ด๋ณด๋๋ก ํ์!
rest-api ์ค์ต์ ์ํด POSTMAN
์ ํ์ฉํด๋ณด๋๋ก ํ์.
postman ํ์ด์ง์ ์ ์ํ์ฌ api์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด ๋จผ์ ์กฐํ๋ฅผ ํ๊ธฐ ์ํ ๋ฉ์๋์ธ GET์ ์ ํํ๊ณ ,
URL์ ์ ์ด์ค๋ค. ์ฌ๊ธฐ์ ํฌํธ๋ฒํธ๊ฐ 3000๋ฒ์ธ ์ด์ ๋ ์์ ์ฐ๋ฆฌ๊ฐ 3000๋ฒ ํฌํธ๋ฒํธ๋ก ์ค์ ์ ํด์ฃผ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ๋ชจ๋ ์ค๋น๋ ๋์ด๋ฌ๋ค. api ๋ก์ง์ด ์ด์์ด ์๋ค๋ฉด, send ๋ฒํผ ํด๋ฆญ ์ดํ, ๊ฒฐ๊ณผ๊ฐ ์๋์ฒ๋ผ ์๋ตํด์ฃผ๊ฒ๋๋ค.
๋ค์์ ๊ฒ์๊ธ ๋ฑ๋ก์ ํด๋ณด์!
์์ ํด๋ณธ ์กฐํ์ ์ ์ฒด์ ์ธ ๋งฅ๋ฝ์ ๋น์ทํ์ง๋ง, ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค.
๋จผ์ , ๋ฉ์๋๋ฅผ ๋ฑ๋ก์ ํ๊ธฐ ์ํด POST
๋ก ๊ต์ฒดํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒ์๋ฌผ์ ๋ฑ๋กํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํ๋ค. ์ด ๋ฐ์ดํฐ๋ body์ ๋ด๊ฒจ์ค๋ ๋ฐ์ดํฐ์ด๋ค.
์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ์๋ฉด req.body์์ ๋ด๊ฒจ์๋ค.
์ด์ body ๋ฒํผ์ ํด๋ฆญํ๋ค, rawํ์์ JSON์ ์ ํํ๊ณ ์๋์ ์ฌ์ง๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
send ๋ฒํผ์ ๋๋ฅด๊ฒ ๋๋ฉด '๊ฒ์๋ฌผ ๋ฑ๋ก์ ์ฑ๊ณตํ์์ต๋๋ค'๋ผ๋ ๋ฉ์์ง๊ฐ ๋ํ๋๊ฒ ๋๋ค.
POSTMAN์์ ์๋ต์ ํ์ธํ ํ, ์์ฒญ ๊ฐ์ด ์๋ค์ด์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ์์ฐฝ์ ํ์ธํด๋ณด๋ฉด req๋ ์ ๋์์ง๋ง req.body๋ undefined
๊ฐ ๋์จ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์งธ์ ๊ทธ๋ฐ ๊ฒ์ผ๊น?
express
ํ๋ ์์ํฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก json
ํํ๋ฅผ ์ง์ํ๊ณ ์์ง ์๋ค!!
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ฒ์์ json์ ์ฝ์ ์ ์๋๋ก app.use(express.json())
์ฝ๋๋ฅผ ์์ฑํด์ฃผ์ด์ผ ์ ์์ ์ผ๋ก req.body๋ฅผ ์ฝ์ ์ ์๋ค.
// index.js import express from 'express'; const app = express(); app.use(express.json()); // ์ถ๊ฐ๋ ์ฝ๋ app.get('/boards', (req, res) => { // ... ์๋ต
ํธ๋ํฐ ๋ฒํธ๊ฐ ์ ์์ ์ผ๋ก ์
๋ ฅ ๋ฐ์๋์ง ๊ฒ์ฆํ ๋ค, ์ธ์ฆ๋ฒํธ๋ฅผ ์ ์กํด์ฃผ๋ api๋ฅผ ๋ง๋ค์ด๋ณด์!!
์๋๋ ๋ฒํธ๊ฐ ์ ์์ ์ธ์ง ๊ฒ์ฆํ๋ ๋ก์ง์ด๋ค.
// 1. ํด๋ํฐ๋ฒํธ ์๋ฆฟ์ ๋ง๋์ง ํ์ธํ๊ธฐ(10~11์๋ฆฌ)
const isValid = checkPhone(myphone);
if (isValid === false) return;
// 2. ํธ๋ํฐ ํ ํฐ 6์๋ฆฌ ๋ง๋ค๊ธฐ
const mytoken = getToken();
// 3. ํธ๋ํฐ๋ฒํธ์ ํ ํฐ ์ ์กํ๊ธฐ
sendTokenToSMS(myphone, mytoken);
์ด์ ์ ์์ค์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก POST ์์ฒญ์ด ์์ ๋, ์ฒ๋ฆฌํด์ฃผ๋ api๋ฅผ ๋ง๋ค์ด๋ณด์
myphone ๋ณ์์ req.body.qqq ์ฆ, ํด๋ํฐ ๋ฒํธ๋ฅผ ๋ฐ์ ๊ฒ์ฆ๊ณผ์ ์ ๊ฑฐ์น ๋ค, ์ธ์ฆ๋ฒํธ๋ฅผ responseํ์ฌ ์ ๋ฌํ๋ ๊ณผ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
// index.js app.post("/tokens/phone", (req, res) => { const myphone = req.body.qqq; // 1. ํด๋ํฐ๋ฒํธ ์๋ฆฟ์ ๋ง๋์ง ํ์ธํ๊ธฐ(10~11์๋ฆฌ) const isValid = checkPhone(myphone); if (isValid === false) return; // 2. ํธ๋ํฐ ํ ํฐ 6์๋ฆฌ ๋ง๋ค๊ธฐ const mytoken = getToken(); // 3. ํธ๋ํฐ๋ฒํธ์ ํ ํฐ ์ ์กํ๊ธฐ sendTokenToSMS(myphone, mytoken); res.send("์ธ์ฆ์๋ฃ!!!"); });
์ถ๊ฐ์ ์ผ๋ก, ์ฌ๊ธฐ์ ๊ทธ๋ฅ POSTMAN์ ํตํด ์์ฒญ์ ๋ ๋ฆฌ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. ์๋ํ๋ฉด index.js ํ์ผ ๋ด๋ถ์๋ checkPhone
, getToken
, sendTokenToSMS
ํจ์(๊ฒ์ฆ ๋ก์ง)์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ import
๋ฅผ ํตํด phone.js์ index.js๋ฅผ ์ฐ๊ฒฐํด์ผํ๋ค.
์ต์ข ๋ณธ
// phone.js export function checkPhone(myphone){ if(myphone.length < 10 || myphone.length > 11){ console.log("์๋ฌ ๋ฐ์!!! ํธ๋ํฐ ๋ฒํธ๋ฅผ ์ ๋๋ก ์ ๋ ฅํด ์ฃผ์ธ์!!!") return false } else { return true } } export function getToken(){ const result = String(Math.floor(Math.random() * 1000000)).padStart(6, "0") console.log(result) return result } export function sendTokenToSMS(myphone, result){ console.log(myphone + "๋ฒํธ๋ก ์ธ์ฆ๋ฒํธ " + result + "๋ฅผ ์ ์กํฉ๋๋ค.") } // index.js import express from 'express' import { checkPhone, getToken, sendTokenToSMS } from "./phone.js"; // export ๊ฐ์ ธ์ค๊ธฐ const app = express() app.use(express.json()) // ...์๋ต
์ด์ POSTMAN์ผ๋ก ๊ฒ์ฆ์ด ์๋๋์ง ํ์ธํด๋ณด์!
Swagger
๊ฐ ๋ฌด์์ผ๊น?
swagger๋ rest api๋ฅผ ์ฝ๊ฒ ๋ฌธ์ํํ๊ณ ํ
์คํธํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ์ด๋ค!!
Node.js๋ก ๋ง๋ api๋ฅผ swagger์ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ค์นํด์ผ ํ๋ npm ๋ชจ๋์ด ๋ ๊ฐ์ง๊ฐ ์๋ค.
yarn add swagger-ui-express
swagger-jsdoc
ํ๋ฒ์ ์ค์นํ๊ธฐ
yarn add swagger-ui-express swagger-jsdoc
swagger ๋ฌธ์์ ๊ด๋ จ๋ ํ์ผ์ ๋ฐ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ณดํต swagger ํด๋๋ฅผ ์๋ก ๋ง๋ค์ด ์์ ์ ์งํํ๋ค.
์ด์ swagger-jsdoc
npm์ ์ฐธ๊ณ ํด๋ณด์!!
์ด ํ ๋ง๋ค๊ณ ์ถ์ swagger์ ํ์์ ์ฐพ๋๋ค๋ฉด swagger ํด๋ ์์ (api์ด๋ฆ).swagger.jsํ์ผ์ ๋ง๋ค๊ณ npm์ ๋ด์ฉ์ ๋ฃ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก swagger๋ฅผ ๋ง๋ค๋, ๋ค์ฌ์ฐ๊ธฐ์ ๋งค์ฐ ๋ฏผ๊ฐํ๊ธฐ ๋๋ฌธ์ ํญ์ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ ๊ฒฝ์จ์ผ ํ๋ค!!!
/**
* @swagger
* /boards:
* get:
* summary: ๊ฒ์๊ธ ๊ฐ์ ธ์ค๊ธฐ
* tags: [Board]
* parameters:
* - in: query
* name: number
* type: int
* responses:
* 200:
* description: ์ฑ๊ณต
* content:
* application/json:
* schema:
* type: array
* items:
* properties:
* number:
* type: int
* example: 3
* writer:
* type: string
* example: ์ฒ ์
* title:
* type: string
* example: ์ ๋ชฉ์
๋๋ค~~~
* contents:
* type: string
* example: ๋ด์ฉ์
๋๋ค!!!
*/
>
/**
* @swagger
* /boards:
* post:
* summary: ๊ฒ์๊ธ ๋ฑ๋กํ๊ธฐ
* tags: [Board]
* responses:
* 200:
* description: ์ฑ๊ณต
*/
์ด์ ๋ค์์ผ๋ก ํด์ผํ๋ ๊ฒ์ผ api ๋ฌธ์๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ค์ ์ด ํ์ํ๋ค.
swagger ํด๋์ config.js
ํ์ผ์ ์๋กญ๊ฒ ๋ง๋ค์ด ์ค์ ์ ๋ถ๋ฆฌํด์ฃผ์
// config.js
>
export const options = {
definition: {
openapi: '3.0.0',
info: {
title: '๋๋ง์ ๋ฏธ๋ํ๋ก์ ํธ API ๋ช
์ธ์!!',
version: '1.0.0',
},
},
apis: ['./swagger/*.swagger.js'], // files containing annotations as above
};
swagger.json ํ์ผ์ ํตํด ์์ฑ๋ ์ค์จ๊ฑฐ ๋ฌธ์๋ฅผ express์ ์ ๊ณตํ๋ swagger ui express
๋ฅผ ํ์ฉํด๋ณด์.
์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ์์ฑํ๋ฉด ๋๋ค.
// index.js
>
import swaggerUi from 'swagger-ui-express'
import swaggerJSDoc from 'swagger-jsdoc'
import { options } from './swagger/config.js'
>
// ...์๋ต
>
app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerJSDoc(options)));
>
// ...์๋ต
์ด์ ์ค์ ํ ์ฃผ์์ธ (http://localhost:3000/api-docs/) ์ ์ํด๋ณด๋ฉด api-docs๊ฐ ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ api๋ฅผ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์์ํ ํ๋ฃจ์ธ ๊ฒ ๊ฐ๋ค. ๋๋ฌด๋ ๋ง์ ๋ด์ฉ์ ํ์ตํ์ฌ ์์ง ์๋ฒฝํ ๋ด๊ฒ์ด ๋๊ฒ ๊ฐ์ง ์์ง๋ง, ํ์ตํ๋ ๊ณผ์ ์์ ์ฆ๊ฒ๊ฒ ๋ก์ง์ ์๊ฐํ๊ณ ๊ณต๋ถํ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ์ด์ ์์์ด์ง๋ง ํ๋์ฉ ์ฑ์๋๊ฐ๋ฉฐ, ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก์ ๊ฟ์ ์ด๋ฃจ๊ณ ์ถ๋ค!!
๋ณต์ต!!๋ณต์ต!!๋ณต์ต!! ๋ณต์ต์ด ์ ์ผ ์ค์ํ๋ค!!