티스토리 뷰

웹 개발 공부하기

[02.11] 모킹 서버

jooya-1009 2025. 2. 17. 15:52

💥 모킹 서버(Mock Service Worker)

1) MSW 자바스크립트 라이브러리

2) 존재하지 않는 API에 대한 응답을 모킹

3) service worker 에서 요청을 처리

4) chrome 기준 devTool의 Application /Service workers 의 "Bypass for network"로 일시 정지

 

1. book.model.ts

export interface BookReviewItem {
    id: number;
    userName: string;
    content: string;
    created_at: string;
    score: number;
}

원래의 book.model.ts 파일에 BookReviewItem 인터페이스를 추가해주었다.

 

2. review.api.ts

import { BookReviewItem } from "@/models/book.model";
import { requestHandler } from "./http";

export const fetchBookReview = async (bookId: string) => {
    return await requestHandler<BookReviewItem>("get", `/reviews/${bookId}`)
}

그리고 review.api 파일을 만들어서 fetchBookReview 함수를 만들어서 export 해주었다.

 

3. useBook.ts

const [reviews, setReviews] = useState<BookReviewItem[]>([])

useBook.ts 파일에 review 상태를 정의해주고, useEffect 부분에 fetchBookReview 함수를 추가해주었다.

 

4. mockServiceWorker.js

npm msw init public/ --save

터미널에서 npm 명령어로 mockServiceWorker.js 를 생성했다.

안에 내용은 따로 건드릴 필요는 없다.

이 명령어로 설치하게 되면 mockServiceWorker.js 는 public 폴더에 생성된다.

 

5. index.tsx

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

async function mountApp() {
  if(process.env.NODE_ENV === "development") {
    const { worker } = require("./mock/browser")
    await worker.start() // MSW 시작
  }

  const root = ReactDOM.createRoot(
    document.getElementById('root') as HTMLElement);
  root.render(
    <React.StrictMode>
      <App />
    </React.StrictMode>
  );
}

mountApp()

worker 를 실행시키는 코드를 작성한다.

async 를 해주지 않으면 MSW 가 먼저 실행될 수도 있기 때문에 async await 을 사용해 순서를 바꿔주었다.

 

6. review.ts

import { BookReviewItem } from "@/models/book.model"
import { http, HttpResponse } from "msw"
import { fakerKO as faker } from "@faker-js/faker"

const mockReviewData: BookReviewItem[] = Array.from({ length: 8 }).map((_, index) => ({
    id: index,
    userName: faker.person.fullName(),
    content: faker.lorem.paragraph(),
    created_at: faker.date.past().toISOString(),
    score: faker.number.int({ min:1, max: 5})
}))

export const reviewsById = http.get("http://localhost:9999/reviews/:bookId", () => {
    return HttpResponse.json(mockReviewData, {
        status: 200
    })
})

mock 폴더를 새로 만들어 그 안에 review.ts 를 생성한다.

faker 라이브러리를 사용해서 dummy 데이터와 비슷하게 가짜 데이터를 만들어준다.

faker 로만 하면 영어이름과 영어글이 적히기 때문에 fakerKO 로 적어준 뒤 별칭을 위해 as 를 붙여주었다.

원래 score: 부분에 rangeToNumber 를 사용하셨는데 왜인지 모르겠지만 난 자꾸 없는 property 라고 떠서,

그냥 int로 랜덤하게 뽑히게 썼다.

 

7. browser.ts

import { setupWorker } from "msw/browser"
import { reviewsById } from "./review"

const handlers = [reviewsById]

export const worker = setupWorker(...handlers)

review.ts 파일에 만든 reviewsById 를 갖고와서 handlers에 넣어준다.

browser.ts 파일 역시 mock 폴더에 생성하면 된다.

 

그럼 이렇게 내가 지정한 데이터대로 faker 를 통해 더미 데이터가 넘어오게 된다.

'웹 개발 공부하기' 카테고리의 다른 글

[02.11] 다양한 UI 경험  (3) 2025.02.17
[02.11] 도서 상세 - 리뷰  (2) 2025.02.17
[02.10] Book-Shop(Front) 중간 회고 2  (0) 2025.02.16
[02.10] Book-Shop(Front) - 중간 회고  (0) 2025.02.16
[02.10] 스니펫(Snippet)  (0) 2025.02.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함