์๋ฒ ๊ธฐ์ด Express / ์์ฒญ๊ณผ ์๋ต ๋ฐ์ดํฐ JSON ์ง๋ ฌํ, ์ญ์ง๋ ฌํ
๐พ ์๋ฒ ๊ธฐ์ด Express / ์์ฒญ๊ณผ ์๋ต ๋ฐ์ดํฐ JSON ์ง๋ ฌํ, ์ญ์ง๋ ฌํ
๐ ๋ฐ๋ ์ป๋ ๋ฐฉ๋ฒ์ ์ข ๋ฅ (express.json( ))
๐ JSON๊ณผ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ
๐ Fetch์ JSON
๐ mini node server ๊ณผ์
๐ res.json( )
๐ mini node server์์ ๋ฐ์ดํฐ๊ฐ ์ค๊ณ ๊ฐ๋ ๊ณผ์ (์์ฝ)
๐ ๋ฐ๋ ์ป๋ ๋ฐฉ๋ฒ์ ์ข ๋ฅ (express.json( ))
๐ Node.js / Buffer
Node.js ๋ง ์ฌ์ฉํด์ post ์์ฒญ ์, HTTP body๋ฅผ ๋ฐ์์ค๋ ๊ณผ์ ์ด ์ข ๋ณต์กํ๋ค.
๋คํธ์ํฌ ์์ chunk๋ฅผ ํฉ์น๊ณ , buffer๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ์์
์ด ํ์ํ๋ค.
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// body ๋ณ์์๋ ๋ฌธ์์ด ํํ๋ก payload๊ฐ ๋ด๊ฒจ์ ธ ์์ต๋๋ค.
});
๐ Express / bodyparser.json()
์์ ์์
์ express ๋ฏธ๋ค์จ์ด express.json์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ฐ๊ฟ ์ ์๋ค.
ํ์ง๋ง, express.json() ์ด์ ์ ์ฌ์ฉํ๋ body-parser ๋จผ์ ๋ณด์.
npm์ผ๋ก bodyparser๋ฅผ ์ค์นํด์ ์ฌ์ฉํ ์ ์๋ค.
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();
// ์๋ต
app.post('/users', jsonParser, function (req, res) {
})
์๋ ๊ฒ. (๋ด๊ฐ) ์ฃผ์ํ ์ ์, ๊ทธ๋ฅ bodyparser๊ฐ ์๋๋ผ, .json() ๋ฉ์๋๋ฅผ ๋ถ์ฌ์ ์ฌ์ฉํ๊ณ ์๋ค.
bodyParser.json()์ application/json ๋ฐฉ์์ Content-Type ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค.
request๋ฅผ ์ํด body๋ฅผ json ํ์
์ ๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ด๋ค.
๐ Express / express.json()
bodyparser.json()์ npm์ผ๋ก ์ค์นํด์ ์ธ ์ ์์์ง๋ง,
Express v4.16.0 ๋ถํฐ๋ body-parser๋ฅผ ๋ฐ๋ก ์ค์น ํ์ง ์๊ณ , Express ๋ด์ฅ ๋ฏธ๋ค์จ์ด์ธ express.json()์ ์ฌ์ฉํ๋ค.
const jsonParser = express.json();
// ์๋ต
app.post('/api/users', jsonParser, function (req, res) {
})
jsonparser์ express.json() ๋ฏธ๋ค์จ์ด๋ฅผ ํ ๋นํด์ ์ฌ์ฉํ๊ณ ์๋ค.์ฐ๋ฆฌ๋ ์ด์ , node.js์์ request .on์ผ๋ก ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ฉด chunk๋ฅผ ๊ฐ์ง๊ณ Buffer์ ๋ชจ์์ ๊ทธ๊ฑธ ์คํธ๋ง์ผ๋ก ๋ฐ๊ฟ ๋ฐ๋๋ก ๋ณด๋ด๊ณ .. ๋ฑ๋ฑ ํ ํ์ ์์ด express.json() ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์์ฒญ์ ๋ฐ๋๋ฅผ json ๋ฐ์ดํฐ ํ์
์ผ๋ก ๋ฐ์์ฌ ์ ์๋ค.
์ถ๊ฐ๋ก, express.json()์ ์ต์
์ค, strict๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋ณดํต json ํํ๋ก ๋ณํํ๋ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด ํน์ ๋ฐฐ์ด์ด๋ค. json์ผ๋ก ๋ฐ๋ ๋ฐ๋์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฒด, ๋ฐ๋์ธ์ง ํ์ธํ๋ ์ต์
์ด๋ค. default๊ฐ true์ด๊ณ , ๊ฐ์ฒด ํน์ ๋ฐฐ์ด๋ง ๋ฐ๋๋ก ๋ฐ์ json์ผ๋ก ๋ณํํด์ค๋ค.
false๋ก ๋ฐ๊พธ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค ๋ฐ์ ์ ์๋ค. ์ฐ๋ฆฌ ๊ณผ์ ์์ ๋ฐ์์์ผ ํ๋ ๋ฐ๋๋ ๊ทธ๋ฅ ์คํธ๋ง์ด๋ผ์ strict๋ฅผ false๋ก ์ค์ผํ๋ค.
const jsonParser = express.json({ strict: false });
์ฌ๊ธฐ๊น์ง ๋ฉ๋ํ๋ค. ์ค์ผ์ด.
๊ทธ๋ฐ๋ฐ ๊ณผ์ ๋ฅผ ํ๋ฉด์ ํ ๊ฐ์ง ์๋ฌธ์ด ๊ณ์ ๋๋ฅผ ๊ดด๋กญํ๋ค.
์ ์์ฒญ์ ๋ณด๋ผ ๋๋ express.json()์ ํตํด jsonํ์์ผ๋ก body๋ฅผ ์ง๋ ฌํ ํด์ ๋ณด๋ด์ฃผ๊ณ ,
๋ฐ์์ฌ ๋๋ ์ ๋ค์ ์ญ์ง๋ ฌํ๋ฅผ ํ์ง ์๋ ๊ฑธ๊น
๋๋ ์ด ์๊ฐ์ ์๋ฌ๋ฆฌ๋ค๊ฐ ๊ถ๊ธ์ฆ์ด ํ๋ฆฌ์ง ์์ ๋๋ฌด ํ๋ค์๋ค.
๊ทธ๋ฌ๋ ์ค ๋๊ธฐ๋ถ์ด ๊ฐ์ฌํ๊ฒ๋ ์ค๋ง๋ฆฌ๋ฅผ ํ์ด์ฃผ์
จ๋ค. ๊ฐ๋๋ฐ๊ณ ๋๋ฌผ์ ํ๋ ธ๋ค(์ ๋ง).
๋จผ์ json ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ๋ฅผ ์ ๊น ์ด์ผ๊ธฐ ํ๊ณ ์ฝ๋๋ฅผ ๋ณด์.
๐ JSON๊ณผ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ
๐ JSON
JSON์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ HTTP ํต์ ์ ์ํ ๋ฐ์ดํฐ ํฌ๋งท์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ข ์๋์ง ์๋ ์ธ์ด ๋ ๋ฆฝํ ํฌ๋งท์ผ๋ก, ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ค. JSON์ ํค๋ ๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํ๋ค. ๊ฐ์ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๊ณผ ๊ฐ์ ํ๊ธฐ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ๋ฌธ์์ด์ ๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๋ฌถ์ด์ผ ํ๋ค. ๋ฐ์ ์์์ฒ๋ผ.
{
"name": "hee",
"age": 99,
"alive": true,
"hobby": ["์
๋ก์ด์ ์ฐ์ฑ
"]
}
๐ serializing, JSON.stringify( )
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๊ฐ์ฒด๋ฅผ ์ ์กํ๋ ค๋ฉด ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ดํ ํด์ผํ๋ค. ์ด๋ฅผ ์ง๋ ฌํ(serializing)๋ผ๊ณ ํ๋ค. JSON ์ง๋ ฌํ ๋ง๊ณ ๋, ๋ฐ์ด๋๋ฆฌ, XML ์ง๋ ฌํ๊ฐ ์๋ค. JSON์ JS๋ง๊ณ ๋ค๋ฅธ ์ธ์ด์์๋ ์ด์ฉํ ์ ์์ด์ ๋ค์ํ ์ํํธ์จ์ด ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. JSON.stringify()์ ๊ฐ์ฒด ๋ฟ ์๋๋ผ ๋ฐฐ์ด๊ณ JSON ํฌ๋งท์ ๋ฌธ์์ด๋ก ๋ณํ์ํจ๋ค.
๐ deserializing, JSON.parse( )
์๋ฒ๋ก๋ถํฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ ์ก๋ JSON ๋ฐ์ดํฐ๋ ๋ฌธ์์ด์ด๋ค. ์ด ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก์ ์ฌ์ฉํ๋ ค๋ฉด JSON ํฌ๋งจ์ ๋ฌธ์์ด์ ๊ฐ์ฒดํํด์ผ ํ๋ค. ์ด๋ฅผ ์ญ์ง๋ ฌํ๋ผ๊ณ ํ๋ค. ์ด๋ ์ฌ์ฉํ๋ ๋ฉ์๋๊ฐ JSON.parse()์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด | JSON | |
ํค | ํค๋ ๋ฐ์ดํ ์์ด ์ธ ์ ์์ { key : "property" } |
๋ฐ๋์ ์๋ฐ์ดํ๋ฅผ ๋ถ์ฌ์ผ ํจ '{"key":"property"}' |
๋ฌธ์์ด ๊ฐ | ์์๋ฐ์ดํ๋ ์ฌ์ฉ ๊ฐ๋ฅ { "key" : 'property' } |
๋ฐ๋์ ํฐ๋ฐ์ดํ๋ก ๊ฐ์ธ์ผ ํจ '{"key":"property"}' |
ํค์ ๊ฐ ์ฌ์ด ๊ณต๋ฐฑ | ์ฌ์ฉ ๋ถ๊ฐ๋ฅ {"key":"property"} |
์ฌ์ฉ ๊ฐ๋ฅ '{ "key" : 'property' }' |
ํค-๊ฐ ์ ์ฌ์ด ๊ณต๋ฐฑ | ์ฌ์ฉ ๊ฐ๋ฅ { "key":'property', num:1 } |
์ฌ์ฉ ๋ถ๊ฐ๋ฅ '{"key":"property","num":1}' |
๐ Fetch์ JSON
๊ทธ๋ฆฌ๊ณ ๋ ์ฃผ์ํ ์ , Fetch!
HTTP ์์ฒญ์ ์ ์กํ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ API์ธ fetch์์๋ ๋น์ฐํ JSON์ ์ฌ์ฉํ๋ค. fetch ํจ์์๋ HTTP ์์ฒญ์ ์ ์กํ URL๊ณผ HTTP ์์ฒญ ๋ฉ์๋, HTTP ์์ฒญ ํค๋, ํ์ด๋ก๋ ๋ฑ์ ์ค์ ํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ค.
๊ทธ๋ฐ๋ฐ fetch ํจ์๋ก ์์ฒญํ ๊ฒฐ๊ณผ๋ (๋น์ฐํ๊ฒ๋) ๋ด๊ฐ ์ํ๋ ๊ฐ๋ง ์ ๋์ค๋ ๊ฒ ์๋๋ค.
fetch ํจ์๋ HTTP ์๋ต์ ๋ํ๋ด๋ Response ๊ฐ์ฒด๋ฅผ ๋ํํ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
// fetch ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋
post(path, body) {
fetch(`http://localhost:4999/${path}`, {
method: "POST",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json",
},
})
.then((res) => {
console.log(res);
console.log(res.json());
res.json();
})
.then((json) => {
this.render(json);
});
}
response ๊ฐ์ฒด์ body: (...) ์ด ๋ณด์ธ๋ค. ๋ฐ๋ ์์๋ readablestream ์ด ์๋ค.
๊ทธ๋ฆฌ๊ณ PromiseResult์๋ ๋ด๊ฐ ๋ณด๋ธ ์๋ฌธ์ 'z'์ ๋ํ ์๋ต์ธ ๋๋ฌธ์ 'Z'๊ฐ ๋ค์ด๊ฐ ์๊ณ , ํํ๋ ์ํ์ด๋ค.
(์ฌ์ค ์ด ๋ถ๋ถ์ด ์์ง ์ดํด๊ฐ ์๊ฐ๋ค. ํ๋ก๋ฏธ์ค ์์ ๋ฆฌ์คํฐ์ค๋ ์๋๊ณ , ๋ฆฌ์คํฐ์ค๊ฐ ๋จผ์ ๋์ค๋ ์ด์ ๊ฐ ๋ญ๊น? ์๋ง readablestream์ ๋ํด ๊ณต๋ถํ๋ฉด ๊ถ๊ธ์ฆ์ด ํ๋ฆด ๋ฏํ๋ค)
๊ทธ๋ผ ์ด ์ํ์์ ๋ณธ๊ฒฉ์ ์ผ๋ก ๊ณผ์ ์ฝ๋๋ฅผ ๋ณด์.
๐ mini node server ๊ณผ์
//basic-server.js
//๋ฆฌํฉํ ๋งํ๋ฉฐ ์ถ๊ฐํ ๋ถ๋ถ
const express = require("express");
const app = express();
const jsonParser = express.json({ strict: false });
const cors = require("cors");
//
const http = require("http");
const PORT = 4999;
const ip = "localhost";
app.use(cors());
app.get("/", (req, res) => {
// get์ ํด์ฃผ์ง ์์ผ๋ฉด ์๋ฒ์ 'cannot GET /'์ด ๋ฌ๋ค.
res.send("Hello World!");
});
app.post("/lower", jsonParser, function (req, res) {
res.json(req.body.toLowerCase());
});
app.post("/upper", jsonParser, function (req, res) {
res.json(req.body.toUpperCase());
});
app.listen(PORT, () => {
console.log(`Example app listening on port ${PORT}`);
});
์ต์คํ๋ ์ค ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
ํน์ ์๋ํฌ์ธํธ๋ก ๋ค์ด์จ ์์ฒญ์ ๋ฐ๋๋ฅผ ๋ฐ๊ณ , ๊ทธ ๋ฐ๋์ ์คํธ๋ง์ toLowerCase/toUpperCase ํด์ ์๋ต์ผ๋ก ๋๋ ค์ค๋ค.
์ฌ๊ธฐ์ ์๋ต์ ๊ทธ๋ฅ send๋ก ์ฃผ๋ฉด ์๋๋ค. .json()์ ํตํด, ๋ธ๋ผ์ฐ์ ๋ก json๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ ๋ณด๋ด์ค๋ค.
(์์ฒญ) ๋ฐ๋๋ฅผ ๋ฐ์ ๋ express.json() ์ผ๋ก string -> json
(์๋ต) ๋ฐ๋๋ฅผ ๋ณด๋ผ ๋ .json()์ผ๋ก string -> json
๊ทธ๋ผ, ๋ธ๋ผ์ฐ์ ๋ json ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊น?
์ด ์ฝ๋์ fetch .then์ผ๋ก ์๋ต ๊ฐ์ฒด๊ฐ ๋ค์ด์จ๋ค.
// App.js
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:4999/${path}`, {
method: "POST",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json",
},
})
.then(
(res) => res.json()
)
.then((json) => {
this.render(json);
});
}
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();
๋๋ App.js ํ์ผ์ ์กด์ฌ ์์ฒด๋ฅผ ์๊ณ ์์๋ค.
์ด ํ์ผ์ fetch๋ก ์์ฒญ์ ๋ณด๋ด๊ณ ๋ฐ์์ค๋ ๊ฑด๋ฐ...!
์ค์ํ ๋ถ๋ถ๋ง ์์ธํ ๋ณด์.
post(path, body) {
fetch(`http://localhost:4999/${path}`, {
method: "POST",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json",
},
})
.then(res => res.json()
)
.then((res) => {
this.render(res);
});
}
fetch๋ก ์์ฒญ(์์ ๋ณธ request)์ ๋ณด๋ด๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ ์๋ต ๊ฐ์ฒด๋ก, then์ผ๋ก ๋ฐ์์ฌ ์ ์๋ค.
then์ ๋ด๊ธด res๋ readablestream์ ํฌํจํ ์๋ต ๊ฐ์ฒด์ด๋ค. ๊ทธ๋ฆฌ๊ณ , ์ด res์ .json() ๋ฉ์๋๋ฅผ ํด์ค๋ค.
res.json()์ ํด์ฃผ๋ฉด ์๋ต ๊ฐ์ฒด์ ๋ฐ๋๋ง ์ฝ์ด json์์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐ์ดํฐ๋ก ๋ฐ๊ฟ์ค๋ค(์ญ์ง๋ ฌํ).
๊ทธ๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ฝ์ ์ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ res๋ resnder ํจ์ ์์ผ๋ก ๋ค์ด๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ฟ๋ ค์ง๋ค!
๋ค์ ์์ฒญ์ ๋ฐ์ ๋ณด๋ด๊ณ , ์๋ต์ ๋๋ ค๋ณด๋ด then์ผ๋ก ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ณด์.
const jsonParser = express.json({ strict: false });
app.post("/lower", jsonParser, function (req, res) {
res.json(req.body.toLowerCase()); // ์ฌ๊ธฐ์ res.json()์ ์ง๋ ฌํ ๋ฉ์๋
});
.then(res => res.json() //์ฌ๊ธฐ์ res.json์ ์ญ์ง๋ ฌํ ๋ฉ์๋
)
.then((res) => {
this.render(res);
});
์ฃผ์ํด์ผํ ์ ์, then์์ res์ ํด์ค .json์ ์ง๋ ฌํ๊ฐ ์๋๋ผ, ์ญ์ง๋ ฌํ ๋ฉ์๋๋ค.
์๊น๋ ์ง๋ ฌํ๋ผ๊ณ ํ๋๋ ์ญ์ง๋ ฌํ๋ผ๋.
๐ res.json( )
์ด๋ฒ ๊ณผ์ ์์ ๋์จ json()๋ฉ์๋๋ ๋ ์ข ๋ฅ๊ฐ ์๋ค.
- Express์ res.json() : ์ง๋ ฌํ
- fetch์ ์๋ต์ ์ฌ์ฉํ๋ .json(): ์ญ์ง๋ ฌํ
๐ Express์ res.json() : ์ง๋ ฌํ
res.json([body])
Sends a JSON response. This method sends a response (with the correct content-type) that is the parameter converted to a JSON string using JSON.stringify().
The parameter can be any JSON type, including object, array, string, Boolean, number, or null, and you can also use it to convert other values to JSON.
https://expressjs.com/ko/api.html#res.json
res.json(null)
res.json({ user: 'tobi' })
res.status(500).json({ error: 'message' })
๐ fetch์ ์๋ต์ ์ฌ์ฉํ๋ .json(): ์ญ์ง๋ ฌํ
ํ๋ก๋ฏธ์ค๊ฐ ๋ํํ๊ณ ์๋ MIME ํ์ ์ด application/json์ธ HTTP ์๋ต ๋ชธ์ฒด๋ฅผ ์ทจ๋ํ๋ ค๋ฉด Response.prototype.json ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
Response.prototype.json ๋ฉ์๋๋ response ๊ฐ์ฒด์์ HTTP ์๋ต ๋ชธ์ฒด๋ฅผ ์ทจ๋ํ์ฌ ์ญ์ง๋ ฌํ ํ๋ค
๋ผ๊ณ ํจ.
๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ 865ํ์ด์ง
MDN Response.json() (https://developer.mozilla.org/en-US/docs/Web/API/Response/json)
Note that despite the method being named json(), the result is not JSON but is instead the result of taking JSON as input and parsing it to produce a JavaScript object.
์ด ๋ฉ์๋๊ฐ json()์ผ๋ก ๋ช ๋ช ๋์์์๋ ๋ถ๊ตฌํ๊ณ ๊ฒฐ๊ณผ๋ JSON์ด ์๋๋ผ JSON์ ์ ๋ ฅ์ผ๋ก ๋ฐ์๋ค์ด๊ณ ์ด๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฐ๊ณผ์ด๋ค.
MDN
๋๊ฐ์ด ์๊ฒผ๋๋ฐ ์ฐ์์ด ์ ๋ฐ๋์ฌ์ ํ๋ค์๋ค. ํ์ง๋ง ์๊น์๋ง ๋ค๋ฅด๊ณ ์ฐ๋ ๋ฐฉ๋ฒ, ์ํฉ๋ ๋ค๋ฅด๋ ์ด์ ํท๊ฐ๋ฆด ์ผ์ ์์ ๊ฒ์ด๋ค.
๐ mini node server์์ ๋ฐ์ดํฐ๊ฐ ์ค๊ณ ๊ฐ๋ ๊ณผ์
fetch๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฆฌํดํ๋ค.
fetch๊ฐ ๋ฆฌํดํ ํ๋ก๋ฏธ์ค๋ response ๊ฐ์ฒด๋ฅผ ๋ํํ๊ณ ์๋ค.
์ฐ๋ฆฌ๋ response ๊ฐ์ฒด๊ฐ ๊ฐ์ง ์๋ต ๋ชธ์ฒด๊ฐ ํ์ํ๋ค.
response ๊ฐ์ฒด์ ์๋ต ๋ชธ์ฒด๋ MIME ํ์ ์ด application/json์ด๋ค.
fetch์ ์ฌ์ฉํ๋ response.json() ๋ฉ์๋๋ก ์๋ต ๋ชธ์ฒด๋ฅผ ์ทจ๋ํ ์ ์๋ค.
response.json()์ ์๋ต ๊ฐ์ฒด์ ํค๋, ๋ฐ๋๋ฅผ ๋ค ๊ฐ์ ธ์์ ๋ฐ๋๋ง ์ฝ๊ณ ์ญ์ง๋ ฌํ ํ๋ค.
๋ค์ ๋งํด fetch๋ก ๊ฐ์ ธ์จ ํ๋ก๋ฏธ์ค๋ฅผ response.json()์ผ๋ก ๋ฐ๋๋ฅผ ์ญ์ง๋ ฌํ ํ๋ค.
ํ๋ก๋ฏธ์ค์ ์ญ์ง๋ ฌํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํจ!
์ด ์ญ์ง๋ ฌํ ๋ ๋ฐ์ดํฐ๊ฐ App.js์ render() ํจ์๋ก ๋ค์ด๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ๋๋ค.
------------------------------------------------------------------------------------------------------------------------
์๋ฒ์ req ๋ณด๋ผ ๋ express.json() ์ผ๋ก ๋ฐ๋๋ฅผ json์ผ๋ก ํ์ฑํ๋ค.
์๋ฒ๋ ๋ฐ๋๋ฅผ ๋ฐ์์ ์ํ๋ ์๋ต์ ์ค์ผํ๋๋ฐ,
์๋ต ์ญ์ ์๋ฒ๋ฅผ ์ง๋ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด์ง๊ธฐ ๋๋ฌธ์(์ ํํ๋ ํ์น๋ฅผ ํตํด ๋ฐ๋ ํ๋ก๋ฏธ์ค ํํ์ด๋ค)
json ํํ๋ก ๋ณด๋ด์ผํ๋ค.
๋ธ๋ผ์ฐ์ ์์๋ ํ๋ก๋ฏธ์ค ์์ ์๋ ์๋ต ๋ชธ์ฒด๋ฅผ ๋ฐ์ ์ฌ์ฉํด์ผํ๋ค.
์ฌ๊ธฐ์, ๋ฐ์์จ ์๋ต์ response.json() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ญ์ง๋ ฌํ๋ ์๋ต ๋ชธ์ฒด (๋ฐ๋๋ง) ์ฌ์ฉํ ์ ์๋ค.
์ด ๋ฐ๋(์ญ์ง๋ ฌํ, JS ๋ฐ์ดํฐ์ธ ์คํธ๋ง ์ํ)๋ฅผ render ํจ์ ์์ ๋ฃ์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ์ถ๋ ฅ์ํจ๋ค.
Reference
SY
๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ
์ฝ๋์คํ
์ด์ธ
MDN
Express
https://cmang9.tistory.com/97
https://velog.io/@wonyuuu/JavaScript-JSON.parse-JSON.stringify