MSW(Mock Service Worker) 적용기 πŸ˜€

:D Β·2023λ…„ 3μ›” 11일
0

μ™œ μ‚¬μš©ν•˜κ²Œ λ˜μ—ˆλ‚˜?

ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ ν•˜λ©΄μ„œ κ΅¬ν˜„μ΄μ™Έμ— λΆˆνŽΈν–ˆλ˜ 점듀은 λ°±μ—”λ“œ 개발이 λλ‚˜μ•Ό ν”„λ‘ νŠΈμ—”λ“œ κ°œλ°œμ„ ν•  수 μžˆλ‹€λŠ” μ μ΄μ—ˆλ‹€. 그리고 ν”„λ‘ νŠΈμ—”λ“œλŠ” λ‚˜ ν˜Όμžμ˜€κ³ , 3λͺ…에 λ°±μ—”λ“œ κ°œλ°œμžλ“€κ³Ό ν•¨κ»˜ ν•˜μ—¬μ„œ ν•œ λ²ˆμ— APIκ°€ 많이 μ—…λ°μ΄νŠΈ 되면 그만큼 λͺ°μ•„μ„œ ν•΄μ•Όν–ˆλ‹€.
λ˜ν•œ λ‘œλ”©, μ—λŸ¬λ“± λ‹€μ–‘ν•œ 응닡에 λŒ€ν•œ 처리λ₯Ό ν•  λ•Œ λ‚΄κ°€ 직접 각각의 ν•΄λ‹Ήν•˜λŠ” 상황을 λ§Œλ“€μ–΄μ•Όν•œλ‹€λŠ” μ μ—μ„œ 어렀움이 μžˆμ—ˆλ‹€.
μ΄λŸ¬ν•œ λ¬Έμ œλ“€μ„ ν•΄κ²°ν•˜κ³  ν”„λ‘ νŠΈμ—”λ“œ 개발의 생산성을 높이기 μœ„ν•΄κ³ λ―Όν•˜λ˜ 도쀑, Mocking λŒ€ν•΄ μ•Œκ²Œλ˜μ—ˆλ‹€.
Mockingμ΄λž€ μ‹€μ œ APIμ—μ„œ λ°›μ•„μ˜¨ 값을 μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ κ°€μ§œ 값을 μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜κ²Œ ν•΄μ£ΌλŠ” 것이닀.
MockingλŠ” μ•žμ— λ‚΄κ°€ λ§ν•œ μƒν™©λΏλ§Œ μ•„λ‹ˆλΌ APIλ₯Ό ν˜ΈμΆœν•  λ•Œ λΉ„μš©μ΄ λ°œμƒν•˜λŠ” κ²½μš°μ—λ„ μœ μš©ν•˜λ‹€.

Mocking λ°©λ²•μ—λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆλ‹€. 화면에 ν•„μš”ν•œ λ°μ΄ν„°μ˜ μƒνƒœλ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ‚΄λΆ€ λ‘œμ§μ— 직접 Mockingμ—μ„œ ν•˜λŠ” 방법은 κ΅¬ν˜„μ΄ μ‰¬μ›Œ λΉ λ₯΄κ²Œ μ μš©ν•  수 μžˆμ§€λ§Œ HTTP λ©”μ„œλ“œμ™€ λ„€νŠΈμ›Œν¬ 응닡 μƒνƒœμ— 따라 λŒ€μ‘ν•˜κΈ°κ°€ μ‰½μ§€μ•Šκ³ , Mock μ„œλ²„λ₯Ό 직접 λ§Œλ“œλŠ” 방법은 κ³΅μˆ˜κ°€ 또 λ“ λ‹€λŠ” 점이 μžˆλ‹€.
λ˜ν•œ μ•žμ— λ§ν•œ 방법듀은 λ‘œλ”©, μ—λŸ¬λ“± λ‹€μ–‘ν•œ 응닡에 λŒ€ν•œ 처리λ₯Ό ν•  λ•Œ μž„μ΄μ˜ μƒνƒœλ₯Ό λ§Œλ“€μ–΄ λ³΄λ©΄μ„œ κ°œλ°œν•˜κ±°λ‚˜ λ””λ²„κΉ…ν•˜λŠ”λ° 어렀움이 μžˆλ‹€.

μ΄λŸ¬ν•œ μ•žμ— 문제λ₯Ό ν•΄κ²°ν•΄ 쀄 수 있고, μ‹€μ œ APIλ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ Mockingν•  수 μžˆλŠ” 라이브러리둜 MSWκ°€ μžˆλ‹€. MSWλ₯Ό μ‚¬μš©ν•΄λ³΄λ €κ³  ν•œλ‹€.

MSW

MSW λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ„€νŠΈμ›Œν¬ μˆ˜μ€€μ—μ„œ μš”μ²­μ„ κ°€λ‘œμ±„μ„œ λͺ¨μ˜ 응닡을 λ³΄λ‚΄μ£ΌλŠ” 역할을 ν•œλ‹€. λ”°λΌμ„œ Mock μ„œλ²„λ₯Ό 직접 κ΅¬μΆ•ν•˜μ§€ μ•Šμ•„λ„ APIλ₯Ό λ„€νŠΈμ›Œν¬ μˆ˜μ€€μ—μ„œ Mocking ν•  수 μžˆλ‹€.

Request flowλ₯Ό 보면,


λΈŒλΌμš°μ €μ—μ„œ μ „μ†‘ν•˜λŠ” Requestλ₯Ό Service Workerκ°€ κ°€λ‘œμ±„μ–΄ μš”μ²­μ„ λ³΅μ‚¬ν•˜μ—¬ MSWμ—κ²Œ ν•΄λ‹Ή μš”μ²­κ³Ό μΌμΉ˜ν•˜λŠ” Mocked Response을 μ œκ³΅λ°›κ³  이λ₯Ό λΈŒλΌμš°μ €μ—κ²Œ μ „λ‹¬ν•˜κ²Œ λœλ‹€.

μ μš©ν•΄λ³΄κΈ°

- νŒ¨ν‚€μ§€ μ„€μΉ˜

npm install msw --save-dev
# or
yarn add msw --dev

- 디렉토리 생성

mkdir 생성할 폴더 이름

λ‚œ mkdir src/mocks둜 ν•΄μ£Όμ—ˆλ‹€.

Mock Service WorkerλŠ” 이λ₯Ό μ§€μ›ν•˜λŠ” μ „μš© CLIλ₯Ό μ œκ³΅ν•œλ‹€.
- mockServiceWorker 생성

npx msw init <PUBLIC_DIR> --save

λ₯Ό μž…λ ₯ν•˜λ©΄ mockServiceWorker.jsκ°€ μƒμ„±λœλ‹€.
CRA둜 ν”„λ‘œμ νŠΈλ₯Ό μƒμ„±ν•œ 경우

npx msw init public/ --save

ν•˜λ©΄ 됨.

- src/mocks/handlers.js 파일 생성

각자 μ›ν•˜λŠ” λ„€νŠΈμ›Œν¬ μš”μ²­μ— λŒ€ν•΄ λͺ¨μ˜ API μƒμ„±ν•˜λ©΄λœλ‹€.
λ‚œ questions을 κ°€μ Έμ˜€λŠ” λͺ¨μ˜ API에 λŒ€ν•΄ μƒμ„±ν–ˆλ‹€.

import { PAGINATION_SIZE } from '@/constants/paginationSize';
import { rest } from 'msw';

export const handlers = [
  rest.get(`${process.env.NEXT_PUBLIC_API_PREFIX}/questions?page=0&size=${PAGINATION_SIZE.MAIN_QUESTION}&type='total'`, (req, res, ctx) => {
    return res(
      ctx.status(200), // 응닡 μƒνƒœ
      ctx.delay(0), // 응닡 μ‹œκ°„
      ctx.json({ // 응닡 κ²°κ³Ό
        data: {
          questions: [
            { questionId: 1, title: 'title1', content: 'content1' },
            { questionId: 2, title: 'title2', content: 'content2' },
            { questionId: 3, title: 'title3', content: 'content3' },
          ],
        }
      })
    );
  }),
];

- src/mocks/browser.js 파일 생성
λͺ¨μ˜ 응닡을 μœ„ν•œ ν•Έλ“€λŸ¬λ₯Ό MSWμ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ import ν•œλ‹€.

import { setupWorker } from 'msw'
import { handlers } from './handlers'

export const worker = setupWorker(...handlers)

- λ§ˆμ§€λ§‰ start worker
κ°œλ°œν™˜κ²½μ—μ„œλ§Œ MSWλ₯Ό μ‹€ν–‰μ‹œν‚¬μˆ˜ μžˆλ„λ‘ μ½”λ“œλ₯Ό μΆ”κ°€ν•œλ‹€.

if (process.env.NODE_ENV === 'development') {
  const { worker } = require('./mocks/browser')
  worker.start()
}

μœ„μ˜ μ‚¬μ§„μ²˜λŸΌ μ½˜μ†”μ— Mock Service Worker의 [MSW] Mocking enabled λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ˜μ–΄μ•Ό ν•œλ‹€.

성곡!

μ‚¬μš©ν›„κΈ°

μ‚¬μš©λ°©λ²•λ„ κ°„λ‹¨ν•˜κ³ , κ³΅μ‹λ¬Έμ„œμ—λ„ 잘 λ‚˜μ™€μžˆμ–΄ μ μš©ν•˜κΈ°μ—λŠ” 큰 어렀움은 μ—†μ—ˆλ‹€.
λ˜ν•œ κ°€μž₯ 쒋은 점은 β­οΈλ‚˜λ„ λ°±μ—”λ“œ κ°œλ°œμžμ—κ²Œ μž¬μ΄‰ν•˜μ§€ μ•Šκ³ , μ˜μ‘΄μ μ΄μ§€ μ•Šκ³  μ£Όλ„μ μœΌλ‘œ κ°œλ°œν•  수 μžˆμ–΄ λ„ˆλ¬΄ μ’‹μ•˜λ‹€.⭐️ (은근 μŠ€νŠΈλ ˆμŠ€μ˜€λ‹€.)
API λ¬Έμ„œκ°€ λ‚˜μ˜€λ©΄ λ°±μ—”λ“œ 개발자λ₯Ό 기닀리지 μ•Šκ³ λ„ λ‚˜λ„ ν”„λ‘ νŠΈ κ°œλ°œμ„ ν•˜κ³ , λ‚˜μ€‘μ— μΆ”κ°€ μž‘μ—…λ§Œ ν•˜λ©΄ λ˜λ‹ˆ 개발 전체 μ†Œμš” μ‹œκ°„λ„ 쀄어듀 것 κ°™κ³ , λ˜ν•œ λ‹€μ–‘ν•œ 상황을 κ³ λ €ν•΄μ„œ 보닀 μ‰½κ²Œ κ°œλ°œν•  μˆ˜λ„ μžˆμ—ˆκ³ , ν”„λ‘ νŠΈ 개발 자체의 μ‹œκ°„λ„ 쀄어듦을 κ²½ν—˜ν–ˆλ‹€. λͺ¨λ‘μ—κ²Œ μΆ”μ²œν•΄μ£Όκ³  μ‹Άκ³ , μ™œ μ§€κΈˆμ—μ„œμ•Ό ν–ˆλŠ”μ§€ ... 아쉽닀!

References


profile
κ°•μ§€μ˜μž…λ‹ˆ...🐿️

0개의 λŒ“κΈ€