3. MSW

Keyword

  • Service worker

  • MSW(Mock Service Worker)

  • polyfill(폴리필)

1. Service worker

μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ°±κ·ΈλΌμš΄λ“œ 동기화, ν‘Έμ‹œ μ•Œλ¦Ό 등이 κ°€λŠ₯ν•˜λ„λ‘ μ§€μ›ν•΄μ£ΌλŠ” 도ꡬ. μ„œλΉ„μŠ€ μ›Œμ»€λŠ” λΈŒλΌμš°μ €μ˜ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰λ˜λŠ” 슀크립트인데, μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λΈŒλΌμš°μ € μ‚¬μ΄μ—μ„œ 쀑간 계측(ν”„λ‘μ‹œ μ„œλ²„)의 역할을 ν•œλ‹€.

μ„œλΉ„μŠ€ μ›Œμ»€μ˜ μ œμ•½

  1. λΈŒλΌμš°μ €μ˜ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μ‹€ν–‰λ˜λ―€λ‘œ, μš”μ²­μ΄ μ—†λŠ”ν•œ μž‘λ™ν•˜μ§€ μ•ŠλŠ”λ‹€(idle μƒνƒœ). κ°•μ œλ‘œ μ’…λ£Œν•˜λŠ” .terminate() λ©”μ„œλ“œλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

  2. μ›Ήμ˜ life cycle을 λ”°λ₯΄μ§€ μ•ŠλŠ”λ‹€. μ›ΉνŽ˜μ΄μ§€κ°€ λ‹«νžˆλ”λΌλ„ μžλ™μœΌλ‘œ λΉ„ν™œμ„±ν™” λ˜μ§€ μ•ŠλŠ”λ‹€.

  3. μ›Ή νŽ˜μ΄μ§€μ™€ λ³„λ„λ‘œ μ‘΄μž¬ν•˜λ―€λ‘œ DOM, Window μš”μ†Œμ— μ ‘κ·Όν•  수 μ—†λ‹€.

Proxy?

ν”„λ‘μ‹œλŠ” μš”μ²­μ„ μΈν„°μ…‰νŠΈν•΄μ„œ νŠΉμ • λ™μž‘μ„ μˆ˜ν–‰ν›„ λ°˜ν™˜ν•˜λŠ” 역할을 ν•œλ‹€.


2. MSW(Mock Service Worker)

MSWλŠ” 개발 및 ν…ŒμŠ€νŠΈ ν™˜κ²½μ—μ„œ API μš”μ²­μ„ κ°€λ‘œμ±„μ„œ κ°€μ§œ 응닡을 μ œκ³΅ν•˜μ—¬ μ‹€μ œ μ„œλ²„μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ λ„ ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•˜κ±°λ‚˜ κ°œλ°œν•  수 있게 ν•΄μ€€λ‹€. λͺ¨μ˜ μ„œλ²„μ™€ 같은 역할을 ν•œλ‹€.

MSW νŠΉμ§•

  1. μ‹€μ œ μ„œλ²„κ°€ μ€€λΉ„λ˜μ§€ μ•Šμ€ 초기 개발 λ‹¨κ³„μ—μ„œ μž‘μ—…μ„ μ§„ν–‰ν•  수 있음.

  2. κ°€μ§œ 응닡을 μ œκ³΅ν•˜λŠ” λͺ¨μ˜ μ„œλ²„λ₯Ό 생성해, μ„œλ²„μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈν•  수 있음.

jest.config.js

module.exports = {
 //...
  setupFilesAfterEnv: [
    '@testing-library/jest-dom/extend-expect',
    '<rootDir>/src/setupTests.ts', // μΆ”κ°€
  ],
 //...
};

src/setupTests.ts

import 'whatwg-fetch';
import server from './mocks/server';

// ν•Έλ“€λŸ¬κ°€ μ—†κ±°λ‚˜ 응닡이 μ •μ˜λ˜μ§€ μ•Šμ€ μš”μ²­μ΄ λ°œμƒν–ˆμ„ λ•Œ μ—λŸ¬λ₯Ό λ°œμƒ 
beforeAll(() => server.listen({ onUnhandledRequest: 'error' }));

afterAll(() => server.close());

afterEach(() => server.resetHandlers());

src/mocks/server.ts

import { setupServer } from 'msw/node';

import handlers from './handlers';

const server = setupServer(...handlers);

export default server;

src/mocks/handlers.ts

import { rest } from 'msw';

const BASE_URL = 'http://localhost:3000';

const handlers = [
  rest.get(`${BASE_URL}/products`, (req, res, ctx) => {
    const products = [
      {
        category: 'Fruits', price: '$1', stocked: true, name: 'Apple',
      },
    ];

    return res(
      ctx.status(200),
      ctx.json({ products }),
      );
    }),
  ];

export default handlers;

App.test.ts

import { render, screen, waitFor } from '@testing-library/react';

import App from './App';

// λͺ¨λ“ˆμ„ mockingν•˜λŠ” jest.mock λΆˆν•„μš”
test('App', async () => {
  render(<App />);

  await waitFor(() => {
    screen.getByText('Apple');
  });
});

Fetch API polyfill: whatwg-fetch

Fetch APIλŠ” λΈŒλΌμš°μ €μ—μ„œ μ§€μ›ν•˜λŠ” API둜 Nodeμ—μ„œ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ polyfill을 κ΅¬μ„±ν•œλ‹€. μ΅œμ‹  λ²„μ „μ˜ Node.jsμ—μ„œλŠ” Fetch μ‚¬μš© κ°€λŠ₯ν•˜λ‹€κ³  함.


3. polyfill(폴리필)

λ‹¨μ–΄μ˜ 뜻처럼 λΉ μ§„ μ†œμ„ μΆ©μ „ν•΄μ£ΌλŠ” 역할을 ν•œλ‹€. JS의 μ΅œμ‹ λ¬Έλ²•μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ” λŸ°νƒ€μž„(λΈŒλΌμš°μ €, Node.js)에 μ½”λ“œ 쑰각, ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•˜λŠ” μ—­ν• 

Babel이 μžˆλŠ”λ° μ™  Polyfill..?

바벨은 ES6+문법을 ES5둜 트랜슀파일링 ν•˜μ§€λ§Œ, ES5κ°€ μ§€μ›ν•˜μ§€ μ•ŠλŠ” ES6의 Map, Promise, Set, Object.assigin()은 트랜슀파일링이 λΆˆκ°€λŠ₯ν•˜λ‹€. λ•Œλ¬Έμ— Pollyfill을 톡해 μ½”λ“œ 쑰각을 μΆ”κ°€ν•΄μ•Όλ§Œ ν•œλ‹€.μš°λ¦¬κ°€ μ˜μ‹ν•˜μ§€ μ•Šμ•„λ„ CRA(create-react-app)와 같은 CLI둜 ν”„λ‘œμ νŠΈ ν™˜κ²½μ„ κ΅¬μ„±ν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ polyfill κ΄€λ ¨ core-js, regenerator-runtime λͺ¨λ“ˆμ„ μ„ΈνŒ…ν•˜λ―€λ‘œ μžλ™μœΌλ‘œ 폴리필을 κ΅¬μ„±ν•˜κ³  μžˆμ—ˆλ˜ 것.

Last updated