Skip to content

๐Ÿ“Š MSW(Mock Service Worker)๋กœ MINI_DASHBOARD ๊ตฌํ˜„

Notifications You must be signed in to change notification settings

gyulls2/MSW_MINI_DASHBOARD

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

28 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“Š MSW_MINI_DASHBOARD

msw_mini_dashboard ๋žœ๋”ฉํŽ˜์ด์ง€

1. ์‹คํ–‰ ๋ฐฉ๋ฒ•

  1. ๋ ˆํฌ์ง€ํ† ๋ฆฌ ํด๋ก 
 $ git clone https://github.com/gyulls2/MSW_MINI_DASHBOARD.git
  1. ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ
 $ npm i
  1. ์‹คํ–‰
 $ npm run start

2. ๊ฐœ์š”

  • ์ฃผ์ œ : MSW(Mock Service Worker)๋กœ MINI_DASHBOARD ๊ตฌํ˜„
  • ์ฃผ์š” ๊ธฐ๋Šฅ :
    • MSW๋กœ ๋ชจํ‚นํ•œ ๋ฐ์ดํ„ฐ๋ฅผ 3์ข…์˜ ์ฐจํŠธ๋กœ ์‹œ๊ฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” 10์ดˆ๋งˆ๋‹ค ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.
    • ์‹œ๊ฐ„ ๋ฒ”์œ„ selector๋กœ ์ฐจํŠธ์— ๋ณด์—ฌ์งˆ ๋ฐ์ดํ„ฐ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋ฒ„ํŠผ์œผ๋กœ ์ฐจํŠธ๋ฅผ ๋Œ€์‹œ๋ณด๋“œ์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐ’ ์ฐจํŠธ์˜ value๊ฐ€ 500 ์ด์ƒ์ผ ๋•Œ, ๊ฐ’์˜ ์ƒ‰์ƒ์ด ๋ณ€ํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์ฐจํŠธ์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋Œ€๋กœ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์ˆ  ์Šคํƒ

3. ์ž‘์—… ๊ธฐ๋ก

๐Ÿ“ย 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 handlers when calling the respective setup function.

    • SetupWorkerApi ์ƒ์„ฑ์ž๊ฐ€ Array ํ˜•ํƒœ์˜ request handlers๋ฅผ ๋ฐ›์„ ๋•Œ, ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ.
    export const handlers = [chartHandlers];
    
    // ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •
    export const handlers = [...chartHandlers];
  • MSW ์„œ๋ฒ„ ๊ตฌ๋™ ํ…Œ์ŠคํŠธ : fetch()

๐Ÿ“ย 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 ์ž‘์„ฑ

4. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

๐Ÿ“ย ์‹œ๊ฐ„ ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ ๊ฒŒ ์ถœ๋ ฅ๋˜๋Š” ์ด์Šˆ

  • GET /timeseries API ์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•œ ๊ฒฐ๊ณผ ์‹œ๊ฐ„ ๋ฒ”์œ„๊ฐ€ ํ•˜๋ฃจ์ผ ๋•Œ ๋ฐ์ดํ„ฐ 9๊ฐœ ์ถœ๋ ฅ๋˜์—ˆ๊ณ , ์‹œ๊ฐ„ ๋ฒ”์œ„๊ฐ€ ํ•œ ์‹œ๊ฐ„์ผ ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ 1๊ฐœ ๋ฐ–์— ์ถœ๋ ฅ๋˜์ง€ ์•Š์•„ ์ฐจํŠธ๊ฐ€ ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • resolver ํด๋” timeseries.jsํŒŒ์ผ์˜ interval ๋ณ€์ˆ˜ ๊ฐ’์„ ์ˆ˜์ •ํ–ˆ๋‹ค.
  • interval ๋ณ€์ˆ˜๋Š” 10*1000์˜ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค. 10์ดˆ๋ฅผ ๋ฐ€๋ฆฌ์ดˆ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์ด๋ฉฐ, ๋ฐ์ดํ„ฐ๊ฐ€ 10์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ๊ธฐ๋ก๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
  • interval ์˜ ๊ฐ’์„ 0.1*1000๋กœ ์ˆ˜์ •ํ•˜์˜€๋‹ค. 1์‹œ๊ฐ„, 30๋ถ„, 10๋ถ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์‹œ๊ฐ„ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•˜์—ฌ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ก ์‹œ๊ฐ„์„ 0.1์ดˆ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

๐Ÿ“ย React ์‹คํ–‰์˜ค๋ฅ˜ Cannot read property 'map' of undefined(๋น„๋™๊ธฐ์ฒ˜๋ฆฌ)

  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ 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);

๐Ÿ“ย setInterval ์ด์Šˆ

  • 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);

4. ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ

๐Ÿ“ฆย 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

5. ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

Feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ
Fix ๋ฒ„๊ทธ๋ฅผ ๊ณ ์นœ ๊ฒฝ์šฐ
Style CSS ๋“ฑ ์‚ฌ์šฉ์ž UI ๋””์ž์ธ ๋ณ€๊ฒฝ
Refactor ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
Comment ํ•„์š”ํ•œ ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ
Docs ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
Test ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€, ํ…Œ์ŠคํŠธ ๋ฆฌํŒฉํ† ๋ง(ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ X)
Chore ๋นŒ๋“œ ํ…Œ์ŠคํŠธ ์—…๋ฐ์ดํŠธ, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ(ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ ๋ณ€๊ฒฝ X)
Rename ํŒŒ์ผ ํ˜น์€ ํด๋”๋ช…์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…๋งŒ์ธ ๊ฒฝ์šฐ
Remove ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ

6. ์ฐธ๊ณ  ๋ฌธ์„œ

  • msw ๋ชจํ‚น

Mocking REST API - Getting Started

MSW๋กœ ๋ชจํ‚นํ•˜๊ธฐ

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)

About

๐Ÿ“Š MSW(Mock Service Worker)๋กœ MINI_DASHBOARD ๊ตฌํ˜„

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors