포스트

MSW 활용기 | (1) 소개 및 적용기

MSW 활용기 | (1) 소개 및 적용기

📌 이 글은 MSW 시리즈 중 1편입니다.
2편: Mock API Schema 자동 생성하기
3편: Plugin 방식으로 제공하기


도입 배경

대부분의 프로젝트는
UI 개발 → 대기(백엔드 API 준비) → API 연동 순으로 진행됩니다.
프런트엔드 입장에선 대기 시간이 길어질수록 전체 일정과 QA 일정이 밀려 개발 효율이 저하됩니다. 이를 개선하기 위해 MSW를 도입했습니다.

프로젝트 플로우 펭귄


MSW 소개

MSW(Mock Service Worker)Service Worker를 이용해 네트워크 요청을 가로채고 모의 응답을 반환하는 API 모킹 라이브러리입니다.
서버를 별도 구축할 필요 없이 브라우저·Node 환경 모두에서 동일한 핸들러를 재사용할 수 있습니다.


MSW의 특징

1. Service Worker란?

  • 메인 스레드와 분리된 백그라운드 스레드
  • 요청 가로채기, 캐싱, 오프라인 처리 등 가능
  • IE 미지원, HTTPS(또는 localhost) 요구

Service Worker 구조

2. MSW 동작 원리

  1. 브라우저에 Service Worker 설치
  2. 네트워크 요청 가로채기
  3. 일치하는 핸들러가 있으면 Mock 응답 반환
  4. 서버가 없어도 프론트 개발·테스트 가능

MSW 동작 원리

3. 개발 플로우 예시

  1. 기획서 확정 후 API 스펙 합의
  2. 프런트는 MSW로 Mocking 하며 UI 개발
  3. 백엔드 API 제공 시 스위치만 끄고 실서버 통신
  4. 동일 코드로 QA → 프로덕션 배포

개발 방식


다른 라이브러리와의 차이점

라이브러리 비교

라이브러리특징한계
axios-mock-adapteraxios 전용·코드 내부 모킹네트워크 레이어 가로채기 불가
nockNode 환경 전용브라우저 미지원
MSWService Worker 기반 네트워크 모킹초기 HTTPS 설정 필요

설치 및 구성

환경

  • Node v16.20.1
  • Vue v2.7.16 + Vite v4.5.3
  • MSW v2.2.14
  • vite-plugin-mkcert v1.17.5

1. 패키지 설치 및 초기화

1
2
3
4
5
# MSW 설치
npm i -D msw

# public 디렉터리에 Service Worker 스크립트 생성
npx msw init public/

2. 핸들러 및 워커 설정 API 요청을 가로채서 반환할 모의 응답을 정의하는 핸들러를 작성하고, 이를 서비스 워커에 등록합니다.

1
2
3
4
5
6
7
8
// @/mocks/sampleHandler.js
import { http, HttpResponse } from 'msw'

export const handlers = [
  http.get('/api/user', () => {
    return HttpResponse.json({ name: 'Ji-hun Seo' })
  })
]
1
2
3
4
5
6
7
8
9
// @/mocks/mswSetupWorker.js
import { setupWorker } from 'msw/browser'
import { handlers } from '@/mocks/sampleHandler'

// 워커 설정 및 시작
export const initMSW = () => {
  const worker = setupWorker(...handlers)
  worker.start({ onUnhandledRequest: 'bypass' }) // 처리되지 않은 요청은 실제 서버로 전달
}

3. HTTPS 개발 서버 설정 (mkcert) Service Worker는 localhost 또는 HTTPS 환경에서만 동작하므로, mkcert를 사용해 로컬 HTTPS 환경을 구축합니다.

1
2
3
4
5
6
# mkcert 설치 및 로컬 인증서 생성
brew install mkcert
mkcert -install && mkcert localhost

# Vite 플러그인 설치
npm i -D vite-plugin-mkcert

vite.config.js에 플러그인을 추가합니다.

1
2
3
4
5
6
7
8
// vite.config.js
import { defineConfig } from 'vite'
import mkcert from 'vite-plugin-mkcert'

export default defineConfig({
  server: { https: true },
  plugins: [mkcert()]
})

image.png

SSL 설정이 되어있지 않다면 위와 같은 에러를 만나게 됩니다.

MSW에서 권장하는 방법은 시스템 레벨, 브라우저 레벨 2가지가 있습니다.

저는 전자를 선택했습니다.

4. 어플리케이션에 적용 main.js에서 initMSW()를 호출하여 MSW를 활성화합니다.

1
2
3
4
// main.js
import { initMSW } from '@/mocks/mswSetupWorker'

initMSW()

동작 확인

MSW가 정상 설치되면 브라우저 콘솔에
[MSW] Mocking enabled. 메시지가 출력되고 Network 탭에서 Service Worker 응답을 확인할 수 있습니다.

image.png

image.png


시행착오

  1. 브라우저 vs Node 혼용
    Node 핸들러까지 설정하려다 불필요한 의존성을 추가해 빌드 오류 다발 → 브라우저 전용으로 정리
  2. Vite 3 → 4 업그레이드
    GraphQL import 문법 오류(Unexpected string) 발생 → Vite 4로 올려 해결
  3. HTTPS 인증 문제
    브라우저-레벨 인증만으로는 팀원 PC에서 미작동 → mkcert로 시스템 레벨 인증서 적용
  4. 버전·스키마 변경으로 핸들러 불일치 → 공식문서·커뮤니티 사례 참고 후 수정

시행착오


기술 스택 (Tech Stack)

MSW Vue.js Vite mkcert Swagger UI faker json-schema-faker


추후 할 일

  • API 스키마 자동 수집 → Mock 생성 파이프라인화
  • Storybook + MSW 연동
  • MSW 툴바 UI & Mock 데이터 관리 도구 개발

참고


🗓️ 업데이트 내역

  • 2025-07-29:
    • MSW Node환경 적용 및 Vitest 연동
    • 개발 기간: 25.07.25 - 25.07.29
  • 2024-12-10:
    • 코드 리팩토링 및 Mixin 방식 추가
    • 개발 기간: 24.11.28 - 24.12.10

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.