MSW ์ฌ์ฉ๋ฒ ์ ๋ฆฌ ๋ฐ ํ๊ธฐ
ํ์ฌ์์ ์ด์ํ๋ ์คํก ์๋น์ค์์ ์ ์ ์ ํ์ ๊ฒฝํ์ ํฅ์์ํค๊ธฐ ์ํด ์๋ผ์คํฑ ์์น๋ฅผ ๋์ ํ๊ฒ ๋๋๋ฐ, api ๊ฐ๋ฐ ์๋ฃ ์ ๋ฏธ๋ฆฌ MSW๋ฅผ ํ์ฉํ์ฌ ๋ชฉ์๋ฒ๋ฅผ ๋ง๋ค์ด ์์ ํด๋ณด๊ธฐ๋ก ํ๋ค.
Mock Service Worker(MSW)๋ ๋ธ๋ผ์ฐ์ ์ Node.js๋ฅผ ์ํ API ๋ชจํน ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
์ค์ ๋ฐฉ๋ฒ
์ฐ์ msw๋ฅผ ์ฌ์ฉํ ํ๊ฒฝ์ธํ ๊ณผ msw ํจํค์ง๋ฅผ ์ค์นํ๋ค. ๋๋ Vite๋ฅผ ์ฌ์ฉํด ํ๊ฒฝ์ ์ธํ ํ๋ค.
pnpm create vite
npm install msw@latest --save-dev
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
์๋ฒ์ฌ์ด๋์์ ๋์ํ๋ node์ ํด๋ผ์ด์ธํธ์์ ๋์ํ๋ browser ์ค์ ์ด ์๋ค.
์ฐ์ ์๋น์ค์์ปค๋ฅผ ์์ฑํด์ผ ํ๋ค. ์ฌ๊ธฐ๋ฅผ ๋ณด๋ฉด ์์ปค์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ฃผ๋ cli๊ฐ ์์ด์ ๋๋ ๊ทธ๊ฑธ ์ฌ์ฉํด ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค.
npx msw init <PUBLIC_DIR> --save
์ด ๊ฒฝ์ฐ npx msw init ./public --save
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
๋ช ๋ น๋ฌธ์ ์คํํ๋ฉด public ํด๋์ mockServiceWorker.js๊ฐ ์๊ธด๋ค.
์ดํ ์ฌ์ฉ๋ฒ์ ๋ง๊ฒ /src/mocks ์ browser.ts
, handler.ts
, node.ts
๋ฅผ ์์ฑํ๋ค.
/**
* main.tsx์ ์์ฑ๋ ์คํฌ๋ฆฝํธ ํ์ผ
* index.html์ ์คํฌ๋ฆฝํธ๋ก ๋ ๋๋๋ค.
* <script type="module" src="/src/main.tsx"></script>
*/
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App.tsx";
import "./index.css";
async function enableMocking() {
if (process.env.NODE_ENV !== "development") {
return;
}
const { worker } = await import("./mocks/browser");
// `worker.start()` returns a Promise that resolves
// once the Service Worker is up and ready to intercept requests.
return worker.start();
}
enableMocking().then(() => {
createRoot(document.getElementById("root")!).render(
<StrictMode>
<App />
</StrictMode>,
);
});
์๋ฒ์์์ ๋์๋ ๊ณ ๋ คํด์ผ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด mock ์๋น์ค์์ปค/์๋ฒ๋ฅผ ์ด๊ธฐํ ํ ์ ์๋ค.
// mocks/index.ts
async function initMocks() {
if (typeof window === 'undefined') {
const { server } = await import('./server');
server.listen();
} else {
const { worker } = await import('./browser');
worker.start();
}
}
initMocks();
export {};
์ ๋ฐฉ์์ผ๋ก ๋ชจ๋์ ๋ง๋ค๊ณ dev/prod์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ์คํํด์ฃผ๋ฉด ๋๋ค. ์ฝ์์ ํ์ธํ๋ฉด
ํ๊ธฐ
์ด๊ธฐ์๋ express ํน์ next.js ์ฒ๋ผ ์๋ฒ๋ฅผ ๊ตฌํํ๊ณ ์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฑฐ๋ผ๊ณ ์๊ฐํด์ ๊ด๋ จ ์๋ฃ๋ฅผ ๋ง์ด ์์นญํด๋ดค๋ค. ๊ทธ๋ฌ๋ MSW๋ ์ ์ด์ ํด๋ผ์ด์ธํธ์์ ๋์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๊ณ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก next.js ํ๋ ์์ํฌ์ ๊ฒฐํฉํ์ ๊ตฌํ์ ๊ฐ๋ฅํ์ง๋ง ๊ทธ๋ ๊ฒ ๊ตฌํํ ์ด์ ๊ฐ ์์๋ค.
๋๋ถ๋ถ์ ํ๋ก์ ํธ์์๋ ํ๋์ ํ๋ก์ ํธ ๋ด์์ mock์๋ฒ๋ฅผ ๊ตฌํํ๋ ๊ฒ ๊ฐ์๋ค.
๋ด๊ฐ ์์ ํ๋ ํ์ฌ ํ๋ก์ ํธ์์๋ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐํ๊ณ ์ปจํธ๋กค๋ฌ๋ง ์ฌ์ฉํ๋ ค๋ ํ๋ก์ ํธ์์ import ํ์ฌ ์ฌ์ฉํ ์ ์์ง๋ง ๊ตณ์ด ๊ทธ๋ ๊ฒ ํ ์ด์ ๊ฐ ์์ด๋ณด์ด์ง๋ ์์๋ค.
๊ด๋ จ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๋ค๊ฐ ssr / csr์์ msw ์ด๊ธฐ ๋ก๋ ๊ด๋ จ ์ด์ ๊ด๋ จ ๋ธ๋ก๊ทธ ๋ด์ฉ์ด ์ข ์๋ ๊ฒ ๊ฐ์๋๋ฐ, ๊ทธ ๋จ๊ณ๊น์ง๋ ์๋ํด๋ณด์ง ์์๋ค. ์ธ์ ๊ฐ ํ๋ก์ ํธ ๋ด์์ mock ์๋ฒ๋ฅผ ํ์ฉํด๋ณด๊ฒ ๋๋ค๋ฉด ๊ตฌํํด ๋ณผ ์๊ฐ์ด๋ค.