- ๋ ํฌ์งํ ๋ฆฌ ํด๋ก
$ git clone https://github.com/gyulls2/MSW_MINI_DASHBOARD.git- ํจํค์ง ๋ค์ด๋ก๋
$ npm i- ์คํ
$ npm run start- ์ฃผ์ : MSW(Mock Service Worker)๋ก MINI_DASHBOARD ๊ตฌํ
- ์ฃผ์ ๊ธฐ๋ฅ :
- MSW๋ก ๋ชจํนํ ๋ฐ์ดํฐ๋ฅผ 3์ข ์ ์ฐจํธ๋ก ์๊ฐํํฉ๋๋ค. ๋ฐ์ดํฐ๋ 10์ด๋ง๋ค ๊ฐฑ์ ๋ฉ๋๋ค.
- ์๊ฐ ๋ฒ์ selector๋ก ์ฐจํธ์ ๋ณด์ฌ์ง ๋ฐ์ดํฐ ๋ฒ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
- ๋ฒํผ์ผ๋ก ์ฐจํธ๋ฅผ ๋์๋ณด๋์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
- ๊ฐ ์ฐจํธ์ value๊ฐ 500 ์ด์์ผ ๋, ๊ฐ์ ์์์ด ๋ณํํฉ๋๋ค.
- ๋ง์ฐ์ค ๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก ์ฐจํธ์ ์์น์ ํฌ๊ธฐ๋ฅผ ์ํ๋ ๋๋ก ์กฐ์ํ ์ ์์ต๋๋ค.
- ๊ธฐ์ ์คํ
๐ย 02.26
- ์๊ตฌ์ฌํญ ํ์ธ ๋ฐ ์ค๊ณ
- ๊ฐ๋ฐ ํ๊ฒฝ์ค์
- ์ปค๋ฐ ์ปจ๋ฒค์ , ๊นํ๋ธ ์ด์ ํ ํ๋ฆฟ ์ถ๊ฐ
๐ย 02.27
-
MSW(Mock Service Worker) ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
-
์๋น์ค ์์ปค ์์ฑ :
setupWorker()
๐ฅhandler.jsํ์ผ ์๋ ์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ ๋ฐ์Uncaught Invariant Violation: [MSW] Failed to construct "SetupWorkerApi" given an Array of request handlers.
Make sure you spread the request handlerswhen calling the respective setup function.SetupWorkerApi์์ฑ์๊ฐ Array ํํ์ request handlers๋ฅผ ๋ฐ์ ๋, ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์.
export const handlers = [chartHandlers]; // ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ export const handlers = [...chartHandlers];
-
MSW ์๋ฒ ๊ตฌ๋ ํ ์คํธ :
fetch()- ๋ฐ์ดํฐ ์ฝ์์ ์ถ๋ ฅ ํ์ธ
๐ฅย ๋ผ์ธ ์ฐจํธ โ ์๊ฐ ๋ฒ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ ๊ฐ์๊ฐ ๋๋ฌด ์ ๊ฒ ์ถ๋ ฅ๋๋ ์ด์ ๋ฐ์์๊ฐ ๋ฒ์๊ฐ ํ๋ฃจ์ผ ๋ : ๋ฐ์ดํฐ 9๊ฐ ์ถ๋ ฅ, ์๊ฐ ๋ฒ์๊ฐ ํ ์๊ฐ์ผ ๋ : ๋ฐ์ดํฐ 1๊ฐ ์ถ๋ ฅ โ ์๊ฐ ๋ฒ์์ ๋ฐ๋ผ ๋ฐ์ดํฐ ๊ฐ์๊ฐ ๋ถ์กฑํ ๋, ์ฐจํธ๊ฐ ๊ทธ๋ ค์ง์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์๋ฅผ ๋๋ ค์ ํด๊ฒฐํ์๋ค.
resolverํด๋ ํ์ผ๋ค์interval๋ณ์ ๊ฐ ์์
- ๋ฐ์ดํฐ ์ฝ์์ ์ถ๋ ฅ ํ์ธ
๐ย 02.28
-
line, pie, value ์ฐจํธ ๊ตฌํ :
Chart.js
๐ฅย ๋น๋๊ธฐ์ฒ๋ฆฌ ์ด์Cannot read property 'map' of undefined.
labels: pieData.data.map((item) => item.name); // pieData.data์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํด์ผ mapํจ์๋ฅผ ์คํํ๋๋ก ์์ labels: pieData && pieData?.data?.map((item) => item.name);
-
10์ด๋ง๋ค ์ฐจํธ ๋ฐ์ดํฐ ๊ฐฑ์ ๊ธฐ๋ฅ :
useInterval(custom hook)
๐ฅย setInterval ์ด์setInterval์ด ์ผ์ ์๊ฐ๋ง๋ค ์์ ์ ์ํํ๋ ค ๋ ๋๋ง ๋ ๋๋ง๋ค useState์ ๊ฐ์ด ์ด๊ธฐ๊ฐ์ผ๋ก ๋ค์ ์ธํ ๋๋ ์ด์๊ฐ ๋ฐ์ํ๋ค(setInterval ์คํ์ ๋ด๋ถ์ ํด๋ก์ ๊ฐ ๋ฐ์). ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๋ฐ์ดํธ ๋ state๋ฅผ ๋ฐ์ํ ์ ์๋ ์ปค์คํ ํ
useInterval์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์๋ค. -
์๊ฐ ๋ฒ์ selector ๊ธฐ๋ฅ :
MUI ๋ผ์ด๋ธ๋ฌ๋ฆฌ(UI)
๐ย 03.01
- ์ฐจํธ ์ปดํฌ๋ํธ ํฌ๊ธฐ ์กฐ์ ๊ธฐ๋ฅ(๋ง์ฐ์ค Drag) : CSS
resize: both;์์ฑ ์ถ๊ฐ - ์ฐจํธ ์ปดํฌ๋ํธ ์์น ์กฐ์ ๊ธฐ๋ฅ(๋ง์ฐ์ค Drag) :
react-draggable ๋ผ์ด๋ธ๋ฌ๋ฆฌ - ์ฐจํธ๋ฅผ ๋์๋ณด๋์ ์ถ๊ฐ / ์ ๊ฑฐ ๋ฒํผ ๊ตฌํ
- ์ปดํฌ๋ํธ ์คํ์ผ๋ง :
styled-components - readme ์์ฑ
- GET /timeseries API ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ๊ฒฐ๊ณผ ์๊ฐ ๋ฒ์๊ฐ ํ๋ฃจ์ผ ๋ ๋ฐ์ดํฐ 9๊ฐ ์ถ๋ ฅ๋์๊ณ , ์๊ฐ ๋ฒ์๊ฐ ํ ์๊ฐ์ผ ๋๋ ๋ฐ์ดํฐ๊ฐ 1๊ฐ ๋ฐ์ ์ถ๋ ฅ๋์ง ์์ ์ฐจํธ๊ฐ ๊ทธ๋ ค์ง์ง ์๋ ์ด์๊ฐ ๋ฐ์ํ๋ค.
resolverํด๋timeseries.jsํ์ผ์interval๋ณ์ ๊ฐ์ ์์ ํ๋ค.interval๋ณ์๋ 10*1000์ ๊ฐ์ผ๋ก ์ค์ ๋์ด ์๋ค. 10์ด๋ฅผ ๋ฐ๋ฆฌ์ด๋ก ๋ณํํ ๊ฐ์ด๋ฉฐ, ๋ฐ์ดํฐ๊ฐ 10์ด ๊ฐ๊ฒฉ์ผ๋ก ๊ธฐ๋ก๋์์์ ์๋ฏธํ๋ค.interval์ ๊ฐ์ 0.1*1000๋ก ์์ ํ์๋ค. 1์๊ฐ, 30๋ถ, 10๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์๊ฐ ๋ฒ์๋ฅผ ์ค์ ํ์ฌ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ๊ฐ ์ถ๋ ฅ๋ ์ ์๋๋ก ๊ธฐ๋ก ์๊ฐ์ 0.1์ด๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
- ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ chart์ ๋ผ๋ฒจ๋ก ๋ฟ๋ ค์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค. map ํจ์๋ฅผ ์ฌ์ฉํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ์ ํ๋๋ฐ ๋ค์๊ณผ ๊ฐ์ ์คํ์ค๋ฅ ๋ฐ์.
Cannot read property 'map' of undefined.
- fetch ์์ฒญ์ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ๋ค. map์ด ์คํ๋ ๋น์์ ๋ฐ์ดํฐ๊ฐ ์์ง ์ ์ฅ๋์ง ์์ ์ํ์ฌ์ ์ค๋ฅ๊ฐ ๋ฐ์ํจ.
- pieData.data์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํด์ผ mapํจ์๋ฅผ ์คํํ๋๋ก
?์ฐ์ฐ์๋ฅผ ๋ถ์ฌ์ฃผ์๋ค.
labels: pieData.data.map((item) => item.name);
// pieData.data์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํด์ผ mapํจ์๋ฅผ ์คํํ๋๋ก ์์
labels: pieData.data?.map((item) => item.name);- 10์ด๋ง๋ค ์ฐจํธ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด setInterval ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
- ๋ฌธ์ ๋ ์๊ฐ ๋ฒ์ selector์ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด useState๋ฅผ ์ฌ์ฉํ์๊ณ , setInterval์ด ์ผ์ ์๊ฐ๋ง๋ค ์์ ์ ์ํํ๋ ค ๋ ๋๋ง ๋ ๋๋ง๋ค useState์ ๊ฐ์ด ์ด๊ธฐ๊ฐ์ผ๋ก ๋ค์ ์ธํ ๋๋ ์ด์๊ฐ ๋ฐ์ํ๋ค. ์ด ๋ฌธ์ ๋๋ฌธ์ ์๊ฐ ๋ฒ์ selector๋ฅผ 30๋ถ์ผ๋ก ์กฐ์ ํ์ฌ๋ 10์ด ํ ๋ค์ ์ด๊ธฐ๊ฐ์ธ 1์๊ฐ ๋ฒ์๋ก ๋์๊ฐ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
- ์์กด์ฑ ๋ฐฐ์ด๋ก ๋น ๋ฐฐ์ด์ ๊ฐ์ง useEffect๋ ์ฒ์ mount ์์ ์ ํ ๋ฒ ์คํ๋๋ค. ๋ฐ๋ผ์ useEffect๋ ์ฒซ ๋ ๋์ state๋ฅผ ์ด์ฉํด์ setInterval์ ์คํํ๋๋ฐ, ์ดํ๋ก๋ ํด๋น useEffect๊ฐ ๋ค์ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ setInterval์ ํด๋ก์ ธ๋ ๊ณ์ํด์ ์ฒซ ๋ ๋์ state๋ฅผ ๊ธฐ์ตํ๊ณ ์๋ค. ๊ทธ ํ์ state๊ฐ ๋ณ๊ฒฝ๋์ด๋ interval์์ state๋ ๊ณ์ํด์ ์ฒซ ๋ ๋์ state๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ค.
- ์
๋ฐ์ดํธ ๋ state๋ฅผ ๋ฐ์ํ ์ ์๋ ์ปค์คํ
ํ
useInterval
import React, { useState, useEffect, useRef } from "react";
const useInterval = (callback, delay) => {
const savedCallback = useRef(); // ์ต๊ทผ์ ๋ค์ด์จ callback์ ์ ์ฅํ ref๋ฅผ ํ๋ ๋ง๋ ๋ค.
// Remember the latest callback.
useEffect(() => {
savedCallback.current = callback; // callback์ด ๋ฐ๋ ๋๋ง๋ค ref๋ฅผ ์
๋ฐ์ดํธ ํด์ค๋ค.
}, [callback]);
// Set up the interval.
useEffect(() => {
function tick() {
savedCallback.current(); // tick์ด ์คํ๋๋ฉด callback ํจ์๋ฅผ ์คํ์ํจ๋ค.
}
if (delay !== null) {
let id = setInterval(tick, delay); // delay์ ๋ง์ถ์ด interval์ ์๋ก ์คํ์ํจ๋ค.
return () => clearInterval(id); // unmount๋ ๋ clearInterval์ ํด์ค๋ค.
}
}, [delay]); // delay๊ฐ ๋ฐ๋ ๋๋ง๋ค ์๋ก ์คํ๋๋ค.
};
export default useInterval;๐ย useRef, callback ํจ์๋ฅผ ์ ์ฅํ๋ useEffect, setInterval์ ํธ์ถํ๋ useEffect ๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
useRefํ ์ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์ง- callback ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ ๋๋ง๋คย
useEffect๊ฐ ์คํ๋์ดยsavedCallback์ current ๊ฐ์ด ์๋ก์ด callback ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธ ๋๋ค. - ์ด๋ฅผ ํตํด ์ต๊ทผ ๋ ๋๋ง ์ดํ์ ์ค์ ํ callback์ ์ฝ์ ์ ์๊ณ , interval tick์์ ํธ์ถํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ฐ์ดํธ๋ state๋ฅผ ๋ฐ์ํ ์ ์๋ค.
๐ย ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์๋ค.
const [sec, setSec] = useState(0);
useEffect(() => {
setInterval(() => {
const setTime = sec ? sec : 3600;
setFrom(Math.floor(Date.now() / 1000) - setTime);
setTo(Math.floor(Date.now() / 1000));
}, 10000);
}, []);
// useEffect๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , setInterval ํจ์๋ฅผ useInterval๋ก ๊ต์ฒด
useInterval(() => {
const setTime = sec ? sec : 3600;
setFrom(Math.floor(Date.now() / 1000) - setTime);
setTo(Math.floor(Date.now() / 1000));
}, 10000);๐ฆย MSW_MINI_DASHBOARD
๐src
โฃ ๐components
โ โฃ ๐chart
โ โ โฃ ๐LineChart.jsx
โ โ โฃ ๐PieChart.jsx
โ โ โ ๐ValueChart.jsx
โ โฃ ๐chartSelector
โ โ โ ๐ChartSelector.jsx
โ โ ๐timeSelector
โ โ โฃ ๐CurrentTime.jsx
โ โ โ ๐TimeSelector.jsx
โฃ ๐hooks
โ โ ๐useInterval.js
โฃ ๐mocks
โ โฃ ๐resolver
โ โ โฃ ๐pie.js
โ โ โฃ ๐timeseries.data.js
โ โ โฃ ๐timeseries.js
โ โ โ ๐value.js
โ โฃ ๐browser.js
โ โ ๐handler.js
โฃ ๐App.css
โฃ ๐App.jsx
โฃ ๐index.css
โ ๐index.js
| Feat | ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๊ฒฝ์ฐ |
|---|---|
| Fix | ๋ฒ๊ทธ๋ฅผ ๊ณ ์น ๊ฒฝ์ฐ |
| Style | CSS ๋ฑ ์ฌ์ฉ์ UI ๋์์ธ ๋ณ๊ฒฝ |
| Refactor | ํ๋ก๋์ ์ฝ๋ ๋ฆฌํฉํ ๋ง |
| Comment | ํ์ํ ์ฃผ์ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ |
| Docs | ๋ฌธ์๋ฅผ ์์ ํ ๊ฒฝ์ฐ |
| Test | ํ ์คํธ ์ถ๊ฐ, ํ ์คํธ ๋ฆฌํฉํ ๋ง(ํ๋ก๋์ ์ฝ๋ ๋ณ๊ฒฝ X) |
| Chore | ๋น๋ ํ ์คํธ ์ ๋ฐ์ดํธ, ํจํค์ง ๋งค๋์ ๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ(ํ๋ก๋์ ์ฝ๋ ๋ณ๊ฒฝ X) |
| Rename | ํ์ผ ํน์ ํด๋๋ช ์ ์์ ํ๊ฑฐ๋ ์ฎ๊ธฐ๋ ์์ ๋ง์ธ ๊ฒฝ์ฐ |
| Remove | ํ์ผ์ ์ญ์ ํ๋ ์์ ๋ง ์ํํ ๊ฒฝ์ฐ |
- msw ๋ชจํน
Mocking REST API - Getting Started
MSW๋ก ๋ฐฑ์ค๋ API ๋ชจํนํ๊ธฐ
- Fetch ํจ์
Using the Fetch API - Web APIs | MDN
- chart.js
Integrate Chart.js Using React with Data from a REST API (2022)
- React ์คํ์ค๋ฅ Cannot read property 'map' of undefined(๋น๋๊ธฐ์ฒ๋ฆฌ)
React ์คํ์ค๋ฅ Cannot read property 'map' of undefined
[์ค๋ฅํด๊ฒฐ] TypeError: Cannot read property 'map' of undefined
- setInterval
Hook ์์ฃผ ๋ฌป๋ ์ง๋ฌธ โ React
Making setInterval Declarative with React Hooks
๋ฒ์ญ / ๋ฆฌ์กํธ ํ ์ค ์ปดํฌ๋ํธ์์ setInterval ์ฌ์ฉ ์์ ๋ฌธ์ ์
React์์ setInterval ํ๋ช ํ๊ฒ ์ฌ์ฉํ๊ธฐ(feat. useInterval)
