![](https://blog.kakaocdn.net/dn/rdSp7/btr9CJ3a2D3/Z7lcYXypCA8ISHwFxk7uRK/img.png)
![](https://blog.kakaocdn.net/dn/lsaEj/btr9At06tM5/XDnqjQTSMKXHwYUEzKMwH0/img.png)
์์ฑ๋ณธ ์ฌ์ง...
๋ ์ธ ๊ณ
JSON-SERVER ?
๋น๊ต์ ๊ฐํธํ๊ฒ ์์ฃผ ์งง์ ์๊ฐ์ ๋ค์ฌ REST API๋ฅผ ๊ตฌ์ถํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
์ฃผ๋ก ํ๋กํ ํ์ ์ ๋ง๋ค๊ฑฐ๋, ๊ณต๋ถํ๊ณ ์ค์ตํ ๋.. ์ด์ฉํ๋ ์๋ฒ๋ก ์ฌ์ฉํ๋ฉด ์์ฃผ ๊ตฟ์ธ ๋๊ตฌ !
REST API ์๋ฒ์ ์ ๋งํ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ ๊ฐ์ถ๊ณ ์๋๋ฐ ํ๋ก๋์ ์ฉ์ผ๋ก๋ ๋ถ์ ํฉํ๋ค๊ณ ํ๋ค.
๋๋ ๊ณต๋ถํ๊ธฐ ์ํ ์ฉ์ด๋๊น ์๋ฌดํผ ๋ ์ธ ๊ณ ~!
๐ JSON SERVER Setup
๋๋ npm์ ์ฌ์ฉํด์ json-server๋ฅผ ์ค์นํ๋ค.
์๋ฒ๋ฅผ ๋ถ์ด๊ณ ์ถ์ react ํ์ผ์ด ์๋ ํด๋ ์ต์๋จ์์ ํฐ๋ฏธ๋์ ์ด์ด์
// ์๋ฒ ํด๋๋ฅผ ๋ง๋ค์ด์ค๋ค. ๋๋ ์ฑ์ฅ์ฉ์ด๋ผ ์ด๋ฆ์ ์ด๋ ๊ฒ ์ง์๋ค.
$ mkdir server-grow
// ๋ง๋ ์๋ฒ ํด๋๋ก ์ด๋
$ cd ./server-grow
// json-server ์ค์น
$ npm init -y
$ npm install json-server --save-dev
์ด๋ ๊ฒ ํ๋ฉด ๊ธฐ๋ณธ ์ค์ ๋์ด๊ณ ..
์ด์ ํ
์คํธ๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ๊ธฐ ์ํ db.json ํ์ผ์ ๋ง๋ค์ด์ผ ํ๋ค.
{
"ssukssuk": [
{
"id": 1,
"content": "์๋
ํ์ธ์ ๐โ๏ธ"
},
{
"id": 2,
"content": "์ข์ ์์นจ์
๋๋ค ~"
},
{
"id": 3,
"content": "๋ ์จ๊ฐ ๋๋ฌด ์ข์์ ๐"
},
{
"id": 4,
"content": "๋ฑ ํด๊ทผํ๊ณ ์ถ์ ๋ ์จ !"
},
{
"id": 5,
"content": "๐ต๐ต"
}
]
}
์ฅ์ฅ ์๋ผ๊ณ ์ถ์ ๋ง์์ ๋ด์ ๊ทธ๋ฃน ์ด๋ฆ์ ๋ณผ ์ ์๋ค...
์ด์ json-server๋ฅผ ์คํํด๋ณด์.
json-server๊ฐ db.json ํ์ผ์ ๋ฐ๋ผ๋ณด๋๋ก ํด์ฃผ์.
$ json-server --watch db.json
๊ธฐ๋ณธ ํฌํธ๋ ๋น์ฐ 3000๋ฒ์ด๊ณ , ํฌํธ ๋ณ๊ฒฝํ๋ ค๋ฉด --port ์ต์ ์ ์ถ๊ฐํ๋๋ก ํ์. ๋ ์๊ด์์ด์ ๊ทธ๋ฅ ์ผ๋ค..
๋ง์ฝ ๋ณ๊ฒฝํ๊ณ ์ถ์ผ๋ฉด...
$ json-server --watch db.json --port (ํ๊ณ ์ถ์ ํฌํธ ๋ฒํธ)
๋๋ฌด ์น์ ํ๋ค...
๊ทธ๋ฆฌ๊ณ ๋ ๋งค๋ฒ json-server --watch db.json ์ ์จ์ ์ด๊ธฐ๋ ๊ท์ฐฎ์ผ๋๊น..
package.json ์ ์ด์ด์ ์คํฌ๋ฆฝํธ์ start ๋ถ๋ถ์ ๋ง๋ค์ด์ฃผ๋๋ก ํ์. ํ์๋ ์๋.
{
"name": "server-grow",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "json-server --watch db.json",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"json-server": "^0.17.1"
},
"dependencies": {
"lowdb": "^5.0.5"
}
}
์ด๋ ๊ฒ ์ธํ ํด๋๋ฉด.. ๋์ค์ ๋ค์ ํฌ ๋
$ npm start
๋ง ํด์ฃผ๋ฉด ๋๋ค. JSON ๊ธฐ๋ณธ ์ ํ ๋.
JSON-SERVER ํ ์คํธ
POSTMAN ์ ์ด์ฉํ๋ฉด ์ ๋ง๋ค์ด์ก๋์ง POST/INSERT/DELETE ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค.
๊ฐ์ ํ๊ณ ์ฒ์ฒํํด๋ณด๋ฉด ๊ฐ์ด๋ ์์ด๋ ์งํํ ์ ์์๋งํผ ๊ฐ๋จํ๋ค.
![](https://blog.kakaocdn.net/dn/bKTLiK/btr9MeaalXU/BjvmJxSOS6x97dw7gzPmB1/img.png)
๋ฐ์ดํฐ ์ ๊ฐ์ ธ์ค๋๊น ๋ฌธ์ ์๋๊ฑฐ ํ์ธํด์ฃผ๊ณ !
์ด์ ๋ณธ๋ก ์ด๋ค. REACT ์ ์ฐ๊ฒฐํ์.
JSON-SERVER ๐ค REACT
๋๊ฐ์ง๋ฅผ ๋ง๋ค๊ฑฐ๋ค.
- USEFETCH ํ
- ๋ณด์ฌ์ค ํ๋ฉด (APP.JS ์ ๋ ๋ค ๋๋ ค๋ฃ์ด๋ ๋ฌด๊ดํจ)
1. USEFETCH
์ด๋ค DB๋ฅผ ์กฐํํ๋ ์ด๊ฑฐ๋ ๋ฏธ๋ฆฌ ๋ฐ๋ก ๋นผ๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ ์ด์ ํ๋ก์ ํธ์์ ํ๋ ๊ฑฐ ๊ธ์ด์๋ค ^--^
์๋ฒ ์ชฝ ๋ง๊ณ ํ๋ฉด ๊ตฌํ ์ชฝ ํด๋์ component ์๋์ ๋์ถฉ ๋ฃ์ด์ฃผ์.
๊ทธ๋๋ ๋๋ hooks ํด๋๋ฅผ ๋ง๋ค์ด์ usefetch.js ๋ฅผ ์์ฑํด์คฌ๋ค.
![](https://blog.kakaocdn.net/dn/cNTlge/btr9AtmtfHQ/PkdVfItb0H5FpRz2QhuQHK/img.png)
// usefetch.js
import { useState, useEffect } from "react";
export default function useFetch(url) {
const [result, setResult] = useState(() => []);
useEffect(() => {
fetch(url)
.then((res) => {
return res.json();
})
.then((data) => {
setResult(data);
})
.catch((err) => {
console.error(`useFetch(${url}) error : `, err);
});
}, [url]);
return result;
}
๋์ถฉ url ๋๊ฒจ๋ฐ์ผ๋ฉด ๋ฐ์ดํฐ ์ ์ฅํด๋๋ค๊ฐ
๋ฐ์ดํฐ๋ง ๋๊ฒจ๋ฐ๊ฒ ๋ค๋ ์๋ฏธ๊ณ ..
๋์ค์ ๋ณ์์ ๋ฐ๋ก ๋ฃ์ด์ ๊บผ๋ด์ฐ๋ฉด ๋๋ค ์์ ์ข์ ~
๋ณด์ฌ์ค ํ๋ฉด
๋๋ ํญ ํ์์ผ๋ก ๊บผ๋ด์ด์ ์จ์ Grow1.js ๋ผ๋ ๊ณณ์์ ์์
์ ํ๋ค.
๊ทธ๋ฅ ๋จ์ง ํ
์คํธ์ฉ์ด๋ผ๋ฉด App.js ์ ๋๋ ค๋ฃ์ด๋ ์ง์ง ๋ฌด๊ดํ๋ค.
// Grow1.js
import {useState, useEffect} from 'react'
import useFetch from '../hooks/useFetch';
function Grow1() {
const TestData = useFetch('http://localhost:3000/ssukssuk');
if(TestData !== undefined && TestData !== null && TestData.length)
{
console.log(TestData);
}
return (
<div>
{TestData !== undefined && TestData !== null && TestData.length > 0 &&
TestData.map((item) => (
<div>{item.content}</div>
))}
</div>
)
}
export default Grow1
์ด๋ ๊ฒ ํ๋ฉด ๋ด๊ฐ ์ ์ฅํด๋ ๋ฐ์ดํฐ ์ ์ฒด์ content๋ฅผ ํ์ค์ฉ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค.
๊ทธ๋ฅ ๋ฐ์ดํฐ ์์ฒด๊ฐ ์ด๋ป๊ฒ ์๊ธด์ง ๊ถ๊ธํ๋ค๋ฉด..
์ฌ๊ธฐ์
console.log(TestData);
๋ฅผ ํด๋ณด์๋์ง..
์๋๋ฉด usefetch hook ์ชฝ์ผ๋ก ๊ฐ์ then(data) ๋ถ๋ถ ๊ดํธ ์์
console.log(data);
๋๋ ค๋ณด์๊ธธ...
![](https://blog.kakaocdn.net/dn/u9LFG/btr9AZk60Z8/ISd1DPWzKPNbx7Op8KXQ11/img.png)
์์ฑ