MSW

학습 키워드

  • Service Worker

  • MSW(Mock Service Worker)

  • polyfill(폴리필)

Service Worker

  • 웹 응용 프로그램, 브라우저, 그리고 (사용 가능한 경우) 네트워크 사이의 프록시 서버 역활 수행

  • 서비스 워커는 출처와 경로에 대해 등록하는 이벤트 기반 워커로서 JavaScript로 작성 된 파일

서비스 워커는 연관된 웹 페이지/사이트를 통제하여 탐색과 리소스 요청을 가로채 수정하고, 리소스를 굉장히 세부적으로 캐싱힌다.

⇒ 웹 앱이 어떤 상황에서 어떻게 동작해야 하는지 완벽하게 바꿀 수 있다. (대표적인 상황은 네트워크를 사용하지 못하는 경우)

MSW(Mock Service Worker)

🌎 MSW 사용 배경(feat.Mocking)

프론트엔드 개발을 진행하다보면 백엔드 개발과의 종속적인 부분이 생기기 마련이다. (대표적으로 백엔드의 API를 활용해야 하는 경우)

기획자 : XX 작업은 어떻게 진행 중인가요? 프론트엔드 개발자 : 그게… 아직 API가 준비되지 않아서 다음 주까지는 기다려야 합니다.....

예상한 기간보다 API 개발에 시간이 더 필요해진 경우, 그 시간만큼 프론트엔드 개발자가 개발을 진행하지 못하는 상황이 생겨나기도 한다.

계속 기다릴 수는 없기에 Mocking을 통해 위의 문제를 해결하고자 했다.

Thinking in React 예제를 통해 API 요청 코드 모킹처럼 직접적으로 내부 로직에 직접 Mocking해서 필요한 화면에 붙이는 방식이 있지만,

  • 서비스 로직에 직접 Mocking을 해야 하므로 애플리케이션 서비스 로직을 수정 필요

  • HTTP 메소드와 네트워크의 응답 상태에 따라 각각 대응하기가 쉽지 않다.

  • (Mocking으로 만든 결과물)화면에 대한 테스팅 및 디버깅 시에 어려움이 발생 .....

💡 결국 실제 API를 사용하는 것처럼 네트워크 수준에서 Mocking 하길 원하기 때문에 네트워크 요청 과정에서 Request에 대한 Mocking이 가능한 MSW를 사용하는 것이다.

📖 MSW는 무엇인가?

  • Mock Service Worker의 약자

  • API Mocking 라이브러리

  • 네트워크 요청을 가로채서 모의 응답(Mocked response)을 보내주는 역할을 수행

⚙️ MSW 설치 및 설정

1. MSW 패키지 설치

2. jest.config.js 파일의 “setupFilesAfterEnv” 속성에 setupTests.ts 파일 추가

3. setupTests.ts 파일 생성

  • beforeAll : Jest 시작할 때 맨 처음에 실행

    • server.listen : 테스트가 실행되기 전 모킹 활성화

    • onUnhandledRequest: 'error' : handler를 안 잡았을 때 오류 내도록 설정

  • afterAll : 전부 끝날 때 실행

    • server.close: 모든 테스트 실행 된 후 네이티브 요청 발행 모듈 복원(?)

  • afterEach : 각 테스트가 끝날 때마다 실행

    • server.resetHandlers : 테스트 사이에 모든 요청 핸들러를 재설정

4. 📁 src/mocks/ server.ts 파일 생성

5. 📁 src/mocks/ handlers.ts 파일 생성

👩🏻‍💻 Thinking in React 예제를 통해 REST API 모킹하기

1. MSW 설치 및 파일 생성 및 설정 완료

2. Thinking in React 예제의 Mock Date 기준으로 handlers.ts 작성

  1. App.test.tsx 수정

  • jest.mock 제거

  • waitFor 추가 (~ 가 될 때까지 대기하는 상태)

  • 콜백함수의 타입이 Promise로 되어 있어서 async/await 필요

4. 🚨 Error 발생

ReferenceError: fetch is not defined 발생

node.js 환경에서 테스트를 진행 중이었다. 최신버전의 node는 fetch를 지원하지만, 현재 사용 중인 버전의 Node는 지원하지 않아 나타난 error! (💡 Fetch는 브라우저[window]에서만 지원)

5. Github에서 만든 Fetch Polyfill(폴리필)을 사용해 해결

  • setupTests.ts 파일 최상위에 import로 적용

  • 기본적으로 지원하지 않는 이전 브라우저에서 최신 기능을 제공하는 데 필요한 코드

  • 새로운 문법을 낮은 버전에서도 돌아갈 수 있게 하기 위하여 만든 코드

🔍 참고 할 수 있는 예시?

  • 바벨과 같은 트랜스 파일러

최신 스펙으로 작성된 스크립트 코드를 명시한 버전에 따라 재작성 해줍니다. 낮은 버전의 자바스크립트 엔진에서도 프로그램이 돌아갈 수 있게 해주어 서비스가 문제없이 제공될 수 있게 해줍니다. 바벨에는 core-js 라이브러리가 탑재되어 es6 이후의 문법들에 폴리필을 이용할 수 있습니다.

🔗 참고

Last updated