๊ณฐํฐ๋ทฐ์์ MSW๋ก ์ปค์คํ ์๋ฌ ์ฝ๋๋ฅผ ์ ์ํ๊ณ ํ ์คํธํ๋ ๊ณผ์ ์ ๋๋ค.
๊ณฐํฐ๋ทฐ ํ๋ก์ ํธ์์๋ ์๋ฒ์ ๊ฐ๋ฐ์๋์ ์ ์ฝ์ ๋ฐ์ง ์๊ณ ํ์ด์ง ๊ฐ๋ฐ์ ์งํํ๊ธฐ ์ํด MSW๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ์. MSW(Mock Service Worker)๋ ์๋น์ค ์์ปค API๋ฅผ ์ฌ์ฉํด ์ค์ ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ , ๋ฏธ๋ฆฌ ์ ์๋ ์๋ต์ ๋ฐํํด ๋ฐฑ์๋ ์๋ฒ ์์ด๋ HTTP ์์ฒญ์ ๋ชจ๋ฐฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๊ณฐํฐ๋ทฐ ํ๋ก ํธ์๋๋ MSW ๋๋ถ์ ๋ฐฑ์๋ API ๋ฐฐํฌ ์๋์ ์ํฅ์ ๋ฐ์ง ์๊ณ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๋น ๋ฅด๊ฒ ์งํํ ์ ์์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์ฐ๋ฆฌํ์ด MSW๋ฅผ ์ด๋ป๊ฒ ํ์ฉํด์ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ์ ์งํํ ์ ์์๋์ง์ ๋ํด ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
MSW๋ฅผ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ ์ค ํ๋๋ ๋ฐฑ์๋์ ์ํฅ์ ๋ฐ์ง ์๊ณ ํ๋ก ํธ์๋์ ๊ฐ๋ฐ์ ์งํํ๊ธฐ ์ํจ์ ๋๋ค. ํ์ง๋ง MSW๋ฅผ ๋ชฉ์ ํ๋๋ฐ ๋ง์ ์๊ฐ์ด ์์๋๋ค๋ฉด ๋น ๋ฅธ ๊ฐ๋ฐ์ ์ํด ๋์ ํ๋ MSW๊ฐ ์ด๋์ ๊ณจ์น์ํ ํ์คํฌ๊ฐ ๋ผ๋ฒ๋ฆฌ์ฃ . ๋ฐ๋ผ์ ์ฐ๋ฆฌ ํ์ ์ต์ํ์ ๋น์ฉ์ผ๋ก ์๋ต์ ๋ชฉ์ ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
์๋ฒ์ ์์ฒญ์ ๋ณด๋์ ๋ response ์๋ต์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ํ ๊ณณ์์ ํธ๋ฆฌํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋ชจ๋ response ์๋ต์ json ํ์ผ ํ์์ผ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํ์ต๋๋ค. ๊ฐ json ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌํ์ต๋๋ค. MSW ํธ๋ค๋ฌ์์ ๋ฐ๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํด ์๋ต์ ๋ด๋ ค์ฃผ์ง ์๊ณ ๋ณ๋์ json์ผ๋ก ๊ด๋ฆฌํ ์ด์ ๋ ์ถํ ์๋ฌ ์ํฉ์ ๋ํ ํธ๋ค๋ฌ๋ค์ด ์ถ๊ฐ๋์์ ๋๋ ์ผ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํจ์ ๋๋ค. ์ด ๋ถ๋ถ์ ์๋ ์๋ฌ์๋ต์ ๋ชฉ์ ์ ๋ํด ์ค๋ช ํ ๋ ๋ ์์ธํ ์ธ๊ธํ๋๋ก ํ ๊ฒ์.
http.post(API.ANSWER, () => {
return HttpResponse.json({}, { status: 201 });
}),
http.post(API.ANSWER_DEFAULT, ({ request }) => {
return HttpResponse.json({}, { status: 201 });
}),
POST, PATCH๋ฑ ํด๋ผ์ด์ธํธ์ request body์ ๋ฐ๋ผ์ ๋ค๋ฅธ ์๋ต์ ๋ด๋ ค์ค์ผ ํ๋ ์์ฒญ์ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ์๋ต์ ๊ฒ์ฆํ์ง ์๊ณ ๋ฌด์กฐ๊ฑด ์ฑ๊ณต ์๋ต์ ๋ด๋ ค์คฌ์ต๋๋ค. ์๋ํ๋ฉด ์๋ต ๊ฒ์ฆ ๋ก์ง์ด ์ถ๊ฐ๋๋ ์๊ฐ MSW๋ฅผ ๋ชฉ์ ํ๋๋ฐ ๊ต์ฅํ ๋ง์ ์๊ฐ์ด ์์๋๊ธฐ ๋๋ฌธ์ธ๋ฐ์. MSW๊ฐ ์ฑ ์์ ธ์ผ ํ ๊ฒ์ ๋ฐฑ์๋ API๊ฐ ๋ฐฐํฌ๋๊ธฐ ์ ํด๋ผ์ด์ธํธ์์ API ์ฐ๊ฒฐ ํ๊ฒฝ์ ๊ตฌ์ฑํ๊ธฐ ์ฉ์ดํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด์ง ์ค์ ๋์์ ์ ๊ณตํ ํ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ request body๋ฅผ ๊ฒ์ฆํ์ง ์๊ณ ๋ฌด์กฐ๊ฑด ์ฑ๊ณต ์๋ต์ ๋ด๋ ค์ฃผ๋๋ก ๋ชฉ์ ์ ๊ตฌํํ์ต๋๋ค.
http.get(API.ANSWER_ID(), ({ params }) => {
const { id: answerId } = params;
const answerIdMap = new Map<number, AnswerEntity[]>();
answerData.forEach((answer) => {
answerIdMap.has(answer.answerId)
? answerIdMap.get(answer.answerId)!.push(answer)
: answerIdMap.set(answer.answerId, [answer]);
});
return HttpResponse.json(answerIdMap.get(Number(answerId)));
}),
GET ์์ฒญ์ฒ๋ผ response body๊ฐ ํ์ํ ์๋ต์ ๊ฒฝ์ฐ ์์์ ์ ์ฅํด๋จ๋ json ๋๋ฏธ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ์๋ต์ ์์ฑํ๋ ๋ก์ง์ ์์ฑํ์ต๋๋ค. GET์์ฒญ๊ฐ์ ๊ฒฝ์ฐ ์๋ฒ์์ ๋ด๋ ค์ฃผ๋ ๋ฐ์ดํฐ๊ฐ ์ด๋์ ๋ ์์ด์ผ API ์๋ต์ ๋ฐ๋ฅธ ํ๋ฉด์ ๊ตฌ์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ธ๋ฐ์. ์ด ๋ํ ๋ง์ ์๊ฐ์ด ์์๋์ง ์๋๋ก json ๋ฐ์ดํฐ๋ง ๊ฐ๋จํ๊ฒ ๊ฐ๊ณตํด์ ์๋ต์ ์์ฑํ์ต๋๋ค.
์์ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ API ์ฑ๊ณต ์ผ์ด์ค์ ๋ํด์ ์ต์ํ์ ์๊ฐ๋ง์ ๋ค์ฌ API ๋ชฉ์ ์ ์๋ฃํ ์ ์์์ต๋๋ค. ํ์ง๋ง ํด๋ผ์ด์ธํธ์์ ๋ค์ํ ์ผ์ด์ค์ ๋ํ API๋ฅผ ํ ์คํธํ๊ธฐ ์ํด์๋ ์ฑ๊ณต ๋ฟ๋ง ์๋๋ผ ์๋ฌ ์ผ์ด์ค์ ๋ํ ๋ชฉ์ ๋ ํ์ํฉ๋๋ค.
์๋ฌ ์๋ต์ ๋ํ ๋ชฉ์ ์ MSW ํธ๋ค๋ฌ ์๋ต์ http status ์ฝ๋๋ง ์๋ฌ์ฝ๋๋ก ์์ ํด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์์ฃผ ๊ฐ๋จํ ์์ ์ ๋๋ค. ํ์ง๋ง ๋ฌธ์ ๋ ์ธ์ ์๋ฌ๋ฅผ ๋ฐ์์ํฌ ๊ฒ์ธ์ง์ ๋ํ ์กฐ๊ฑด์ ์ค์ ํ๋ ๊ฒ์ธ๋ฐ์. ์ด๋ป๊ฒ ํ๋ฉด ์๋ฌ ์ผ์ด์ค๋ฅผ ํ ์คํธํ ์ ์์์ง์ ๋ํด ๊ณ ๋ฏผํ๋ฉฐ ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ๊ณ ๋ คํด๋ดค์ต๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ถ์ํ๊ณ ๊ฒ์ฆํด์ ์๋ฌ ์ํฉ์ ๋ฐ์์์ผ์ผ ํฉ๋๋ค. ์ด๋ ๋ฐฑ์๋ ์ฝ๋ ์ค ์ปจํธ๋กค๋ฌ์ ํด๋นํ๋ ์ฝ๋๋ก ์ด ์์ ์ ์ฒ๋ฆฌํ๋ ค๋ฉด MSW๋ก ์ป์ ์ ์๋ ์ด์ ๋ณด๋ค ๋ ๋ง์ ๋น์ฉ์ด ์์๋๋ค๊ณ ํ๋จํ์ต๋๋ค.
์ ์์ ์ธ ์๋ต์ ๋ด๋ ค์ฃผ๋ api ์์ฒญ ์ฃผ์๊ฐ api/user
๋ผ๊ณ ๊ฐ์ ํ์ ๋ api/user/error
๋ผ๋ ์ฃผ์๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ์๋ฌ ์๋ต์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํด๋ดค์ต๋๋ค.
request body๋ฅผ ๊ฒ์ฆํด์ผ ํ๋ ๋ฐฉ๋ฒ1๋ณด๋จ ์ ์ ์๊ฐ์ด ์์๋๊ฒ ์ง๋ง, ํด๋ผ์ด์ธํธ ์ฝ๋์์ api ์์ฒญ ์๋ํฌ์ธํธ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ ์๊ณ ๋ก์์ด ์์ต๋๋ค.
'api ์๋ฌ ์ผ์ด์ค๋ฅผ ํ
์คํธํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒ์ด ๊ณผ์ฐ ์ณ์ ์๋๋ฆฌ์ค์ผ๊น?'์ ๋ํด ๊ณ ๋ฏผํด๋ณธ ๊ฒฐ๊ณผ ๋ญ๊ฐ ์ด์ํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ์ฃ . ๊ท์ฐฎ์๊ฑธ ๊ทน๋๋ก ์ซ์ดํ๋ ๊ฐ๋ฐ์๋ค์ด ์ด๋ ๊ฒ ๋ถํธํ๊ฒ MSW๋ฅผ ์ฌ์ฉํ ๊ฒ ๊ฐ์ง ์๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ๋๋ํ ํด๊ฒฐ์ฑ ์ ์๋๋ผ๊ณ ํ๋จํ๊ณ , ๋ ๋์ ๋ฐฉ๋ฒ์ ์ฐพ๊ธฐ ์ํด ํ์ํด๋ณธ ๊ฒฐ๊ณผ ์๋์ ๊ฐ์ ๊ธ์ ์ฐพ์ ์ ์์์ต๋๋ค. How do you mock different responses in real life?ย #1117
์ด ๊ธ์ ์์ฑ์๋ ์ ์ ๋์ผํ ๊ณ ๋ฏผ์ ํ๊ณ ์์๋๋ฐ์. ๋ฐํ์ ํ๊ฒฝ์์ ์ค์๊ฐ์ผ๋ก MSW์ ํธ๋ค๋ฌ ์๋ต์ ๊ต์ฒดํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ธ์ ๋ต๋ณ์์ ์์ฃผ ํ๊ธฐ์ ์ธ ํด๊ฒฐ์ฑ ์ ๋ฐ๊ฒฌํ์ต๋๋ค!!
export const handlers = [
rest.get('/api/articles/latest', (request, response, context) => {
const pageParams = new URLSearchParams(window.location.search)
const scenario = pageParams.get('scenario')
// Sad path
if (scenario === 'error') {
return response(
context.status(500),
context.json({ error: 'oops!' }),
)
}
// Happy path
return response(
context.status(200),
context.json({ data: 'some-random-fake-data' }),
)
}),
์ฆ, ์์ฝํ์๋ฉด MSW ๋ํ ํด๋ผ์ด์ธํธ ์ฝ๋ ์์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ url ์ฟผ๋ฆฌ ์คํธ๋ง ์ฃผ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ์. ์ด์ ๋ฐ๋ผ MSW ํธ๋ค๋ฌ ์ฝ๋๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํ๋ฉด ํด๋ผ์ด์ธํธ์ ์ฝ๋ ๋ณ๊ฒฝ ์์ด ์ํฉ๋ณ API ์๋ต์ ๋ฐ์ ์ ์์ต๋๋ค.
๊ณฐํฐ๋ทฐ ์๋น์ค๋ ๋ํ ์ผํ ์๋ฌ ํธ๋ค๋ง์ ์ํด http status ์ฝ๋ ๋ฟ ์๋๋ผ ์ปค์คํ ์๋ฌ์ฝ๋๋ฅผ ์ ์ํด์ ์ฌ์ฉํ๊ณ ์๋๋ฐ์. ์ด ๋ชจ๋ ์๋ฌ ์ํฉ์ ํ๋์ ํธ๋ค๋ฌ ์ฝ๋ ์์์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ ํธ๋ค๋ฌ์ ๊ฐ๋ ์ฑ์ ์ ํ์ํค๊ณ , ๋ถํธํ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๊ทธ๋์ ๊ณต์๋ฌธ์๋ฅผ ์ข ์ฐพ์๋ดค๋๋ Network behavior overrides - Mock Service Worker๋ผ๋ ๊ธ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด ๊ธ์ ์ค๋ช
์ ์์ฝํ์๋ฉด, setupWorker
๋ก ํธ๋ค๋ฌ๋ฅผ ์ค์ ํ๊ณ , worker.use
๋ฌธ๋ฒ์ ์ฌ์ฉํด ๋์ ์ผ๋ก ํธ๋ค๋ฌ๋ฅผ ๊ต์ฒดํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ด๋ฅผ ์ ์ฉํด ๋ค์๊ณผ ๊ฐ์ด MSW browser์ ์ง์
์ ์ ์ค์ ํ ์ ์์์ต๋๋ค.
const isScenarioName = (str: string): str is keyof typeof scenarios => {
return str in scenarios;
};
const scenarioName =
new URLSearchParams(window.location.search).get('error') || 'default';
export const worker = setupWorker();
isScenarioName(scenarioName)
? worker.use(...scenarios[scenarioName])
: worker.use(...scenarios.default);
isScenarioName
ํจ์๋ ํ์
๊ฐ๋๋ฅผ ์ํ ํจ์์
๋๋ค.scenarioName
์์ ํด๋ผ์ด์ธํธ์ url ์ฟผ๋ฆฌ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.setupWorker
๋ก MSW๋ฅผ ์ด๊ธฐํ ํ ํworker.use(...scenarios[scenarioName])
์ผ๋ก ํด๋ผ์ด์ธํธ url ์ฟผ๋ฆฌ ์คํธ๋ง์ ๋ฐ๋ฅธ MSW ํธ๋ค๋ฌ ์งํฉ์ ์ค์ ํด์ค๋๋ค.export const scenarios = {
default: defaultHandlers,
a01: A01ErrorHandlers,
a02: A02ErrorHandlers,
c02: C02ErrorHandlers,
m01: M01ErrorHandlers,
q01: Q01ErrorHandlers,
q02: Q02ErrorHandlers,
server: serverErrorHandlers,
t01: T01ErrorHandlers,
t02: T02ErrorHandlers,
v01: V01ErrorHandlers,
v02: V02ErrorHandlers,
v03: V03ErrorHandlers,
v04: V04ErrorHandlers,
v05: V05ErrorHandlers,
v06: V06ErrorHandlers,
v07: V07ErrorHandlers,
v08: V08ErrorHandlers,
w01: W01ErrorHandlers,
w02: W02ErrorHandlers,
w03: W03ErrorHandlers,
};
ํด๋ผ์ด์ธํธ์ ์ฟผ๋ฆฌ ์คํธ๋ง์ผ๋ก ์
๋ ฅ๋ฐ์ ๊ฐ์ ๊ฐ ์ปค์คํ
์๋ฌ ์ฝ๋์ ํด๋นํ๋ ํธ๋ค๋ฌ ์งํฉ์ ๋์๋ฉ๋๋ค.
๊ฐ ์๋ฌ ํธ๋ค๋ฌ ์งํฉ ๋ด๋ถ์๋ ์ฑ๊ณต ํธ๋ค๋ฌ ์๋ต๊ณผ ๋ก์ง์ ๋์ผํ์ง๋ง T01
์๋ฌ์ ํด๋นํ๋ ์ผ์ด์ค๋ค์ T01
์๋ฌ๊ฐ ๋ฐ์ํ๋ ์๋ต์ด ๋ด๋ ค์ต๋๋ค.
error=default
๋ก ์ค์ ๋์ด ์์ ๋๋ ์ ์์ ์ธ api ์๋ต์ด ๋ด๋ ค์ค๊ณ , ์ด ์ฟผ๋ฆฌ์คํธ๋ง์ error=t01
๋ก ๊ต์ฒดํ๋ ์๊ฐ MSW ํธ๋ค๋ฌ ์งํฉ์ด T01ErrorHandlers๋ก ๋ณ๊ฒฝ๋์ด ์๋ฌ ์ํฉ์ ๋ํ api ์๋ต์ด ๋ด๋ ค์ค๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
'์ญ์ ๊ฐ๋ฐ์๋ค์ด ๋ถํธํจ์ ๊ฐ์ํ ๋ฆฌ๊ฐ ์์ด!'๋ผ๋ ์๊ฐ์ด ์ ๋ก ๋ค๊ฒ ํ๋ ํด๊ฒฐ์ฑ ์ด์๋๋ฐ์. ์ฟผ๋ฆฌ๋ฅผ ํตํด ํธ๋ค๋ฌ๋ฅผ ๊ต์ฒดํ๋ค๋ ๊ฒ์ด ๋๋ฌด ์ถฉ๊ฒฉ์ ์ด๊ฒ ํ๊ธฐ์ ์ด๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด๋ผ ๊ผญ ๋ชจ๋์๊ฒ ๋๋ฆฌ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค.
ํ์ง๋ง ์ฌ์ ํ ๋ถํธํจ์ ์ด์ง ๋จ์์๋๋ฐ์. ๋ฐ๋ก ์๋ง์ ์๋ฌ ์ํฉ์ ๋ํ ํธ๋ค๋ฌ ์งํฉ์ ๋ชจ๋ ์์ฑํด์ผ ํ๋ค๋ ์ ์ ๋๋ค. ์ ๋ชจ๋ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋ ๋จ์ ๋ฐ๋ณต ์์ ์ ์งํํ๋ ๊ฒ์ด ์ฐธ ์๊น์ด ์๊ฐ์ด๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ์ด์ ์ ๋ฉํ ๋๊ป MSW์ ๊ดํ ์ง๋ฌธ์ ํ์ ๋ plop - npm์ด๋ผ๋ ํจํค์ง๋ฅผ ์ถ์ฒ๋ฐ์์ต๋๋ค. ๊ทธ ๋๋ MSW์ ์ด๋ฐ ์ฌ์ฉ๋ฒ์ ๋ชฐ๋ผ์ ๋๋์ฒด ์ด๋ป๊ฒ ๋์ ํด์ผ ํ๋๊ฑฐ์ง? ํ๋ ์๋ฌธ์ด ์์๋๋ฐ์. ์ด์ ์์ผ ์ ํจํค์ง์ ํ์์ฑ์ ๋๋ผ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ค์ ๋ก ์ด ์์ ์ ์งํํ๋ฉด์ ์๋์ ๊ฐ์ ์ค์๊ฐ ๋ฐ์ํ๊ธฐ๋ ํ์ต๋๋ค.๐๐ ๋ค์๋ฒ MSW๋ฅผ ์์ ์์ ์ ํ ๋๋ plop๋ฅผ ์ฌ์ฉํด์ ๋ ๋๋ํ๊ฒ ๋ชฉ์ ์ ํด๋ณธ ํ ์ ์ฉํ ํ์ ๊ณต์ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค~
[!info] ์ด ๊ฒ์๊ธ์ ๋์จ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก MSW๋ฅผ ๋ชฉ์ ํ์ ๋ถ์ด ์๋ค๋ฉด ๊ผญ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค ใ ใ
How do you mock different responses in real life?ย #1117 Network behavior overrides - Mock Service Worker
[NDD-344] MSW ์๋ฌ ๋ชจํนํ๊ธฐ, ๋๋ฏธ๋ฐ์ดํฐ json์ผ๋ก ๋ณ๊ฒฝ (2h/3h)