๐ธ ๊ฐ์ ์ถ์ฒ(origin)์ ๋ฆฌ์์ค๋ง ๊ณต์ ๊ฐ ๊ฐ๋ฅ.
๐ธ ์ถ์ฒ๋ ํ๋กํ ์ฝ, ํธ์คํธ, ํฌํธ์ ์กฐํฉ์ผ๋ก, ์ด ์ค ํ๋๋ผ๋ ๋ค๋ฅด๋ฉด ๋์ผํ ์ถ์ฒ๋ก ๋ณด์ง ์์.
๐ธ SOP๋ ์ ์ฌ์ ์ผ๋ก ํด๋ก์ธ ์ ์๋ ๋ฌธ์๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ณต๊ฒฉ๋ฐ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ค์ฌ์ค. ์ฆ, ํดํน ๋ฑ์ ์ํ์ผ๋ก๋ถํฐ ๋ณด๋ค ์์ .
๐ธ ์ด๋ฌํ ๋ณด์์ ์ด์ ๋๋ฌธ์ SOP์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ ์ ์ฑ .
- ์๋ฅผ ๋ค์ด, ๋ค์ด๋ฒ ๊ฐ์ ์น ํ์ด์ง์ ๋ก๊ทธ์ธํด์ ์๋น์ค๋ฅผ ์ด์ฉํ ๋ ์๋น์ค ์ด์ฉ ์ค์ด ์๋๋๋ผ๋ ๋ก๊ทธ์์์ ๊น๋นกํ๊ฑฐ๋ ์๋ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ผ๋ก ์ธํด ๋ธ๋ผ์ฐ์ ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋จ์์์ ์๋ ์์ ๊ฒ.
- ๊ทธ ์ํ์์ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๋ ธ๋ฆฌ๋ ์ฝ๋๊ฐ ์๋ ๋ค๋ฅธ ์ฌ์ดํธ์ ๋ฐฉ๋ฌธํ๋ฉด, ํด์ปค๋ ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ๋ค์ด๋ฒ์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ด์ฉํ ์ ์๊ฒ ๋จ.
- ๊ทธ๋ฌ๋ SOP๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ์ ์ด์ ๋ค๋ฅธ ์ฌ์ดํธ์์ ๋ฆฌ์์ค ๊ณต์ ๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ํ ์ฌ์ดํธ์ ์ฝ๋์ ์ํด์ ์์ด๋๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์.
๐ธ ํ์ง๋ง, ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ์ผ์ด ๋ง์.
๐ธ ๊ฐ๋ฐํ ๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ฅผ ๋ฐ๋ก ๊ฐ๋ฐํ๊ฒ ๋๋ค๋ฉด ๋์ ์ถ์ฒ๊ฐ ๋ฌ๋ผ์ง๊ณ , API๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์๋, github ์ ๋ณด๋ฅผ ๋ฐ์์์ ์ฌ์ฉํ๊ณ ์ถ์ ๋, ๋ชจ๋ ๋ค๋ฅธ ์ถ์ฒ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ผ์ด ์๊น.
๐ธ ์ด์ ๊ฐ์ ์ผ์ ํด๊ฒฐํ๊ธฐ ์ํด CORS ์ฌ์ฉ.
๐ธ ์ถ๊ฐ HTTP ํค๋๋ฅผ ์ฌ์ฉํด, ํ ์ถ์ฒ์์ ์คํ ์ค์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค๋ฅธ ์ถ์ฒ์ ์ ํํ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋๋ก ๋ธ๋ผ์ฐ์ ์ ์๋ ค์ฃผ๋ ์ฒด์ .
๐ธ CORS ์๋ฌ
๐ธ ์ฆ, CORS ์ค์ ์ ํตํด ์๋ฒ์ ์๋ต ํค๋์ Access-Control-Allow-Origin
์ ์์ฑํ๋ฉด ์ ๊ทผ ๊ถํ์ ์ป์ ์ ์์.
๐ธ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ , OPTIONS
๋ฉ์๋๋ก ์ฌ์ ์์ฒญ์ ๋ณด๋ด ํด๋น ์ถ์ฒ ๋ฆฌ์์ค์ ์ ๊ทผ ๊ถํ์ด ์๋์ง ํ์ธํ๋ ๊ฒ.
๐ธ ๋ธ๋ผ์ฐ์ ๋ ์๋ฒ์ ์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต ํค๋์ Access-Control-Allow-Origin: ํด๋น ์ถ์ฒ
๋ผ๊ณ ์ค๋ฉด ์ค์ ์์ฒญ์ ๋ณด๋.
๐ธ ๋ง์ฝ ์์ฒญ์ ๋ณด๋ธ ์ถ์ฒ๊ฐ ์ ๊ทผ ๊ถํ์ด ์๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ์์ CORS ์๋ฌ๋ฅผ ๋์ฐ๊ฒ ๋๊ณ , ์ค์ ์์ฒญ์ ์ ๋ฌ๋์ง ์์.
๐ก ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ํ์์ฑ
์ค์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ์ ๊ถํ ํ์ธ์ ๋ฏธ๋ฆฌ ํ์ธํจ์ผ๋ก์จ, ์ค์ ์์ฒญ์ ์ฒ์๋ถํฐ ํต์งธ๋ก ๋ณด๋ด๋ ๊ฒ๋ณด๋ค ๋ฆฌ์์ค ์ธก๋ฉด์์ ํจ์จ์ .
CORS์ ๋๋น๊ฐ ๋์ด์์ง ์์ ์๋ฒ๋ฅผ ๋ณดํธํ ์ ์์.
CORS ์ด์ ์ ๋ง๋ค์ด์ง ์๋ฒ๋ค์ SOP ์์ฒญ๋ง ๋ค์ด์ค๋ ์ํฉ์ ๊ณ ๋ คํ๊ณ ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ถ์ฒ์์ ๋ค์ด์ค๋ ์์ฒญ์ ๋ํ ๋๋น๊ฐ ๋์ด์์ง ์์.
์ด๋ฐ ์๋ฒ์ ๋ฐ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋ต์ ๋ณด๋ด๊ธฐ ์ ์ ์ฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ฒ ๋จ. ๋ธ๋ผ์ฐ์ ๋ ์๋ต์ ๋ฐ์ ํ์ CORS ๊ถํ์ด ์๋ค๋ ๊ฒ์ ์ธ์งํ์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฌ๋ฅผ ๋์ด ํ์๋ ์ด๋ฏธ ์์ฒญ์ด ์ํ๋ ์ํ.
CORS์ ๋๋น๊ฐ ๋์ด์์ง ์์ ์๋ฒ๋ผ๋ ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ๋จผ์ ๋ณด๋ด๊ฒ ๋๋ฉด, ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์์ CORS ์๋ฌ๋ฅผ ๋์. ์คํ๋ผ์ ์ ๋๋ Cross-Origin ์์ฒญ์ด ์คํ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์. ์ด๋ฐ ์ด์ ๋ก ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ด CORS์ ๊ธฐ๋ณธ ์ฌ์์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋จ.
๐ธ ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ํ๋ฆฌํ๋ผ์ดํธ ์์ฒญ์ ์๋ตํ๊ณ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ.
๐ธ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์. (๊ทธ๋ฌ๋ ์ด ์กฐ๊ฑด๋ค์ ๋ชจ๋ ๋ง์กฑ์ํค๋ ๊ฒ์ ์ด๋ ค์)
GET
, HEAD
, POST
์์ฒญ ์ค ํ๋์ฌ์ผ ํจ.Accept
, Accept-Language
, Content-Language
, Content-Type
ํค๋์ ๊ฐ๋ง ์๋์ผ๋ก ์ค์ ํ ์ ์์ Content-Type
ํค๋์๋ application/x-www-form-urlencoded
, multipart/form-data
, ext/plain
๊ฐ๋ง ํ์ฉ๐ธ ๋๋ถ๋ถ HTTP API ์์ฒญ์ ext/xml
์ด๋ application/json
์ผ๋ก ํต์ ํ๊ธฐ ๋๋ฌธ์ 3๋ฒ์งธ Content-Type
์ด ์๋ฐ๋จ.
๐ธ ์์ฒญ ํค๋์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ด์ ๋ณด๋ด๋ ์์ฒญ.
๐ธ ์ถ์ฒ๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ์, ๋ณ๋์ ์ค์ ์ ํ์ง ์์ผ๋ฉด ๋ฏผ๊ฐํ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ฟ ํค๋ฅผ ๋ณด๋ผ ์ ์์. ์ด ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ, ์๋ฒ ์์ธก ๋ชจ๋ CORS ์ค์ ์ด ํ์.
withCredentials : true
๋ฅผ ๋ฃ์ด์ค์ผ ํจ.Access-Control-Allow-Credentials : true
๋ฅผ ๋ฃ์ด์ค์ผ ํจ.Access-Control-Allow-Origin
์ ์ค์ ํ ๋, ๋ชจ๋ ์ถ์ฒ๋ฅผ ํ์ฉํ๋ค๋ ๋ป์ ์์ผ๋์นด๋(*
)๋ก ์ค์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์. ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๋งํผ ์ถ์ฒ๋ฅผ ์ ํํ๊ฒ ์ค์ ํด์ค์ผ ํจ.๐ธ Node.js๋ก ๊ฐ๋จํ HTTP ์๋ฒ๋ฅผ ๋ง๋ค ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ์๋ต ํค๋ ์ค์ .
const http = require('http');
const server = http.createServer((request, response) => {
// ๋ชจ๋ ๋๋ฉ์ธ
response.setHeader("Access-Control-Allow-Origin", "*");
// ํน์ ๋๋ฉ์ธ
response.setHeader("Access-Control-Allow-Origin", "https://codestates.com");
// ์ธ์ฆ ์ ๋ณด๋ฅผ ํฌํจํ ์์ฒญ์ ๋ฐ์ ๊ฒฝ์ฐ
response.setHeader("Access-Control-Allow-Credentials", "true");
})
๐ธ Express ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํด์ ์๋ฒ๋ฅผ ๋ง๋ค ๊ฒฝ์ฐ, cors ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ CORS ์ค์ .
const cors = require("cors");
const app = express();
//๋ชจ๋ ๋๋ฉ์ธ
app.use(cors());
//ํน์ ๋๋ฉ์ธ
const options = {
origin: "https://codestates.com", // ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๋ ๋๋ฉ์ธ
credentials: true, // ์๋ต ํค๋์ Access-Control-Allow-Credentials ์ถ๊ฐ
optionsSuccessStatus: 200, // ์๋ต ์ํ 200์ผ๋ก ์ค์
};
app.use(cors(options));
//ํน์ ์์ฒญ
app.get("/example/:id", cors(), function (req, res, next) {
res.json({ msg: "example" });
});
MERN stack : ์น ๊ฐ๋ฐ์ ์ํ ๊ธฐ์ ์คํ์ผ๋ก MongoDB, Express, React, Node.js๋ก ์ด๋ฃจ์ด์ง.
๐ธ Node.js ํ๊ฒฝ์์ ์น ์๋ฒ, ๋๋ API ์๋ฒ๋ฅผ ์ ์ํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ.
๐ธ Node.js HTTP ๋ชจ๋๋ก ์์ฑํ ์๋ฒ์ ๋ฌ๋ฆฌ Express๋ก ๊ตฌํํ ์๋ฒ๋ ๋ฏธ๋ค์จ์ด ์ถ๊ฐ ๋ฐ ๋ผ์ฐํฐ ๊ธฐ๋ฅ์ ์ ๊ณต
npm install express
์์ํ๊ธฐ - Hello world ์์
const express = require('express')
const app = express()
const port = 3000
// ๋ฃจํธ URL(/) ๋๋ ๋ผ์ฐํธ์ ๋ํ ์์ฒญ์ โHello World!โ๋ก ์๋ต
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
์์ํ๊ธฐ - ๊ธฐ๋ณธ ๋ผ์ฐํ
๐ธ ๋ฉ์๋์ url(/lower
, /upper
๋ฑ)๋ก ๋ถ๊ธฐ์ ์ ๋ง๋๋ ๊ฒ (๋ถ๊ธฐ์ : ํด๋ผ์ด์ธํธ์ ์์ฒญ URL์ ๊ธฐ๋ฐ์ผ๋ก ์๋ฒ์์ ๋ค์ํ ๋์ ๋๋ ํธ๋ค๋ฌ ํจ์๋ก ๋ถ๊ธฐํ๋ ์ง์ )
๐ธ ํด๋ผ์ด์ธํธ๋ ํน์ ํ HTTP ์์ฒญ ๋ฉ์๋(GET
, POST
๋ฑ)์ ํจ๊ป ์๋ฒ์ ํน์ URI(๋๋ ๊ฒฝ๋ก)๋ก HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ํด๋นํ๋ Endpoint์ ๋ฐ๋ผ ์๋ฒ๊ฐ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ.
๐ธ ๊ฐ ๋ผ์ฐํธ๋ ํ๋ ์ด์์ ํธ๋ค๋ฌ ํจ์๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์ด๋ฌํ ํจ์๋ ๋ผ์ฐํธ๊ฐ ์ผ์นํ ๋ ์คํ๋จ
๐ธ app.METHOD(path, handler)
app
: express์ ์ธ์คํด์คMETHOD
: HTTP ์์ฒญ ๋ฉ์๋path
: ์๋ฒ์์์ ๊ฒฝ๋กhandler
: ๋ผ์ฐํธ๊ฐ ์ผ์นํ ๋ ์คํ๋๋ ํจ์์์ ์ฝ๋
- ์์ํ Node.js ์ฝ๋๋ก ์์ฑ์
const requestHandler = (req, res) => { if(req.url === '/lower') { if (req.method === 'GET') { res.end(data) } else if (req.method === 'POST') { req.on('data', (req, res) => { // do something })}}}
- Express์ ๋ผ์ฐํฐ๋ฅผ ํ์ฉ
const router = express.Router() router.get('/lower', (req, res) => { res.send(data); }) router.post('/lower', (req, res) => { // do something })
๐ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํด๋ผ์ด์ธํธ์ ์์ฒญ๊ณผ ์๋ฒ์ ์๋ต ์ฌ์ด์์ ๋์ํ๋ ์ค๊ฐ ์ํํธ์จ์ด ์ปดํฌ๋ํธ.
๐ธ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ค๊ฐ ๋จ๊ณ์์ ์ถ๊ฐ์ ์ธ ๋์์ ์ํํ๊ฑฐ๋, ์๋ฒ์ ์๋ต์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ํ์ ๋์์ ์ํํ ์ ์์.
๐ธ ๊ฐ๊ฐ์ ๋ฏธ๋ค์จ์ด๋ next()
๋ฉ์๋๋ฅผ ํธ์ถํด ๊ทธ ๋ค์ ๋ฏธ๋ค์จ์ด๊ฐ ์์
์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์์๋ฅผ ๋๊ธธ ์ ์์.
๐ธ ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ ์ํฉ
POST
์์ฒญ ๋ฑ์ ํฌํจ๋ body(payload)
๋ฅผ ๊ตฌ์กฐํํ ๋(์ฝ๊ฒ ์ป์ด๋ด๊ณ ์ ํ ๋)url
์ด๋ ๋ฉ์๋๋ฅผ ํ์ธํ ๋
- ์์ ๊ทธ๋ฆผ์ endpoint๊ฐ
/
์ด๋ฉด์, ํด๋ผ์ด์ธํธ๋ก๋ถํฐGET
์์ฒญ์ ๋ฐ์์ ๋ ์ ์ฉ๋๋ ๋ฏธ๋ค์จ์ด- ํ๋ผ๋ฏธํฐ์ ์์์ ์ ์
POST
์์ฒญ ๋ฑ์ ํฌํจ๋ body(payload)
๋ฅผ ๊ตฌ์กฐํํ ๋๐ธ Node.js
body(payload)
๋ฅผ ๋ฐ์ ๋ Buffer๋ฅผ ์กฐํฉํด์ body
๋ฅผ ์ป์ ์ ์์. ์ด๋ ๋คํธ์ํฌ์์ chunk
๋ฅผ ํฉ์น๊ณ , Buffer๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ์์
์ด ํ์.let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// body ๋ณ์์๋ ๋ฌธ์์ด ํํ๋ก payload๊ฐ ๋ด๊ฒจ์ ธ ์์.
});
๐ธ body-parser ๋ฏธ๋ค์จ์ด๋ฅผ ์ด์ฉํด ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ.
body-parser
: ์๋ฒ๋ก ๋ค์ด์ค๋ ์์ฒญ์ด ๋ผ์ฐํธ ํธ๋ค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ์ request body๋ฅผ ํ์ฑํด์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ํจํค์ง.// ์ค์น
npm install body-parser
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();
// ์๋ต
app.post('/users', jsonParser, function (req, res) {
})
๐ธ Express v4.16.0๋ถํฐ body-parser
์ค์น ๋์ , Express ๋ด์ฅ ๋ฏธ๋ค์จ์ด์ธ express.json()
์ ์ฌ์ฉ
const express = require('express')
const app = express()
app.use(express.json())
express()
: Express application๋ฅผ ์์ฑ. express
๋ชจ๋์์ ์ต์์ ํจ์๋ฅผ ๋ด๋ณด๋.express.json([options])
: ๋ค์ด์ค๋ JSON ํ์์ ์์ฒญ์ (body-parser๋ฅผ ํตํด) JavaScript ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ฌ์ฉํ๊ฒ ํด์ค.strict
: ๋ค์ด์ค๋ JSON body๋ฅผ ํ์ฑํ ๋ ์๊ฒฉํ ๋ชจ๋๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ . ๊ธฐ๋ณธ๊ฐ์ true
์ด๋ฉฐ, false
๋ก ์ค์ ํ ๊ฒฝ์ฐ JSON.parse
๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ๋ชจ๋ ํํ์ JSON์ ํ์ฉํจ. (๊ฐ์ฒด๋ ๋ฐฐ์ด ๋ฟ๋ง ์๋๋ผ ๋ฌธ์์ด, ์ซ์ ๋ฑ๋ ๋ ์ ์์)express.urlencoded([options])
: HTML Form์ ํตํด์ ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฑํจ. ๐ธ Node.js
response.writeHead(statusCode, {headers})
๋ฉ์๋๋ฅผ ์ด์ฉ.OPTIONS
๋ฉ์๋์ ๋ํ ๋ผ์ฐํ
๋ ๋ฐ๋ก ๊ตฌํํด์ผํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์.const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
// ์๋ต
if (req.method === 'OPTIONS') {
res.writeHead(200, defaultCorsHeader);
res.end()
}
๐ธ cors ๋ฏธ๋ค์จ์ด
// ๐ 1. cors ๋ฏธ๋ค์จ์ด ์ค์น
npm install cors
// ๐ 2. ๋ชจ๋ ์์ฒญ์ ๋ํด CORS ํ์ฉ
const cors = require('cors');
app.use(cors());
// ๐ 3.ํน์ ์์ฒญ์ ๋ํด CORS ํ์ฉ
const cors = require('cors')
app.get('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a Single Route'})
})
๐ก
app.use
๋ express ์ฑ์์ ์คํํ๋ ๋ฏธ๋ค์จ์ด ์ญํ . ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฃผ์๋ฅผ ๋ฃ์ด์ฃผ์ง ์์ผ๋ฉด ๋ชจ๋ ์์ฒญ์์ ๋ฏธ๋ค์จ์ด๊ฐ ์คํ๋จ.
๐ธ ๋ก๊ฑฐ(logger) : ๋๋ฒ๊น
์ด๋, ์๋ฒ ๊ด๋ฆฌ์ ๋์์ด ๋๊ธฐ ์ํด console.log
๋ก ์ ์ ํ ๋ฐ์ดํฐ๋ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ.
๐ธ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ฑฐ์น๋ ๋์ ์๋ตํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด, ๋ฏธ๋ค์จ์ด ์ฌ์ด์ฌ์ด์ ๋ก๊ฑฐ๋ฅผ ์ฝ์ ํ์ฌ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ฑฐ๋, ๋๋ฒ๊น ์ ์ฌ์ฉํ ์ ์์.
const express = require('express');
const app = express();
// ๐ 1. ๋ชจ๋ ์์ฒญ์ mount ๋๋ ๋ฏธ๋ค์จ์ด
app.use(function (req, res, next) {
console.log('Time:', Date.now());
next();
});
// ๐ 2. ๋ชจ๋ ์์ฒญ์ mount ๋๋ ๋ฏธ๋ค์จ์ด
const myLogger = function (req, res, next) {
console.log('LOGGED'); // ๋ชจ๋ ์์ฒญ์ ๋ํด LOGGED๊ฐ ์ถ๋ ฅ๋จ.
next();
};
app.use(myLogger);
// ๐ 3. ํน์ ๊ฒฝ๋ก์ mount๋๋ ๋ฏธ๋ค์จ์ด
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
๐ธ HTTP ์์ฒญ์์ ํ ํฐ์ด ์๋์ง๋ฅผ ํ๋จํ์ฌ, ์ด๋ฏธ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ผ ๊ฒฝ์ฐ ์ฑ๊ณต, ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ณด๋ด๋ ๋ฏธ๋ค์จ์ด ์์
app.use((req, res, next) => { // ํ ํฐ์ด ์๋์ง ํ์ธ, ์์ผ๋ฉด ๋ฐ์์ค ์ ์์. if(req.headers.token){ req.isLoggedIn = true; next(); } else { res.status(400).send('invalid user') } })
๐ธ ๋ธ๋ผ์ฐ์ ์๋ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํด fetch
๊ฐ์ HTTP ์์ฒญ์ ๋ณด๋ด๋ ๋๊ตฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์์.
๐ธ Node.js๋ HTTP ์์ฒญ์ ๋ณด๋ด๊ฑฐ๋, ์๋ต์ ๋ฐ์ ์ ์๋ ๋๊ตฌ๋ค์ ์ ๊ณต.
๐ธ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ณด๋ด ์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์น ์๋ฒ(Web Server)๋ผ๊ณ ํจ.
๐ธ ์๋ฒ๋ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์ HTTP ์์ฒญ์ ๋ง๊ฒ ์๋ต์ ๋ณด๋ผ ์ ์๋๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํจ.
class App {
init() {
document
.querySelector('#to-upper-case')
.addEventListener('click', this.toUpperCase.bind(this));
document
.querySelector('#to-lower-case')
.addEventListener('click', this.toLowerCase.bind(this));
}
post(path, body) {
fetch(`http://localhost:5001/${path}`, {
method: 'POST',
body: JSON.stringify(body),
headers: {
'Content-Type': 'application/json'
}
})
.then(res => res.json())
.then(res => {
this.render(res);
});
}
toLowerCase() {
const text = document.querySelector('.input-text').value;
this.post('lower', text);
}
toUpperCase() {
const text = document.querySelector('.input-text').value;
this.post('upper', text);
}
render(response) {
const resultWrapper = document.querySelector('#response-wrapper');
document.querySelector('.input-text').value = '';
resultWrapper.innerHTML = response;
}
}
const app = new App();
app.init();
const http = require('http'); // ์๋ฒ๋ฅผ node.js์์ ์๋์ ์์ผ์ผ ํ๋ฏ๋ก http ๋ชจ๋ ์ฌ์ฉ
const PORT = 4999;
const ip = 'localhost';
const server = http.createServer((request, response) => { // http.createServer ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์น์๋ฒ ๊ฐ์ฒด ์์ฑ. ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ํด๋น ์ฝ๋ฐฑํจ์๊ฐ ํธ์ถ
// ์์ฒญ ๋ฉ์๋์ ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ.
// TODO:
if(request.method === 'OPTIONS') { // preflight; ์์ฒญ์ด OPTIONS ๋ฉ์๋์ธ ๊ฒฝ์ฐ CORS ์ค์ ์ ์ํ ์๋ต์ ๋ณด๋ด๊ณ ์ข
๋ฃ
response.writeHead(200, defaultCorsHeader);
response.end();
}
if(request.method === "POST" && request.url === "/upper") { // POST ๋ฉ์๋์ด๊ณ , ๊ฒฝ๋ก๊ฐ /upper์ธ ๊ฒฝ์ฐ
let body = [];
request.on('data', (chunk) => { // ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ฒญ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ ๋๋ง๋ค ํธ์ถ๋๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋. chunk ๋งค๊ฐ๋ณ์์๋ ๋์ฐฉํ ๋ฐ์ดํฐ ์ฒญํฌ(chunk)๊ฐ ์ ๋ฌ๋๋ฉฐ, chunk๋ bufferํํ๋ก ์ ๊ณต๋จ
body.push(chunk); // body ๋ฐฐ์ด์ ์ฒญํฌ ์ถ๊ฐ
}).on('end', () => { // ์์ฒญ ๋ฐ์ดํฐ์ ์์ ์ด ์๋ฃ๋์ ๋ ํธ์ถ๋๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋. ์์ฒญ ๋ฐ์ดํฐ์ ๋ชจ๋ ์ฒญํฌ๊ฐ ์์ ๋์์์ ๋ํ๋.
body = Buffer.concat(body).toString().toUpperCase(); // body ๋ฐฐ์ด์ ์ ์ฅ๋ ๋ชจ๋ ์ฒญํฌ๋ฅผ ํ๋์ ๋ฒํผ๋ก ํฉ์นจ.
response.writeHead(200, defaultCorsHeader); // ์ํ์ฝ๋ 200๊ณผ CORS ํค๋๋ฅผ ์๋ต์ผ๋ก ์ค์
response.end(body) // ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋. ๋ณํ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋ต์ผ๋ก ์ ์ก
});
}
else if(request.method === "POST" && request.url === "/lower") {
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString().toLowerCase();
response.writeHead(200, defaultCorsHeader);
response.end(body)
});
}
else if(request.method === "GET" && request.url === "/") {
response.writeHead(200, defaultCorsHeader);
response.end("! localhost:4999")
}
else {
// ๋๋จธ์ง๋ ์๋ฌ์ฒ๋ฆฌ bad request
response.statusCode = 404;
response.end();
}
console.log(
`http request method is ${request.method}, url is ${request.url}`
);
});
server.listen(PORT, ip, () => { // ์๋ฒ๋ฅผ ์์ํ๋ ๋ฉ์๋
console.log(`http server listen on ${ip}:${PORT}`);
});
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
๐ธ http.createServer([requestListener])
: HTTP server๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ๋ฉฐ, http.Server
์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ฐํ.
requestListener
: ์์ฒญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ์๋์ผ๋ก ํธ์ถ๋ ์ฝ๋ฐฑ ํจ์๐ธ listen()
: Server
์ ์ ๋๊ธฐ ์์. ๋น๋๊ธฐ์ .
๐ธ response.writeHead(statusCode, headers)
: http response์ header๋ฅผ ์ค์ ํ๊ธฐ ์ํ http ๋ชจ๋์ ๋ฉ์๋
๐ธ .on(eventName, eventHandler)
: ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ๋ ๋ฉ์๋. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ๋ฑ๋ก๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ(eventHandler) ํจ์๊ฐ ํธ์ถ.
๐ธ .end([data], [encoding])
: ์๋ต์ ์ข
๋ฃํ๊ณ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋. data
๋ ์๋ต ๋ณธ๋ฌธ์ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ์ ํ์ ์ผ๋ก ์ ๋ฌํ ์ ์์. encoding
์ ๋ฐ์ดํฐ์ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ๋ํ๋ด๋ฉฐ, ์ ํ์ ์ผ๋ก ์ง์ ๊ฐ๋ฅ.
๐ก chunk, fetch๋ ์ค๋ฌด์์๋ ์ฌ์ฉ์ ์ ์ํ๋ฉฐ, ์ฃผ๋ก Axios๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ
const express = require('express')
const app = express(); // app ๊ฐ์ฒด ์์ฑ
const PORT = 5001;
const ip = 'localhost';
const jsonParser = express.json({strict: false}); // req.body์ JSON ๋ฐ์ดํฐ๋ฅผ ํ์ฑํ์ฌ JS ๊ฐ์ฒด๋ก ๋ณํ; strict: false = ์๋ชป๋ JSON ํ์์ด ๋ค์ด์๋ ํ์ฑ์๋
app.use(jsonParser) //
const cors = require('cors');
app.use(cors()); // ๋ชจ๋ ์์ฒญ์ ๋ํด CORS ํ์ฉ
app.get('/', (req, res) => {
res.send("Hello !"); // res.send() : ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋์ง ํ์
์ ํด์ ์ด์ ์๋ง๊ฒ Contnet-Type์ ์ง์ ํ๊ณ res๋ฅผ ๋ณด๋.
})
app.post('/upper', (req, res) => {
let data = req.body.toUpperCase() // req.body = express.json() ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฑ๋ JSON๋ฐ์ดํฐ๋ฅผ req.body์ ์ ์ฅ
res.json(data) // res.json() = JSON ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ JSON ๋ฌธ์์ด ํ์์ผ๋ก ์๋ต. ์๋ฒ์์ ํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฃผ๋ก ์ฌ์ฉ
console.log(data)
})
app.post('/lower', (req, res) => {
let data = req.body.toLowerCase()
res.json(data)
console.log(data)
})
app.listen(PORT, () => {
console.log(`http server listen on ${ip}:${PORT}`)
})
uuid()
๐ธ Universally Unique Identifier(๋ฒ์ฉ ๊ณ ์ ์๋ณ์)๋ฅผ ์์ฑํ๋ ํจ์.
๐ธ 128bit ์ซ์๋ก ์ด๋ฃจ์ด์ง ์๋ณ์๋ก์, ์ผ๋ฐ์ ์ผ๋ก ๊ณ ์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ์ฉ.
// ๐ 1. ์ค์นํ๊ธฐ
npm install uuid
// ๐ 2. 'v4' ํจ์๋ฅผ uuid๋ผ๋ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์ด.
const { v4: uuidv4 } = require('uuid');
๐ธ UUID์๋ ์ฌ๋ฌ ๋ฒ์ ์ด ์์ผ๋ฉฐ, ๊ฐ ๋ฒ์ ๋ง๋ค ๊ณ ์ ํ ํน์ง๊ณผ ์์ฑ ๋ฐฉ๋ฒ์ด ์กด์ฌ. ๋ฒ์ 4๋ ๋๋คํ๊ฒ ์์ฑ๋๋ UUID๋ก, ๋ณดํต ์ผ๋ฐ์ ์ธ ์ฉ๋์์ ๋ง์ด ์ฌ์ฉ.
๐ธ HTTP ํต์ ์์ ์ ์ก๋๋ ๋ฐ์ดํฐ์ ํ์
์ ๋ช
์ํ๊ธฐ ์ํด header์ ์ค๋ฆฌ๋ ์ ๋ณด๋ก, request/response body์ ์ค์ด ๋ณด๋ด๋ ๋ฐ์ดํฐ ํ์
์ ์ ๋ณด.
๐ธ Text ํ์
, Message ํ์
, Image ํ์
, Audio ํ์
, Video ํ์
, file ํ์
, Application ํ์
, Multipart ํ์
๐ธ Content-Type
์ ๋ฐ๋ก ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋๋ Default ๊ฐ.
๐ธ ๋ณดํต Web Page๋ฅผ ๊ฐ๋ฐํ ๋, JavaScript/JQuery๋ฅผ ์ฌ์ฉํด์ Ajax๋ก ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๋ ๊ฒฝ์ฐ ํน์ html form์ ์ฌ์ฉํด์ ์์ฒญํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ.
๐ธ key=value&key2=value2
์ ํํ
๐ธ Android๋ iOS์ฑ์ ์ํ RestFul API๋ฅผ ๊ฐ๋ฐํ ๊ฒฝ์ฐ.
๐ธ {key: value}
์ ํํ
req.body
๐ธ JSON ๋ฑ์ body ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ ์ฌ์ฉํ๋ฉฐ, ์ฃผ๋ก POST
๋ก ์ ์ ์ ์ ๋ณด ๋๋ ํ์ผ ์
๋ก๋(formdata)๋ฅผ ๋ณด๋์ ๋ ์ฌ์ฉ. ์์ฒญ ๋ณธ๋ฌธ์ ์ ์ถ๋ ํค-๊ฐ ๋ฐ์ดํฐ ์์ ํฌํจํจ.
req.query
Query
๐ธ endpoint ์ฃผ์ ์ดํ์?
๋ฅผ ์ฐ๋ ๊ฒ์ผ๋ก query string์ด ์์ํจ์ ์๋ฆผ.
๐ธparameter=value
ํํ๋ก ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์ ์
๐ธ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ,&
๋ฅผ ๋ถ์ฌ ์ฌ๋ฌ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธธ ์ ์์.
๐ธendpoint์ฃผ์/?parameter=value&value
๐ธ ๊ฒฝ๋ก์ ๊ฐ ์ฟผ๋ฆฌ ๋ฌธ์์ด ๋งค๊ฐ ๋ณ์์ ๋ํ ์์ฑ์ด ํฌํจ๋ ๊ฐ์ฒด (์ฃผ๋ก GET
์์ฒญ์ ๋ํ ์ฒ๋ฆฌ).
www.example.com/post/1/jun?title=hello!
์ด๋ฉด, title=hello!
๋ถ๋ถ์ ๊ฐ์ฒด๋ก ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๊ฐ์ ธ์ด.// ํด๋ผ์ด์ธํธ ๋จ์์, ์๋ฐ์คํฌ๋ฆฝํธ๋ก get์์ฒญ์ ๋ณด๋
// ๐ ๋ฐฉ์ 1
await axios.get(`www.example.com/post/1/jun?title=hello!`)
// ๐ ๋ฐฉ์ 2
await axios({
method: "get",
url: `www.example.com/post/1/jun`,
params: { title: 'hello!' },
})
// ์์ฒญ์จ uri : www.example.com/public/100/jun?title=hello!
app.use(express.urlencoded({ extended: false })); // uri ๋ฐฉ์ ํผ ์์ฒญ ๋ค์ด์ค๋ฉด ํ์ฑ
router.get('/:id/:name', (req, res, next) => {
// title=hello! ๋ถ๋ถ์ด ๋ด๊ธฐ๊ฒ ๋๋ค.
console.log(req.query) // { title : 'hello!' }
});
req.params
๐ธ ๋ผ์ฐํฐ์ ๋งค๊ฐ๋ณ์.
/:id/:name
๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด, :id
์์ฑ๊ณผ :name
์์ฑ์ req.params.id
, req.params.name
์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅ// ์์ฒญ์จ url : www.example.com/public/100/jun
router.get('/:id/:name', (req, res, next) => {
console.log(req.params)});
// { id: '100', name: 'jun' }; ../100/jun ๋ถ๋ถ์ด ๋ด๊ธฐ๊ฒ ๋จ.
๐ธ response๋ฅผ ๋ณด๋. ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ์์ response๋ฅผ ์ฒ๋ฆฌํ ๋ Content-type
๋ฅผ ์ง์ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ํด๋น ๋ฉ์๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋์ง ํ์
ํด์ ์๋ง๊ฒ ์ง์ ํด์ค. ์ด๋ Buffer, String, Object, Array์ผ ์ ์์.
๐ธ JSON.stringify()
๋ฅผ ์ฌ์ฉํ์ฌ JSON ๋ฌธ์์ด๋ก ๋ณํ๋ ์๋ต์ ๋ณด๋. body์๋ ๊ฐ์ฒด, ๋ฐฐ์ด, ๋ฌธ์์ด, boolean, ์ซ์ ๋๋ Null์ ํฌํจํ ๋ชจ๋ JSON ์ ํ์ผ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ๊ฐ์ JSON์ผ๋ก ๋ณํํ ์๋ ์์.
๐ธ ๋ชจ๋ ์๋ต ํค๋์ body๊ฐ ์๋ฒ์ ์ ์ก๋์์ ์๋ ค์ฃผ๋ฉฐ, ๋ณด๋ด์ค ๋ฐ์ดํฐ๊ฐ ์์ ๋ ์ฌ์ฉํจ. ์๋ฅผ ๋ค์ด, 404
์๋ฌ์ฒ๋ฆฌ๋ฅผ ๋ฆฌํดํด์ค์ผ ํ ๋. ํ์ง๋ง, res.json
์ด๋ res.send
๋ฅผ ์ฐ๋ฉด ์๋ต์ ์ข
๋ฃํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ช
์์ ์ผ๋ก ํ์ํด์ค ํ์๋ ์์.
res.render()
๐ธ ์๋ฒ์์ HTML์ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋๋ฐ ์ฌ์ฉ. ํด๋ผ์ด์ธํธ ์ธก์์ ํ์ด์ง์ ์ฝํ ์ธ ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์๋๋ผ ์๋ฒ ์ธก์์ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ ํ ์ ์ก.
next()
๐ธ ๋ค์ ๋ฏธ๋ค์จ์ด, ๋ผ์ฐํฐ๋ฅผ ํธ์ถํ๋ฉฐ, ์์ฑํ์ง ์์ ์ ํธ์ถ๋์ง ์์.
๐ธ next๋ฅผ ํธ์ถํ์ง ์๋ ๋ฏธ๋ค์จ์ด๋ res.send
๋ res.sendFile
๋ฑ์ ๋ฉ์๋๋ก ์๋ต์ ๋ณด๋ด์ผ ํจ.
๐ธ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์์ฒญ์ ์ฒ๋ฆฌ ์ํ๋ฅผ ์๋ต์์ ์๋ ค์ค. 3์๋ฆฌ ์ซ์๋ก ๋ง๋ค์ด์ ธ ์์ผ๋ฉฐ, ์ฒซ๋ฒ์งธ ์๋ฆฌ๋ 1~5๋ก ์ ๊ณต๋จ.
๐ธ 1xx(์ ๋ณด) : ์์ฒญ์ ๋ฐ์์ผ๋ฉฐ ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ์ฒ๋ฆฌ์ค
๐ธ2xx(์ฑ๊ณต) : ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์์ผ๋ฉฐ ์ ์ ์ฒ๋ฆฌ
๐ธ3xx(๋ฆฌ๋ค์ด๋ ์ ) : ์์ฒญ ์๋ฃ๋ฅผ ์ํด ์ถ๊ฐ ํ๋์ด ํ์
๐ธ4xx(ํด๋ผ์ด์ธํธ ์ค๋ฅ) : ์๋ชป๋ ๋ฌธ๋ฒ์ผ๋ก ์ธํด ์๋ฒ๊ฐ ์์ฒญ์ ์ํํ ์ ์์
๐ธ5xx(์๋ฒ ์ค๋ฅ) : ์๋ฒ๊ฐ ์ ์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํจ
๐ธ ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐ์์ผ๋ฉฐ ์ ์ ์ฒ๋ฆฌ
๐ธ 200
: ๋จ์ get
๐ธ 201
: post
์ฑ๊ณต. ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋จ.
๐ธ 202
: ์์ฒญ์ด ์ ์๋์์ง๋ง ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์ง ์์.
๐ธ 204
: ์๋ฒ๊ฐ ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์ํํ์ง๋ง, ์๋ต ํ์ด๋ก๋์ ๋ณด๋ผ ๋ฐ์ดํฐ๊ฐ ์์.
๐ธ ํด๋ผ์ด์ธํธ๊ฐ ์๋ชป๋ ๋ฌธ๋ฒ์ผ๋ก ์์ฒญํ๋ฉด์ ๋ฐ์ํ๋ ์ค๋ฅ
๐ธ 400 Bad Request
: ํด๋ผ์ด์ธํธ๊ฐ ์๋ชป๋ ์์ฒญ์ ํด์ ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์
๐ธ 401 Unauthorized
: ํด๋ผ์ด์ธํธ๊ฐ ํด๋น ๋ฆฌ์์ค์ ๋ํ ์ธ์ฆ ํ์
๐ธ 403 Forbidden
: ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช
์ ์์ง๋ง, ๊ถํ์ด ์ถฉ๋ถํ์ง ์์ ๊ฒฝ์ฐ.
๐ธ 404 Not Found
: ์์ฒญ ๋ฆฌ์์ค๊ฐ ์๋ฒ์ ์๋ ๊ฒฝ์ฐ. ํด๋ผ์ด์ธํธ๊ฐ ๊ถํ์ด ๋ถ์กฑํ ๋ฆฌ์์ค์ ์ ๊ทผํ๋๋ฐ, ํด๋น ๋ฆฌ์์ค๋ฅผ ์จ๊ธฐ๊ณ ์ถ์ ๋.
๐ธ 415 Unsupported Media Type
: ๋ฐ์ดํฐ์ ๋งค๊ฐ๋ณ์ ์ค์ ์ด ์๋ชป ๋์์ ๊ฒฝ์ฐ ๋ฐ์. ์๋ฅผ ๋ค์ด, Content-Type
์ด ์๋ชป ์ค์ ๋์ด ์์ ๊ฒฝ์ฐ.
๐ธ ์๋ฒ๋ฌธ์ ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ
๐ธ 500 Internal Server Error
: ์๋ฒ ๋ฌธ์ ๋ก ์ค๋ฅ ๋ฐ์.
๐ธ 503 Service Unavailable
: ์๋ฒ๊ฐ ์ผ์์ ์ธ ๊ณผ๋ถํ๋ ์์ ๋ ์์
์ผ๋ก ์ ์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์