msw


프로젝트를 진행하다 보면 개발 일정이 원하지 않는 방향으로 흘러가는 일이 자주 발생한다.
나 같은 경우 백엔드 개발과 프론트 개발을 동시에 진행한 적이 많다.
 
프론트단에서는 API 의 응답 값에 따라 UI 를 다르게 보여주거나 어떠한 기능을 실행해야 하는 경우가 많은데, 이 경우 2가지 정도의 방법을 적용한 적이 있다.
 
  1. 프론트단에서 mock 데이터를 담당하는 json 파일을 생성해서 사용
  1. 백엔드단에서 별도의 mock server 생성
 
1번 방법은 기존 서비스 로직에 추가로 적용되다 보니 해당 방법을 적용할 때나 실제 API 를 적용할 때 모두 추가적인 작업으로 인해 시간 비용이 발생하는 문제가 있었고, 2번 방법은 별도의 mock server 를 생성하는 시간 비용 문제와 mock data 가 적용된 사항에 대한 공유가 어려운 문제점이 있었다.
 
이 문제점들로 인해 답답함을 느끼고 있던 중, MSW 라는 것을 알게 되었고 이를 도입하게 되었다.

정의

MSW(Mock Service Worker) 는 네트워크 요청을 가로채 개별적으로 설정한 mock data 를 응답받을 수 있는 라이브러리이다.
서비스 워커 (Service Worker) - 브라우저의 백그라운드에서 실행하는 스크립트 - 자바스크립트와 다른 별도의 스레드에서 동작 - 네트워크 요청을 가로채 제어할 수 있음

사용 후기

사용해 보면서 개인적으로 느꼈던 장단점을 정리해 봤다.

장점

  • 백엔드의 API 가 완성되지 않아도 API 관련 코드를 미리 작성하고 그에 맞는 설계를 할 수 있었다.
    • 이로 인해 테스트 및 mock 데이터 생성에 대한 시간 비용이 절약되었다.
    • mock API 에서 실제 API 로 전환이 매우 빠르고 간편했다.
  • 회원 탈퇴나 회원 가입 등의 호출 횟수가 제한적인 API 를 테스트할 때 여러번 테스트가 가능했다. (백엔드 개발자에게 데이터 수정 요청을 하지 않아도 되었다.)
  • 응답 값에 따른 UI 테스트를 하는 경우 mock 데이터 수정을 통해 간편하게 테스트를 진행할 수 있었다.
  • 모든 API 가 아닌 적용하고 싶은 endpoint 에만 적용할 수 있었다.

단점

  • 초기 세팅 및 mock data 를 적용해야 하는 번거로움이 존재했다.
  • GET 요청의 경우, 백엔드 API 에서 응답받는 json 구조를 아는 경우에 효과적으로 사용이 가능할 것 같았다.
  • 백엔드 API 응답 값의 구조가 변경되면 mock 데이터에도 추가로 변경이 필요한 부분이 있었다.
  • 서비스 워커 기반이기 때문에 구버전 브라우저는 지원하지 않았다. (내 경우는 구형 안드로이드 os 의 웹뷰 환경에서 동작하지 않았다.)

적용

공통

  1. msw 설치
    1. src/mocks/handlers.ts 생성
        • GET, POST 이외의 메서드는 공식 문서에서 확인할 수 있다.
        • 개인적으로 handlers 폴더에 endpoint 로 파일을 분리해서 관리하는 것을 선호한다.
      1. src/mocks/browser.ts 생성

        React

        1. src/index.tsx 에 msw 적용

          Next.js

          1. server, browser mock index 파일 생성
            1. src/mocks/index.ts 생성
              1. src/mocks/Provider.jsx 생성
                1. src/app/layout.jsx 코드 수정

                  공통 마무리

                  1. mockServiceWorker.js 생성
                      • 해당 명령어를 통해 public 폴더에 msw 를 실행할 수 있는 worker 파일을 생성한다.
                  1. 개발자 도구를 통해 msw 활성화 메시지가 나오면 적용이 완료된 것이다.

                    이슈

                    콜론 path 구분
                     

                     
                    참고