프로그래밍 언어/NEXT.JS

[NEXT.JS] MSW(Mock Service Worker)

doomole 2024. 3. 7. 14:24
728x90

개요

프론트엔드 개발자라면 서버와의 API 요청을 개발할 때, 백엔드 개발자가 API개발이 완료되지 않은 시점에 테스트가 필요할 수 있다.

이에 따라 실제 API 통신 대신 정해진 규격에 맞는 가짜 데이터를 통해 API 개발을 쉽게 할 수 있는 MSW라는 라이브러리를 사용해봤다.

 

설치

터미널에서 아래 명령어를 통해 쉽게 설치할 수 있다.

npm install msw

 

사용법

NEXT.JS 프로젝트 src 폴더 하위에 mocks 폴더를 생성한다.

폴더에는 3개의 파일을 생성한다.

 

browser.ts

브라우저 환경 설정 파일

import { setupWorker } from 'msw/browser';
import { handler } from './handler';

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

 

handler.ts

요청을 mocking하는 파일

import { http, HttpResponse } from 'msw';

export const handler = [
  http.get('http://www.test.com/test', () => {
    console.log('here')
    return HttpResponse.json(
      {
        success: true,
        message: '성공'
      },
    );
  }),
];

 

server.ts

node 환경 설정 파일

import {setupServer} from 'msw/node';
import {handler} from './handler';

export const server = setupServer(...handler);

 

layout.tsx에 적용할 component 파일을 생성한다.(NEXT JS 14기준)

src/_component/msw.component.tsx

'use client'

import {useEffect} from "react";

export const MswComponent = () => {
  useEffect(() => {
    if (process.env.NODE_ENV === 'development') {
      if (typeof window === 'undefined') {
        (async () => {
          const {server} = await import('@/mocks/server');
          server.listen();
        })();
      } else {
        (async () => {
          const {worker} = await import('@/mocks/browser');
          worker.start();
        })();
      }
    }
  })

  return null
}

 

layout에서 위 컴포넌트를 호출한다.

src/layout.tsx

import {MswComponent} from "@/app/_component/msw.component";

type Props = {
  children: React.ReactNode,
};
export default function RootLayout({
  children,
}: Props) {
  return (
    <html lang="en">
      <body>
        <MswComponent />
        {children}
      </body>
    </html>
  )
}

 

dev환경에서만 동작하도록 .env 파일을 수정한다.

.env

NODE_ENV=development

 

마지막으로 터미널에서 서비스 워커를 실행한다.

npx msw init public / --save

 

테스트

nextjs를 실행 후 browser 콘솔에는 아래와 같이 mock enabled가 표시된다.

 

component에서 button을 생성하고 onClick으로 http 통신을 요청한다.

URL은 handler에서 명시한 URL(backend API URL을 의미한다.)

export default function Main() {
  const submit = async() => {
    const data = await fetch('http://www.test.com/test', {
      method: 'get',
    }).then((res) => {
      return res.json()
    })

    await console.log(data)
  }

  return (
    <>
      <button onClick={submit}>qweqwewqe</button>
    </>
  )
}

 

버튼 클릭 시 아래와 같이 정상적으로 mocking 후 return 되는 것을 확인할 수 있다.

 

사용함에 있어서 API가 아직 개발되지 않았거나, 의도적으로 에러를 내야하는 경우 등에서 사용할 수 있기 때문에 활용도가 많을 것 같다.

 

 

문의사항이나 피드백은 댓글로 남겨주세요.