MSW(Mock Service Worker) 2.0
ํ๋ก ํธ์๋์์ ๋ฐฑ์๋ API๊ฐ ๊ฐ๋ฐ๋๊ธฐ ์ ๋ชฉ์ API๋ฅผ ์ง์ ๊ฐ๋ฐํด UI๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ฒซ ํ์ฌ์์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ฅผ ์์ฑํ ๋ ์ฒ์ ์ฌ์ฉํด ๋ดค๋ค. ์ต๊ทผ 2.0 ๋ฒ์ ์ด ์๋กญ๊ฒ ๋์๋ค๊ณ ํ๋ ์ค์ ๋ฐฉ๋ฒ์ ๊ธ๋ก ๋จ๊ฒจ๋ณธ๋ค.
MSW(Mock Service Worker)๋?
โฌ๏ธ Install
> npm install msw --save-dev
> yarn add -D mswโ MSW ์์ฑ
> npx msw init public/ --save โ๏ธ Setup
msw๋ ์๋น์ค ์์ปค๋ผ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ค. ์๋น์ค ์์ปค๋ ๋ธ๋ผ์ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์คํฌ๋ฆฝํธ๋ก ํด๋น ํ์ด์ง์๋ ๋ณ๊ฐ๋ก ์๋ํ๋ฏ๋ก DOM ์ ์ด๋ ์ฌ์ฉ์ ์ธํฐ๋ ์
์ด ํ์ํ์ง ์์ ๊ธฐ๋ฅ๋ง ์ ๊ณตํ๋ค.
์๋น์ค ์์ปค ์ค์ ์ธ brower.ts ์ ๋ชจํน API ํจ์์ธ handler.ts ๋ฅผ ์์ฑํ๋ค.
๐ ./mock/brower.ts
import { setupWorker } from 'msw/browser'
import { handlers } from './handlers'
export const worker = setupWorker(...handlers)๐ ./mocks/handler.ts
import { http, HttpResponse } from 'msw'
export const handlers = [
http.get('/api/user', ()=>{
return HttpResponse.json({ status: 200, name: 'kkusaeng' })
})
]๐ main.tsx
import ReactDOM from 'react-dom/client'
import { RouterProvider } from 'react-router'
import router from '@/router'
import '@/styles/index.css'
const enableMockingg = async () => {
if (import.meta.env.MODE === 'production') return
const { worker } = await import('../mocks/browser')
return worker.start()
}
enableMockingg().then(() => {
ReactDOM.createRoot(document.getElementById('macjjuni') as HTMLElement).render(
// <React.StrictMode>
<RouterProvider router={router} />,
// </React.StrictMode>
)
}์ํธ๋ฆฌ ํฌ์ธํธ์์ ๊ฐ๋ฐ ๋ชจ๋์์๋ง ์์ปค๋ฅผ ์คํ์ํจ ํ ๋ฆฌ์กํธ DOM ๊ฐ์ฒด๋ฅผ ์์ฑํด ์ฃผ๋ฉด ๋๋ค. ๊ฐ๋ฐ ์๋ฒ๋ฅผ ์คํํ๋ฉด ์ฝ์ ์ฐฝ์์ Mocking enabled ๋ฉ์ธ์ง๊ฐ ๋ณด์ธ๋ค๋ฉด ์ ๋๋ก ์๋๋ ๊ฒ์ด๊ณ ๋ค์์ผ๋ก ํ ์คํธ๋ก ๋ง๋ ๋ชจํน API๋ฅผ ํธ์ถํด์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด์ ๐๐ปโโ๏ธ
[MSW] Mocking eanbled.๐๐ปโโ๏ธ ๋ชจํน API ํธ์ถ ํ ์คํธ
๐ App.tsx
import { Outlet } from 'react-router'
import { useEffect } from 'react'
export default function App() {
const getUser = async () => {
const response = await fetch('/api/user')
const data = await response.json()
console.log(data)
}
useEffect(() => {
getUser()
}, [])
return <Outlet />
}getUser() ํจ์๋ฅผ ์์ฑํด์ ์คํํด๋ณด๊ณ ์ฝ์์ฐฝ์ ์ ๋์ค๋ ํ์ธํด๋ณด์.
ํ ์คํธ๋ก ๋ง๋ค์ด ๋ณธ ๋ชฉํน API๋ฅผ ํธ์ถํ์ ๋์๋ ์์ฑํ ๋๋ก ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค๋ฉด ๋ชฉํน API ์ค์ ์ ๋์ด๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋ฐฑ์๋ API ๊ฐ๋ฐ์ด ๋๊ธฐ ์ ์์๋ก ๋ชจํน API๋ฅผ ๋ง๋ค์ด UI๋ฅผ ์์ฑํด ๋ณด๊ณ API ํธ์ถ์ ์คํจ์ ์ฑ๊ณต ๋ ๊ฐ์ง ์ผ์ด์ค์ ๋ํด ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณธ๋ค๋ฉด ์๋ฒฝํ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ด์ง ์์๊น ์ถ๋ค.