3.MSW

Service worker

์„œ๋น„์Šค ์›Œ์ปค๋Š” ์ฃผ๋กœ ์˜คํ”„๋ผ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๋‹ค์Œ์€ ์„œ๋น„์Šค ์›Œ์ปค์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€์ด๋‹ค.

  1. ๋ฆฌ์†Œ์Šค ์บ์‹ฑ: ์„œ๋น„์Šค ์›Œ์ปค๋Š” HTML, CSS, JavaScript, ์ด๋ฏธ์ง€ ๋“ฑ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์บ์‹ฑํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์˜คํ”„๋ผ์ธ ์ƒํƒœ์ด๊ฑฐ๋‚˜ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ๋Š๋ฆฐ ๊ฒฝ์šฐ์—๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ์‘๋‹ต: ์„œ๋น„์Šค ์›Œ์ปค๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ์บ์‹œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋™๊ธฐํ™”: ์„œ๋น„์Šค ์›Œ์ปค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ณด๋‚ธ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ์˜จ๋ผ์ธ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด ๋‹ค์‹œ ์ „์†กํ•˜์—ฌ ์•ˆ์ •์„ฑ์„ ๋†’์ด๊ณ  ์›ํ™œํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ํ‘ธ์‹œ ์•Œ๋ฆผ: ์„œ๋น„์Šค ์ž‘์—…์ž๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ˜„์žฌ ์—ด๋ ค ์žˆ์ง€ ์•Š๋”๋ผ๋„ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ์ˆ˜์‹ ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

  5. ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ด€๋ฆฌ: ์„œ๋น„์Šค ์ž‘์—…์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์— ๋Œ€ํ•œ ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ์•ก์„ธ์Šค๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „๋ฐ˜์ ์œผ๋กœ ์„œ๋น„์Šค ์›Œ์ปค๋Š” ํŠนํžˆ ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์ œํ•œ์ ์ด๊ฑฐ๋‚˜ ๋ถˆ์•ˆ์ •ํ•œ ์ƒํ™ฉ์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด๋‹ค.

MSW(Mock Service Worker)

๋ชจ์˜ ์„œ๋น„์Šค ์ž‘์—…์ž(MSW - Mock Service Worker)๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ์ค‘์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ HTTP ์š”์ฒญ์„ ๋ชจ์˜ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” MSW๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ณธ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ๋ชจ์˜ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

MSW๋Š” ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ํ•˜๋Š” ๋Œ€์‹  ๋ฐœ์‹  ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„ ๋ฏธ๋ฆฌ ์ •์˜๋œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ์˜ ์„œ๋น„์Šค ์›Œ์ปค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŠน์ • ์š”์ฒญ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ์‘๋‹ต์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ API์— ์˜์กดํ•˜์ง€ ์•Š๊ณ ๋„ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์—ฃ์ง€ ์ผ€์ด์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

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

import { rest } from 'msw'
import { setupServer } from 'msw/node'
import { fetchData } from './api'

// Define mock response for the API endpoint
const server = setupServer(
  rest.get('/api/data', (req, res, ctx) => {
    return res(
      ctx.status(200),
      ctx.json({ data: 'mock data' })
    )
  })
)

// Start the mock server before running tests
beforeAll(() => server.listen())

// Stop the mock server after running tests
afterAll(() => server.close())

describe('fetchData', () => {
  it('fetches data from the API', async () => {
    const data = await fetchData()
    expect(data).toEqual({ data: 'mock data' })
  })
})

์ด ์˜ˆ์ œ์—์„œ๋Š” MSW๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ fetchData ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” API ์—”๋“œํฌ์ธํŠธ์˜ ์‘๋‹ต์„ ๋ชจํ‚นํ•œ๋‹ค. ์ƒํƒœ ์ฝ”๋“œ 200๊ณผ ์ผ๋ถ€ ๋ชจ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ JSON ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” /api/data ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ๋ชจ์˜ ์‘๋‹ต์„ ์ •์˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ชจ์˜ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋‚˜์ค‘์— ์ค‘์ง€ํ•œ๋‹ค.

fetchData ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด MSW๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ณด๋‚ธ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„์„œ ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋Œ€์‹  ๋ฏธ๋ฆฌ ์ •์˜ํ•œ ๋ชจ์˜ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ์˜ ์„œ๋ฒ„๊ฐ€ ๋ฐ˜ํ™˜ํ•œ ๋ชจ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•จ์ˆ˜์˜ ๋™์ž‘์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

MSW๋Š” ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ์—์„œ HTTP ์š”์ฒญ์„ ๋ชจ์˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ API๋กœ ์ž‘์—…ํ•  ๋•Œ ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

5์ฃผ์ฐจ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ฒ˜์Œ ์‚ฌ์šฉํ•ด ๋ณด์•˜๋Š”๋ฐ api์š”์ฒญ mockingํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์—„์ฒญ๋‚œ ์ ˆ๊ฐํšจ๊ณผ๋ฅผ ๋ณด์˜€๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

polyfill(ํด๋ฆฌํ•„)

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

์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด๋‚˜ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด HTML ์š”์†Œ, CSS ๊ธฐ๋Šฅ ๋˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ API ๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค์™€ ๊ฐ™์€ JavaScript API์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ˆ„๋ฝ๋œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

ํด๋ฆฌํ•„์€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ํŠน์ • ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋น„ํ‘œ์ค€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ JavaScript์— ๊ธฐ๋Šฅ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜์žˆ๋Š” ํ‘œ์ค€ ์ค€์ˆ˜ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ์˜ค๋Š˜๋‚  ๋งค์šฐ ๋“œ๋ฌผ์ง€๋งŒ ๊ฐ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ Javascript๋ฅผ ๋งค์šฐ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ ํ•œ IE6, Netscape ๋ฐ NNav ์‹œ๋Œ€์— ํŠนํžˆ ๋„๋ฆฌ ํผ์กŒ๋‹ค. JQuery์˜ ์ฒซ๋ฒˆ์งธ ๋ฒ„์ „์ด ํด๋ฆฌํ•„์˜ ์ดˆ๊ธฐ ์˜ˆ์ด๋‹ค. ๋‹น์‹œ ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์ž๋Š” ์›น ์‚ฌ์ดํŠธ๊ฐ€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋˜์–ด์•ผํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ ธ์•ผํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ฐ„ ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ๋ชจ๋“  ์žฅ์น˜์—์„œ ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ž‘๋™ ์‹œํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ๋”ฐ๋ผ์„œ JavaScript ๊ฐœ๋ฐœ์ž๋Š” ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฑฐ์˜ ์ผ๊ด€๋˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์•„์ฃผ ์ž‘์€ ์†Œ์ˆ˜์˜ JavaScript API์—๋งŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋Œ€๋ถ€๋ถ„ ํ‘œ์ค€ ์‹œ๋งจํ‹ฑ์— ๋”ฐ๋ผ ๊ด‘๋ฒ”์œ„ํ•œ API ์„ธํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋ณ„ ๊ตฌํ˜„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋Š˜๋‚  ์‹ค์ œ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋‹ค.

Reference

Last updated