Mocking 이란? msw 사용해서 모의 데이터 만들어보기!

imzzuu·2022년 6월 28일

현재 Final 프로젝트에서 개발 설계를 위한 회의를 진행중이다!
아직 서버가 구축되지 않은 상황이라 프론트에서 임의로 API 통신을 하거나, 데이터를 생성, 수정, 삭제 할 수 있는 방법을 이야기 하던 중 POSTMAN, msw, firebase 등의 의견이 나왔다.
그 중 내가 찾아본 MSW 방법에 대해 포스팅해보고자 한다!

Mocking 이란?

Mock(모의 데이터)를 만들어 활용하는 방식
서버가 없는 경우, api 요청으로 내려올 데이터를 프론트에서 모킹하거나,
서버의 역할을 해주는 무언가가 필요할 때 활용

Service Worker는 일종의 대리 서버라고 할 수 있다. Service Worker를 활용하면, 리소스 요청을 가로채 수정할 수 있고, 리소스를 세부적으로 캐싱해 조작할 수 있다. 즉, 네트워크를 사용하지 못할 때에도 개발자가 개발하고 있는 웹앱이 어떻게 동작해야 하는지 조작할 수 있다는 것이다!

즉, msw는 유저의 request를 서버까지 보내지 않고 네트워크레벨에서 인터셉트해 임의의 데이터를 응답해주는 라이브러리라고 요약해볼 수 있겠다!

마치 이산들의 아이스크림처럼 인터셉트하기,,,

이제부턴 Mocking을 할 수 있는 msw 라이브러리 사용법을 알아보자!

msw 모킹 사이트


1. msw 설치하기

$ npm install msw --save-dev

2. browser.js 생성

import { setupWorker } from "msw";
import { handlers } from "./handler";

export const worker = setupWorker(...handlers);

3. handler.js 생성

가짜 데이터를 넣어줄 파일

import { rest } from "msw";

export const handlers = [rest.get("/login", async (req, res, ctx) => {})];

4. public 폴더에 Mock Service Worker 만들기 (msw초기화)

$ npx msw init public/ --save

5. index.js

import { worker } from "./mocks/worker";
if (process.env.NODE_ENV === "development") {
  worker.start();
}

개발환경인 경우에는 mocks 폴더의 browse.js 에서 worker 가져와서 실행!

⇒ 콘솔에 [MSW] Mocking enabled. 찍히면 성공!

6. handler.js 에 원하는 가짜 데이터 입력하여 사용

method (url )

서버로 보내지 않을 url을 적는다.

그러면, get 방식으로 위의 url로 요청하는 모든 API는 아래에 적은 데이터 응답을 받는다.

rest.get(
    "https://raw.githubusercontent.com/techoi/raw-data-api/main/simple-api.json",
    async (req, res, ctx) => {
      const id = req.url.searchParams.get("id");
      console.log(req);
      return res(
        ctx.json({
          data: {
            people: [
              {
                name: "joy", // get 주소까지 가지 않고, 여기서 수정한 내용 받아온다. 
                age: 135,
              },
              {
                name: id,
                age: 13,
              },
              {
                name: "cindy",
                age: 15,
              },
              {
                name: "judy",
                age: 25,
              },
              {
                name: "marry",
                age: 64,
              },
              {
                name: "tommy",
                age: 109,
              },
            ],
          },
        })
      );
    }
  ),

참조 벨로그

0개의 댓글