일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 쓰레드
- 동기
- mock service worker
- 기본
- 컴포넌트
- 최적화
- 목킹
- Cache
- thread
- link
- react-query
- Critical Rendering Path
- next hydration
- Concurrent Mode
- 캐쉬
- styled-component
- 리액트
- MSW
- 리액트네이티브
- front-end mocking
- amplify
- Babel
- react server component
- react-native
- 기초
- SWC
- CSS-in-JS
- 아키텍처
- next.js
- 자바스크립트
- async
- vanilla-extract
- Basic
- 리액트쿼리
- sprinkles
- JavaScript
- 개발자
- mockoon
- 비동기
- React
- Today
- Total
Don’t worry about failures
MSW에 대해 본문
MSW(Mock Service Working)은 API Mocking 작업을 하기 위한 라이브러리 중 하나이다.
서비스 워커를 통해 호출을 가로채 대신 응답을 하는 방식으로 API Mocking을 도와준다.
MSW에서 중요한 개념인 서비스 워커부터 간략하게 알아보자.
Service Worker
서비스 워커는 이벤트 기반 워커로써 웹 애플리케이션의 메인 쓰레드와 분리된 별도의 백그라운드 스레드에서 실행 시킬 수 있는 기술 중 하나이다. 서비스 워커 덕분에 애플리케이션의 UI Block 없이 연산을 처리할 수 있게 됐다.
이를 기반으로 하여 다양한 사용이 있다. mock API, push 알림, 백그라운드 동기화 등으로 활용할 수 있다.
아래의 이미지는 서비스 워커가 네트워크와 브라우저 사이에 존재하여 api를 인터셉트하여 대신 응답을 보내주는 이미지이다.
브라우저에서 실행되지 않기 때문에 서비스 워커는 DOM에 직접 접근할 수 없다. 이 때문에 postMessage를 통해 웹 페이지와 소통이 가능하여 이를 활용한다.
간단한 예시를 보면, (https://fe-developers.kakaoent.com/2022/221208-service-worker/)
const registerServiceWorker = async () => {
if ("serviceWorker" in navigator) {
try {
const registration = await navigator.serviceWorker.register("./service-worker.js");
if (registration.installing) {
console.log("Service worker installing");
} else if (registration.waiting) {
console.log("Service worker installed");
} else if (registration.active) {
console.log("Service worker active");
}
} catch (error) {
console.error(`Registration failed with ${error}`);
}
}
};
registerServiceWorker();
이는 브라우저에서 서비스 워커를 등록하는 과정이다.
// service-worker.js
self.addEventListener("fetch", function (event) {
const { url } = event.request;
if (url === "https://jsonplaceholder.typicode.com/users/1") {
event.respondWith(
new Response(
JSON.stringify({
message: "this message is re-written by service-worker",
})
)
);
}
});
이와 같이 서비스 워커에 이벤트를 등록하면, 브라우저에서 fetch를 보내게 되면 service-worker에서 이벤트가 발생되고 intercept를 할 수 있게 된다. 중간에 가로채서 응답을 임의로 만들어 서버까지 요청이 가는 것이 아닌 서비스 워커 단에서 응답을 해버린다.
MSW (Mock Service Working)
MSW는 위에서 살펴본 서비스 워커를 활용하여 구현되어 있다.
MSW의 동작 원리는 위의 이미지와 같다.
MSW의 경우 사실 Service worker만 이해했다면 동작하는 방식에 있어서 큰 무리없이 이해가 될 것이다.
그럼 사용 방법에 대해 살펴보자.
install:
yarn add -D msw
service worker 파일 init :
(public 폴더 하위에 생성하도록 명령)
npx msw init public/ --save
해당 스크립트를 실행하게 되면, mockServiceWorker.js 파일이 생성이 된다.
// index.ts
async function initMSW() {
if (typeof window === "undefined") {
const { server } = await import("@src/mocks/server");
server.listen();
} else {
const { worker } = await import("@src/mocks/browser");
worker.start();
}
}
export { initMSW };
// server.ts
import { setupServer } from "msw/node";
import { handlers } from "@src/mocks/handler";
export const server = setupServer(...handlers);
// browser.ts
import { setupWorker } from "msw/browser";
import { handlers } from "@src/mocks/handler";
export const worker = setupWorker(...handlers);
// handler.ts
import { http, HttpResponse } from "msw";
export const handlers = [
// 할일 목록
http.get("/todos", () => {
return HttpResponse.json([]);
}),
];
initMSW();
function App() {}
위와 같은 구조 및 코드를 작성하면 성공이다.
참고:
https://developer.mozilla.org/ko/docs/Web/API/Service_Worker_API
Service Worker API - Web API | MDN
서비스 워커는 웹 응용 프로그램, 브라우저, 그리고 (사용 가능한 경우) 네트워크 사이의 프록시 서버 역할을 합니다. 서비스 워커의 개발 의도는 여러가지가 있지만, 그 중에서도 효과적인 오프
developer.mozilla.org
https://fe-developers.kakaoent.com/2022/221208-service-worker/
서비스 워커에 대해 알아보고 Mock Response 만들기 | 카카오엔터테인먼트 FE 기술블로그
최용열(raon) 힙합을 좋아하는 개발자입니다. 요즘은 클라이밍에 빠졌습니다.
fe-developers.kakaoent.com
'React' 카테고리의 다른 글
css-in-js를 떠나 보내야하나? (0) | 2024.04.22 |
---|---|
리액트 서버 컴포넌트 (0) | 2024.04.04 |
전역 상태관리에 대해 (0) | 2024.03.25 |
Hydrate에 대해 (0) | 2024.03.22 |
React StrictMode에 대해 (0) | 2024.03.21 |