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 파일 추가
jest.config.js 파일의 “setupFilesAfterEnv” 속성에 setupTests.ts 파일 추가3. setupTests.ts 파일 생성
setupTests.ts 파일 생성beforeAll : Jest 시작할 때 맨 처음에 실행
server.listen : 테스트가 실행되기 전 모킹 활성화
onUnhandledRequest: 'error': handler를 안 잡았을 때 오류 내도록 설정
afterAll : 전부 끝날 때 실행
server.close: 모든 테스트 실행 된 후 네이티브 요청 발행 모듈 복원(?)
afterEach : 각 테스트가 끝날 때마다 실행
server.resetHandlers : 테스트 사이에 모든 요청 핸들러를 재설정
4. 📁 src/mocks/ server.ts 파일 생성
server.ts 파일 생성5. 📁 src/mocks/ handlers.ts 파일 생성
handlers.ts 파일 생성
👩🏻💻 Thinking in React 예제를 통해 REST API 모킹하기
1. MSW 설치 및 파일 생성 및 설정 완료
2. Thinking in React 예제의 Mock Date 기준으로 handlers.ts 작성
handlers.ts 작성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(폴리필)을 사용해 해결
Polyfill(폴리필)을 사용해 해결Polyfill 설치 window.fetch polyfill
setupTests.ts파일 최상위에 import로 적용
기본적으로 지원하지 않는 이전 브라우저에서 최신 기능을 제공하는 데 필요한 코드
새로운 문법을 낮은 버전에서도 돌아갈 수 있게 하기 위하여 만든 코드
🔍 참고 할 수 있는 예시?
바벨과 같은 트랜스 파일러
최신 스펙으로 작성된 스크립트 코드를 명시한 버전에 따라 재작성 해줍니다. 낮은 버전의 자바스크립트 엔진에서도 프로그램이 돌아갈 수 있게 해주어 서비스가 문제없이 제공될 수 있게 해줍니다. 바벨에는 core-js 라이브러리가 탑재되어 es6 이후의 문법들에 폴리필을 이용할 수 있습니다.
🔗 참고
Last updated