ํด๋น ๊ธ์ ์ค์น, ์ ์ ๋ฐฉ๋ฒ์ด ์ฃผ๊ฐ ์๋ postman ์ฝ๋ ์ฐ๊ฒฐ, ์์ฒญ ํ์ธ๋ฑ์ ์์ฃผ๋ก ์์ฑํ์์ต๋๋ค! :)
"API์ ๊ฐ๋ฐ์ ๋น ๋ฅด๊ณ ์ฝ๊ฒ, ๊ฐ๋ฐ๋ API๋ฅผ ํ ์คํธํ ์ ์๊ณ ,ํ์๋ค๊ฐ์ ๊ณต์ ๋ฅผ ํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋ซํผ์ ๋๋ค."
API๋ Application Programming Interface์ ์ฝ์์ ๋๋ค.
API์ ๋งฅ๋ฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ๋จ์ด๋ ๊ณ ์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๋ชจ๋ ์ํํธ์จ์ด๋ฅผ ๋ํ๋ ๋๋ค.
์ธํฐํ์ด์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ์๋น์ค ๊ณ์ฝ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
interface๋ฅผ ์ฝ๊ฒ ์ค๋ช ํด๋ณด๋ฉด ํ์ด๋ณด๋ฉด, ์ด๋ค ๋ ๋งค๊ฐ์ฒด๊ฐ ์ํธ์์ฉํ์ฌ ์ํฅ์ ๋ผ์น ์ ์๋ ์ด๋ ํ ์์๋ค์ ์๋ฏธํฉ๋๋ค.์์๋ค์ ์์๋ก ์ฌ๋๊ณผ ์ฌ๋, ๊ธฐ๊ณ์ ๊ธฐ๊ณ, ์ฌ๋๊ณผ ๊ธฐ๊ณ์ ๊ด๊ณ๋ฑ์ ๋ํ๋ผ ์ ์์ต๋๋ค.
์์๋ก ์ฐ๋ฆฌ๊ฐ ์ปดํจํฐ์ ๊ธ์ ์
๋ ฅํ๊ณ ์ถ์๋, ํค๋ณด๋๋ฅผ ์ฌ์ฉํด ๊ธ์ ์
๋ ฅํ๊ฒ ๋ ๊ฒ ์
๋๋ค.
์ด๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ํค๋ณด๋๊ฐ ์ฌ๋๊ณผ ์ปดํจํฐ ์ฌ์ด์ ์ธํฐํ์ด์ค๊ฐ ๋๋ ๊ฒ๋๋ค.
์ด ๊ณ์ฝ์ ์์ฒญ๊ณผ ์๋ต์ ์ฌ์ฉํ์ฌ ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ์ด๋๋ป์ ์ ์ํฉ๋๋ค.
์ด๋๋ ์ปดํจํฐ๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ํ ์์์ด ํ์ํ ๊ฒ์ด๊ณ
API ๋ฌธ์์๋ ๊ฐ๋ฐ์๊ฐ ์ด๋ฌํ ์์ฒญ๊ณผ ์๋ต์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด ์์ต๋๋ค.
์ฌ๋ฟ ๊ณต์์ฌ์ดํธ์ ๋ค์ด๊ฐ๋ฉด ๊ฐ ํ์ฌ์ API๊ฐ ์กด์ฌํ๋ ๊ณณ์ด ์์ต๋๋ค.
ํด๋น API์๋ key๊ฐ ์กด์ฌ ํ ๊ฒ์ด๊ณ , ๊ทธ์๋ฐ๋ฅธ ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ์ ํ์์ผ๋ ์ฐธ๊ณ ํ๋ฉด ๋ ๊ฒ์ด๋ค.
express.js๋ฅผ ํตํด ๋ง๋ ๊ฐ๋จํ API๋ฅผ ํตํด Postman์ ํ
์คํธ ํด๋ณด์
๋จผ์ ๊ฐ๋จํ ์ฌ์ฉ๋ฒ์ ์์๋๋ก ๋ณด์ฌ์ฃผ๋ฉด
์ฌ์ง์์ ๋ณด์ด๋ 1๋ฒ(new button)์ ๋๋ฅธ ํ 2๋ฒ(HTTP icon)์ ์ ํํด์ค๋ค.
API์ ์์ฑํ ์์ฒญ(Get,Post๋ฑ)์ ์ ์ด์ฃผ๊ณ ์ฌ๋ฐ๋ฅธ ์ฃผ์ ๊ฐ(localhost:3000)์ ๋ฃ์ด์ค ํ API๋ช
๋ น์ ๋ฐ๋ผ ์์ฑํด์ฃผ๋ฉด๋๋ค.
์์ ์ ์๋ฒ๋ฅผ ๊ผญ ์ผ์ฃผ์ธ์
//ํด๋น ๋์ ์ค์ ๊ฐ์ ๋ณด์ฌ์ฃผ๊ธฐ์ํด ์์ฑ๋์์ต๋๋ค.
const express = require('express');
const app = express();
const cors = require('cors');
app.use(cors()); // ์ฟ ํค ํ์ฑ ๋ฏธ๋ค์จ์ด
app.use(express.json()); // JSON ์์ฒญ ๋ณธ๋ฌธ ํ์ฑ
// sample DB
![](https://velog.velcdn.com/images/yoon_min/post/1609075f-4394-4f99-8139-29d50e5ae60f/image.png)
//Port | ํฌํธ๋ ์์ ๋ก 3003์ ์์๋ก ์ก์
const PORT = 3003;
app.listen(PORT, () => {
console.log(`์๋ฒ๊ฐ http://localhost:${PORT}์์ ์คํ ์ค`);
});
๋จผ์ ๊ฐ๋จํ get ์์ฒญ์ postman์ผ๋ก ํ์ธํด๋ณด์
// ๊ณต๊ฐ ๋ผ์ฐํธ
app.get('/', (req, res) => {
res.send('๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ ๊ทผ ๊ฐ๋ฅ');
});
ํด๋น ์ฝ๋๋ฅผ ์์ฑ ํ Postman์์ ์ ์์๋ํ๋์ง ์์ฒญ์ ๋ฐ์๋ณด๋ฉด
์ด๋ ๊ฒ ์๋ฐ์์ค๋๊ฑธ ํ์ธ ํ ์ ์๋ค.
๋ค๋ฅธ ์์๋ ํด๋ณด์
ํด๋น ์ฝ๋๋ ๊ฐ๋จํ ๋ก๊ทธ์ธ API์ ๋๋ค.
์ฝ๋ ์ฃผ์์ ์๋ณด๋ฉฐ ๋ฐ๋ผ๊ฐ์๊ธธ ์ถ์ฒ๋๋ฆฝ๋๋ค!
// Login API
app.post('/login', (req, res) => { //login ๊ฒฝ๋ก request, response์์ฒญ
const {username, password} = req.body; // ์์ฒญ body์ username, password๊ฐ ์์ด์ผํด
if (sample_db.id === username && sample_db.password === password) { //์ํ DB์ username๊ณผ password๊ฐ ๋์ผํ๋ค๋ฉด
const token = jwt.sign({ userId: sample_db.id, role: sample_db.role }, SECRET_KEY, { expiresIn: '1h' });//JWT ํ ํฐ์ 1์๊ฐ๋์ ์์ฑํด์ค
res.send({ token }); // response์ ํ ํฐ์ ๋ฃ์ด์ค
}
else {
res.status(401).send('Invalid username or password'); //ํ๋ฆฌ๋ฉด 401 ์ํ์ ํด๋น ๋ฉ์์ง๋ฅผ ์ ์กํด์ค
}
});
์! ์ฝ๋ ์ฃผ์์ ์ ๋ฐ๋ผ๊ฐ๋ฉฐ ๋ดค์ผ๋ฉด ์ด์ ๋ถํฐ Postman์์ ์์ฒญํด ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
const {username, password} = req.body; // ์์ฒญ body์ username, password๊ฐ ์์ด์ผํด
ํ๋ก์ ํธ ์๋จ์์ ๋ฌธ์ํ๋ ์ฝ๊ฒ ๊ฐ๋ฅํฉ๋๋ค.
๋ฌธ์์ ๋ค์ด๊ฐ Publish ์งํ์ ํ
์คํธ ์งํ๋ API๋ค์ด ์ ๋ฆฌ๋๊ธฐ์ ์ฌ์ฉ์์๊ฒ ๋งํฌ๋ง ์ ๋ฌํ๊ฒ๋๋ฉด
๋ณด๋ค ์ฌ์ด ํ์
์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด์ ์ด Postman์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ผ ์๊ฐํฉ๋๋ค.
ํด๋น ์ฌ์ง์ ๋ฌธ์ํ๊ฐ๋ ์์ ์ฌ์ง์
๋๋ค.
HTTP ์์ฒญ ๋ณด๋ด๊ธฐ
: GET, POST, PUT, DELETE ๋ฑ์ HTTP ์์ฒญ์ ๋ณด๋ผ ์ ์๋ค.
์์ฒญ ํ๋ผ๋ฏธํฐ ์ค์
: HTTP ์์ฒญ์ ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฝ๊ฒ ์ค์ ํ ์ ์๋ค.
์๋ต ํ์ธ
: HTTP ์์ฒญ์ ๋ํ ์๋ต์ ํ์ธํ๊ณ , JSON, XML ๋ฑ์ ๋ค์ํ ํ์์ผ๋ก ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ค.
ํ์คํ ๋ฆฌ ๊ด๋ฆฌ
: ์ด์ ์ ๋ณด๋ธ HTTP ์์ฒญ๊ณผ ์๋ต์ ์ ์ฅํ๊ณ , ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
ํ๊ฒฝ ๋ณ์ ์ค์
: ์๋ก ๋ค๋ฅธ ํ๊ฒฝ์์ ๋์ผํ HTTP ์์ฒญ์ ๋ณด๋ด์ผ ํ๋ ๊ฒฝ์ฐ, ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
API ๋ฌธ์ํ
: API ์์ฒญ๊ณผ ์๋ต์ ๋ฌธ์ํํ๊ณ , ๋ค๋ฅธ ๊ฐ๋ฐ์์ ๊ณต์ ํ ์ ์๋ค.
Postman์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ค์ํ ํ ํ๋ฆฟ๊ณผ ์์ ์ฝ๋๋ฅผ ์ ๊ณตํด์ฃผ์ด ์ฌ์ฉ์๊ฐ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก API๋ฅผ ํ ์คํธํ๊ณ ๊ฐ๋ฐํ ์ ์๋๋ก ๋์์ค๋ค.