[DevCamp] ๐Ÿš€ React ๊ฐœ๋ฐœ์—์„œ ๋ชจํ‚น ์„œ๋ฒ„ ์‚ฌ์šฉํ•˜๊ธฐ

๋™๊ฑดยท2025๋…„ 4์›” 28์ผ
0

DevCamp

๋ชฉ๋ก ๋ณด๊ธฐ
56/85

๐Ÿš€ React ๊ฐœ๋ฐœ์—์„œ ๋ชจํ‚น ์„œ๋ฒ„ ์‚ฌ์šฉํ•˜๊ธฐ

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ์‹ค์ œ ๋ฐฑ์—”๋“œ API๊ฐ€ ์™„์„ฑ๋˜๊ธฐ ์ „์— ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜,
๋‹ค์–‘ํ•œ ์„œ๋ฒ„ ์‘๋‹ต์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ๋ชจํ‚น ์„œ๋ฒ„๋‹ค.

๋ชจํ‚น ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜๋ฉด ์‹ค์ œ API๊ฐ€ ์—†์–ด๋„ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ๊ณ„์† ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿง ๋ชจํ‚น ์„œ๋ฒ„๋ž€ ๋ฌด์—‡์ธ๊ฐ€

๋ชจํ‚น(Mock)์€ 'ํ‰๋‚ด ๋‚ด๋‹ค'๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

๋ชจํ‚น ์„œ๋ฒ„๋Š” ์‹ค์ œ ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•ด์•ผ ํ•˜๋Š” API๋ฅผ ์ž„์‹œ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ,
๊ฐœ๋ฐœ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๊ฐ€์งœ ์‘๋‹ต์„ ๋Œ๋ ค์ฃผ๋Š” ์„œ๋ฒ„๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ด ๋๋‚˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ์šฉ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ชจํ‚น ์„œ๋ฒ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•˜๋‹ค.

  • ๋ฐฑ์—”๋“œ๊ฐ€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
  • ์—๋Ÿฌ ์‘๋‹ต, ์˜ˆ์™ธ ์ƒํ™ฉ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
  • ํŠน์ • ์กฐ๊ฑด ํ•˜์—์„œ ์„œ๋ฒ„ ์‘๋‹ต์„ ์กฐ์ž‘ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ
  • ์™ธ๋ถ€ API์— ๊ณผ๋„ํ•˜๊ฒŒ ์˜์กดํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ฒฝ์šฐ

โš™๏ธ React์—์„œ ๋ชจํ‚น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

React ํ”„๋กœ์ ํŠธ์—์„œ ๋ชจํ‚น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

  • MSW(Mock Service Worker)
  • json-server
  • Mirage JS

๊ฐ๊ฐ ์žฅ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, ์ตœ๊ทผ์—๋Š” MSW๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ๋‹ค.

MSW๋Š” Service Worker๋ฅผ ์ด์šฉํ•ด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ธฐ ๋•Œ๋ฌธ์—,
์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ๊ณผ ๊ฐ€์žฅ ์œ ์‚ฌํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ง MSW ์„ค์น˜ ๋ฐ ์„ค์ • ๋ฐฉ๋ฒ•

  1. ์„ค์น˜ํ•˜๊ธฐ

    npm install msw --save-dev
  2. ํ•ธ๋“ค๋Ÿฌ ์ž‘์„ฑํ•˜๊ธฐ

    // src/mocks/handlers.js
    import { rest } from 'msw'
    
    export const handlers = [
      rest.get('/api/user', (req, res, ctx) => {
        return res(
          ctx.status(200),
          ctx.json({
            id: 1,
            username: 'mock_user',
          })
        )
      }),
    ]
  3. Service Worker ์„ค์ •ํ•˜๊ธฐ

    // src/mocks/browser.js
    import { setupWorker } from 'msw'
    import { handlers } from './handlers'
    
    export const worker = setupWorker(...handlers)
  4. ์•ฑ์—์„œ ์›Œ์ปค ์‹คํ–‰ํ•˜๊ธฐ

    // src/index.js
    import React from 'react'
    import ReactDOM from 'react-dom'
    import App from './App'
    
    if (process.env.NODE_ENV === 'development') {
      const { worker } = require('./mocks/browser')
      worker.start()
    }
    
    ReactDOM.render(<App />, document.getElementById('root'))

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ๋ชจํ‚น ์„œ๋ฒ„๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก NODE_ENV ์กฐ๊ฑด์„ ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๐Ÿ› ๏ธ json-server ๊ฐ„๋‹จ ์‚ฌ์šฉ๋ฒ•

json-server๋Š” ๋กœ์ปฌ์—์„œ ๋น ๋ฅด๊ฒŒ REST API ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ํˆด์ด๋‹ค.

  1. ์„ค์น˜ํ•˜๊ธฐ

    npm install -g json-server
  2. db.json ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

    {
      "users": [
        { "id": 1, "name": "John" },
        { "id": 2, "name": "Jane" }
      ]
    }
  3. ์„œ๋ฒ„ ์‹คํ–‰ํ•˜๊ธฐ

    json-server --watch db.json --port 4000

์ด์ œ http://localhost:4000/users๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

json-server๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด๋‚˜ ๋‹ค์–‘ํ•œ ์—๋Ÿฌ ์ผ€์ด์Šค๋ฅผ ๋‹ค๋ฃจ๊ธฐ์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.


โš ๏ธ ๋ชจํ‚น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 

  • ์‹ค์ œ API ์ŠคํŽ™๊ณผ ํ•ญ์ƒ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.
    ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ๋ฐฑ์—”๋“œ API ์ŠคํŽ™์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ชจํ‚น ์„œ๋ฒ„๋„ ๊พธ์ค€ํžˆ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค.

  • ๋ชจํ‚น ๋ฐ์ดํ„ฐ์™€ ์‹ค์ œ ๋ฐ์ดํ„ฐ ๊ฐ„ ์ฐจ์ด์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
    ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ ์ƒํ™ฉ๋“ค์„ ๋ฏธ๋ฆฌ ๋ชจํ‚น ๋ฐ์ดํ„ฐ๋กœ ์ค€๋น„ํ•ด๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ๋ฐฐํฌ ์‹œ ๋ชจํ‚น ์„œ๋ฒ„๊ฐ€ ๋„๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
    ๋ชจํ‚น ์„œ๋ฒ„๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋น„ํ™œ์„ฑํ™”๋˜์–ด์•ผ ํ•œ๋‹ค.


๐Ÿ”จ TIL

  • ๋ชจํ‚น ์„œ๋ฒ„๋Š” ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค.
  • MSW๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ์‹ค์ œ์ฒ˜๋Ÿผ ํ‰๋‚ด ๋‚ด์„œ ํ…Œ์ŠคํŠธ ์‹ ๋ขฐ๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ชจํ‚น ์„œ๋ฒ„์™€ ์‹ค์ œ ์„œ๋ฒ„ ์ŠคํŽ™์˜ ๋™๊ธฐํ™”๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.
  • ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์€ ๋†’์ง€๋งŒ, ํ•ญ์ƒ ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ํ™˜๊ฒฝ์„ ์—ผ๋‘์— ๋‘๊ณ  ๊ฐœ๋ฐœํ•ด์•ผ ํ•œ๋‹ค.
profile
๋ฐฐ๊ณ ํ”ˆ ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€