정지용
기술스택 목록
테스트

MSW

프로젝트 2에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

브라우저와 Node.js 환경에서 네트워크 요청을 가로채 모의 응답을 반환하는 API 모킹 라이브러리

MSW(Mock Service Worker)는 Service Worker API를 활용해 실제 네트워크 계층에서 HTTP 요청을 가로채고 모의 응답을 반환하는 라이브러리입니다. 백엔드 API가 준비되지 않았거나, 테스트 환경에서 외부 의존성을 제거하고 싶을 때 프론트엔드 코드 수정 없이 API 응답을 시뮬레이션할 수 있습니다. 개발 환경과 테스트 환경 모두에서 동일한 모킹 정의를 재사용할 수 있어 일관성 있는 개발 경험을 제공합니다.

이럴 때 사용합니다

  • 백엔드 API 개발 완료 전에 프론트엔드를 독립적으로 개발하고 테스트해야 할 때
  • 통합 테스트에서 외부 API 의존성을 제거하고 안정적인 응답을 보장하고 싶을 때
  • 에러 상황, 지연, 특수한 응답 케이스를 재현하기 어려운 경우
  • 실제 네트워크 요청과 동일한 흐름을 유지하면서 모킹하고 싶을 때

핵심 개념

Service Worker
브라우저가 백그라운드에서 실행하는 스크립트로, 네트워크 요청을 가로채고 수정할 수 있습니다. MSW는 이를 이용해 실제 네트워크 요청을 중간에서 처리합니다.
Request Handler
특정 HTTP 메서드와 경로 패턴에 매칭되는 요청을 처리하는 함수입니다. 요청이 들어오면 정의된 핸들러가 모의 응답을 생성해 반환합니다.
REST API Handler
http.get, http.post 같은 메서드로 RESTful API 요청을 모킹합니다. 경로 파라미터와 쿼리 스트링을 포함한 다양한 패턴 매칭을 지원합니다.
GraphQL Handler
graphql.query, graphql.mutation으로 GraphQL 요청을 모킹합니다. 오퍼레이션 이름 기반으로 요청을 구분하고 응답을 정의할 수 있습니다.
setupWorker / setupServer
브라우저 환경에서는 setupWorker로 Service Worker를 시작하고, Node.js 테스트 환경에서는 setupServer로 요청 가로채기를 활성화합니다.

기본 REST API 모킹 설정

GET /api/user와 POST /api/login 요청을 가로채서 미리 정의한 JSON 응답을 반환합니다. 실제 fetch나 axios 호출 코드는 전혀 수정하지 않아도 됩니다.

JavaScript
import { http, HttpResponse } from 'msw';
import { setupWorker } from 'msw/browser';

// 요청 핸들러 정의
const handlers = [
  http.get('/api/user', () => {
    return HttpResponse.json({
      id: 1,
      name: '홍길동',
      email: 'hong@example.com'
    });
  }),
  
  http.post('/api/login', async ({ request }) => {
    const body = await request.json();
    return HttpResponse.json({ token: 'mock-token-123' });
  })
];

// 브라우저 환경에서 Service Worker 시작
const worker = setupWorker(...handlers);
worker.start();

처음 쓸 때 흔한 함정

  • 브라우저 환경에서는 Service Worker 등록이 필요하므로 public 폴더에 worker 스크립트 파일을 배치해야 함
  • 경로 패턴이 겹치는 핸들러가 여러 개면 먼저 정의된 것이 우선 적용됨
  • 테스트 환경에서는 setupServer를 사용해야 하며, setupWorker는 브라우저 전용임

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.