node.js ๊ธฐ๋ฐ ํ๋ ์์ํฌ์ ๋ฆฌ์กํธ๋ฅผ ์ด์ฉํด ์์ ํ์คํ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด ๋ณธ ์ ์ด ์๋ค.
๋น์์๋ API ์๋ฒ๋ฅผ ๋ชจ๋ ๋ง๋ จํด๋๊ณ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๊ณ , ๋ ๋ ํผ์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ์ ์ฒด์ ์ธ ๊ณผ์ ์์ ๋งํ์ ์ ํ ์์๋ค.
์ผ๋ฐ์ ์ธ ํ๋ก์ ํธ ๋ํ ๊ทธ๋ ๊ฒ ์งํ๋ ์ง๋ ๋ฏธ์ง์๋ค.
MSW(Mock Service Worker)๋ฅผ ์ค๋ช ํ๊ธฐ์ ์์ Service Worker์ ๋ํ ๊ฐ๋ ์ ์์์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ Service Worker๋ Web Worker์ ํ ์ข ๋ฅ์ด๊ธฐ ๋๋ฌธ์ Web Worker ๋ํ ๊ฐ๋จํ๊ฒ ๋งํด๋ณด๊ฒ ๋ค.
์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ถ๋ถ์ ์คํฌ๋ฆฝํธ ์ฐ์ฐ์ ๋ด๋นํ๋ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์กด์ฌํ๋ค. ํ์ง๋ง ์น ์์ปค๋ ๊ทธ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ๋ฒ์ด๋ ๋ฐฑ ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํฌ๋ฆฝํธ ์ฐ์ฐ์ ์คํํ ์ ์๋ ๊ธฐ์ ์ด๋ค.
๋ค๋ฅธ ์ค๋ ๋์์ ์ฐ์ฐํ๋ ๋งํผ ๋น์ฐํ ์ ์ฝ์ด ์กด์ฌํ๋ค. ๋ํ์ ์ผ๋ก DOM ์กฐ์ ๋ถ๊ฐ, ๋ฉ์ธ ์ค๋ ๋์ postMessage ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ํต์ ๋ฐฉ์์ด ์๋ค.
์น ์์ปค๋ฅผ ์ด์ฉํ๋ฉด ๋ฌด๊ฑฐ์ด ์ฐ์ฐ์ ๋ฐฑ ๊ทธ๋ผ์ด๋ ์ค๋ ๋์์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ ์ค๋ ๋์ ๋ถํ๋ฅผ ์ค์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์์ธํ ์ฌ์ฉ ๋ฐฉ๋ฒ์ Web Worker mdn ๋ฌธ์์ ๋์์๋ค.
์๋น์ค ์์ปค๋ ์น ์์ปค์ ํ ์ข ๋ฅ๋ค. ์๋น์ค ์์ปค๋ ์น ํ์ด์ง์ ๋ณ๊ฐ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ค์ํ ์์ ์ ํ ์ ์๋ค.
๋๋ต์ ์ธ ์๋์ install - activate - idle ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ๋ก์ฑ ์บ์ฑํ๊ฑฐ๋, ๋ฐฑ ๊ทธ๋ผ์ด๋ ๋๊ธฐํ, ํธ์ ์๋ฆผ ๋ฑ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ค.
๋คํธ์ํฌ ์์ฒญ์ ๋ค๋ฃจ๋ ๋งํผ ์ ์ฝ์ด ์กด์ฌํ๋ฉฐ, localhost๊ฐ ์๋ ๋ฐฐํฌ๋ฅผ ํตํด ์๋น์ค ์์ปค๋ฅผ ์ ๊ณตํ ๊ฒฝ์ฐ HTTPS ์ค์ ์ ํด์ผํ๋ค.
๋ฐฑ์๋์์ ๋ชจ๋ API์ ๋ก์ง๋ค์ ๋ง๋ จํ๊ณ ๋์์ธ ๋ํ ํ์ ๋ ์ํฉ์์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์งํํ๋ ๊ฒ ํ์คํ ์ด์์ ์ด๋ค.
๋ณ๋์ฑ์ด ์ ์ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ํ๋ํ๋ ๊ธฐ๋ฅ์ด ํ์ ๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ํ์ค์ ๊ทธ๋ด ๊ฐ๋ฅ์ฑ์ด ๋ฎ๋ค. ์๊ฐ์ ์ ํ์ ์ด๊ณ ๊ตฌํํด์ผ ํ ๊ธฐ๋ฅ์ ๋ง๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๋ฐฑ์๋ API์ ๊ตฌํ์ด ๋๋ ๋๊น์ง ์ ๋๊ณ ๊ธฐ๋ค๋ฆด ์๋ง์ ์๋ค.
ํ๋ก ํธ์๋์ ๊ธฐ๋ฅ ์ค API์ ๋ํ ์์กด๋๊ฐ ๋์ ๋, ๊ทธ๋ฆฌ๊ณ ๊ทธ API์ ๋ํ ๊ตฌํ์ด ์๋ฃ๋์ง ์์์ ๋ MSW๋ ๊ทธ ํ์ ๋ฐํํ ์ ์๋ค.
MSW๋ ๋ณ๋ ฌ์ ์ธ ๊ฐ๋ฐ์ ํจ์จ์ ์ผ๋ก ์งํํ ์ ์๊ฒ ๋์์ฃผ๋ ์ ์ฉํ ๋๊ตฌ๋ค.
์์์ ์๋น์ค ์์ปค์ ๋ํด ๊ธฐ์ ํ๋ฏ์ด MSW๋ ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ๋ก์ฑ ๊ฐ๋ฐ์๊ฐ ์ค์ ํ ์์์ ์๋ต ์๋๋ฆฌ์ค๋ฅผ ๋ง๋ค ์ ์๋ค.
yarn add msw --dev
์์ ์ ํจํค์ง ๋งค๋์ ์ ๋ง๊ฒ msw ํจํค์ง๋ฅผ ์ธ์คํจํ๋ค. --dev ์ต์ ์ package.json์ devDependencies์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ์ต์ ์ผ๋ก ๊ฐ๋ฐ์๋ ํ์ํ์ง๋ง ์ค์ง์ ์ธ ์๋์ ํ์ํ์ง ์์ ํจํค์ง๋ค์ ๋ฃ๋๋ค.
import { rest } from "msw";
export const handler = [
rest.get("/contents", (req, res, ctx) => {
return res(ctx.status(200), ctx.json(mockPosts));
}),
rest.post("/login", (req, res, ctx) => {
return res(ctx.status(200), ctx.json(req.body));
}),
rest.post("/register", (req, res, ctx) => {
return res(ctx.status(200), ctx.json(req.body));
}),
];
MSW ๋ํ ์๋น์ค ์์ปค์ด๊ธฐ ๋๋ฌธ์ ๋ฑ๋ก ๊ณผ์ ์ ๊ฑฐ์ณ์ผํ๋ค.
npx msw init <PUBLIC_DIR> --save
๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ CLI ๋ช ๋ น์ ์ ๊ณตํ๋ฉฐ CRA๋ก ์์ฑํ ํ๋ก์ ํธ์ผ ๊ฒฝ์ฐ <PUBLIC_DIR>์ /public์ ๋ฃ๋๋ค.
// browser.js
import { setupWorker } from "msw";
import { handler } from "./handler";
export const worker = setupWorker(...handler);
// index.js
import { worker } from "./mocks/browser";
worker.start();
๋ ธ๋์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ worker๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ์กฐ๊ธ ์ฐจ์ด๊ฐ ์๋ค. MSW DOCS์์ ํ์ธํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด ์ค์ ๋์ง ์์ ์์ฒญ์ด ์๋ค๋ฉด ๊ฒฝ๊ณ ๋ฅผ ๋ ๋ฆฌ๊ณ ์ฑ๊ณตํ ์์ฒญ์ด ์๋ค๋ฉด ๊ทธ์ ๊ดํ ๋ด์ญ์ ๋ณด์ฌ์ค๋ค.
์น ์์ปค๋ ์๋น์ค ์์ปค์ ๋ํ ๊ฐ๋ ์ ์ฒ์ ์์๋ค. MSW๋ ๊ฐ๋จํ ๋์ ๋ฐ์ ์ฒดํํด๋ณด์ง ์์๊ธฐ ๋๋ฌธ์ ์ ํํ ์๋ ์๋ฆฌ๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค.
๊ทธ๋๋ ์ ์ฉํ ๋๊ตฌ์ธ MSW์ ๋ํด ์๊ฒ ๋์ผ๋ ์ถํ ๊ฐ์ธ ํ๋ก์ ํธ๋ ์คํ์ ์จ๋ณด๋ฉฐ ์๋ จ๋๋ฅผ ๋์ฌ์ผ๊ฒ ๋ค.