TrainingDiary / training-diary-frontend

νŠΈλ ˆμ΄λ‹ 닀이어리 ν”„λ‘ νŠΈμ—”λ“œ
https://trainingdiary.netlify.app/
0 stars 0 forks source link

[DOCS] MSW μ μš©ν•˜κΈ° #14

Open jeongminDev opened 3 months ago

jeongminDev commented 3 months ago

πŸ“ κ°œμš”

MSW의 κ°œλ… 및 μ‚¬μš©λ²•μ— λŒ€ν•΄ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ“ MSW λž€?

πŸ“ MSW μ μš©ν•˜κΈ°

export const handlers = [ http.get('/api/users', () => { return HttpResponse.json([ { id: '123', email: 'lee@abc.co', name: 'kim', role: 'TRAINER', }, { id: '1234', email: 'jay@abc.co', name: 'eun', role: 'TRAINER', }, { id: '12345', email: 'mar@abc.cok', name: 'usa', role: 'TRAINEE', }, ]); }), ];

- 3단계 : λΈŒλΌμš°μ € 톡합
> λΈŒλΌμš°μ €μ—μ„œ Mock Service Workerλ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.
- μš°μ„  λΈŒλΌμš°μ €μ— μ„œλΉ„μŠ€ μ›Œμ»€ 등둝
```typescript
npx msw init public/ --save
// src/mocks/browser.ts
import { setupWorker } from 'msw/browser';

import { handlers } from './handlers';

export const worker = setupWorker(...handlers);

function App() { const [peopleData, setPeopleData] = useState<userType[]>([]);

useEffect(() => { const fetchData = async () => { try { const res = await axios({ method: 'get', url: '/api/users', }); console.log(res.data); if (res.status === 200) { setPeopleData(res.data); } } catch (error) { console.log(error); } }; fetchData(); }, []);

return ( <> {peopleData.map((item) => (

이름 : {item.name}

이메일 : {item.email}

role : {item.role}

  ))}
</>

); }

![image](https://github.com/TrainingDiary/training-diary-frontend/assets/156156862/f623e743-4b1f-4ab9-9470-e1c05de0a994)
μ½˜μ†”μ— ν•΄λ‹Ή 문ꡬ가 λ‚˜μ˜€λ©΄ μ •μƒμ μœΌλ‘œ 적용된 κ²ƒμž…λ‹ˆλ‹€.

### πŸ“ νŠΈλŸ¬λΈ”μŠˆνŒ…
- Problem
  - 개발 ν™˜κ²½μ—μ„œ Mock Service Worker (MSW)λ₯Ό μ„€μ •ν•œ ν›„, ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš© 쀑인 이미지 및 ν°νŠΈμ™€ 같은 정적 νŒŒμΌμ— λŒ€ν•œ μš”μ²­ μ‹œ κ²½κ³  λ©”μ‹œμ§€κ°€ λ°œμƒν•©λ‹ˆλ‹€.
  ```less
  [MSW] Warning: intercepted a request without a matching request handler:
    β€’ GET /src/assets/icons/bell.svg

1) 정적 파일 μš”μ²­μ„ λ¬΄μ‹œν•˜λŠ” 방법

// src/mocks/browser.ts
import { setupWorker } from 'msw/browser';
import { http, HttpResponse } from 'msw';

import { handlers } from './handlers';

export const worker = setupWorker(
  ...handlers,
  // 정적 파일 μš”μ²­μ„ λ¬΄μ‹œ
  http.get('*/:staticFile*', () => {
    return new HttpResponse();
  })
);

2) icons 파일 μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” ν•Έλ“€λŸ¬ μΆ”κ°€

// src/mocks/handlers.ts
import { http, HttpResponse } from 'msw';

export const handlers = [
  // 정적 파일 μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” ν•Έλ“€λŸ¬ μΆ”κ°€
 http.get('/src/assets/icons/:file', () => {
    return;
  }),
  http.get('https://hangeul.pstatic.net/hangeul_static/webfont/NanumSquare/:file', () => {
    return;
  }),
];

1번 정적 파일 μš”μ²­μ„ λ¬΄μ‹œν•˜λ„λ‘ ν•Έλ“€λŸ¬λ₯Ό μ„€μ •ν–ˆμœΌλ‚˜, κ²½κ³  λ©”μ‹œμ§€λŠ” 사라져도 이미지 및 폰트 νŒŒμΌμ„ κ°€μ Έμ˜€μ§€ λͺ»ν•˜μ—¬ μ œλŒ€λ‘œ νŽ˜μ΄μ§€κ°€ λ Œλ”λ§ λ˜μ§€ μ•ŠλŠ” ν˜„μƒμ΄ λ°œμƒν•˜μ˜€κ³  2번 방법은 아직 MSW의 λŒ€ν•œ ν•™μŠ΅μ΄ λΆ€μ‘±ν•˜μ—¬ μ™„λ²½νžˆ ν•΄κ²° ν–ˆλ‹€κ³  λ§μ”€λ“œλ¦¬κΈ°κ°€ 확신이 듀지 μ•Šμ•„ μΆ©λΆ„ν•œ ν•™μŠ΅ ν›„ μˆ˜μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

πŸ“ ETC

ν•΄λ‹Ή λ‚΄μš©μ€ MSW 곡식 ν™ˆνŽ˜μ΄μ§€(https://mswjs.io/docs/getting-started)λ₯Ό μ°Έκ³ ν•œ λ‚΄μš©λ“€μž…λ‹ˆλ‹€. μ•„λ¬΄λž˜λ„ κ°€μž₯ μžμ„Ένžˆ λ‚˜μ™€μžˆκΈ°μ— μ°Έκ³ λ₯Ό 많이 ν–ˆμŠ΅λ‹ˆλ‹€.

그리고 μš”μ²­ λ“œλ¦΄κ²Œ μžˆλŠ”λ°, ν•΄λ‹Ή νšŒμ› 리슀트λ₯Ό λ³΄μ—¬μ£ΌλŠ” λ‚΄μš©μ„ κ°„λ‹¨ν•˜κ²Œ λ‚˜λ§ˆ κ΅¬ν˜„ κ°€λŠ₯ν•˜λ‹€λŠ” 것을 보여주기 μœ„ν•΄μ„œ 라도 νŠΈλ ˆμ΄λ„ˆμ˜ νŠΈλ ˆμ΄λ‹ˆ 관리 λ¦¬μŠ€νŠΈμ—μ„œ 보여주고 싢은데, ν˜„μž¬ branchμ—μ„œ μž‘μ„±λœ λ‚΄μš©μ€ App.tsxμ—μ„œ λ³΄μ—¬μ§€λŠ” λ‚΄μš©μž…λ‹ˆλ‹€. 아직 νŠΈλ ˆμ΄λ‹ˆ 리슀트λ₯Ό λ³΄μ—¬μ£ΌλŠ” 화면을 κ΅¬μ„±ν•˜μ§€ μ•Šμ•„μ„œ νŠΈλ ˆμ΄λ‹ˆ 리슀트 화면을 λ§Œλ“€κ³  κ·Έ 화면에 리슀트λ₯Ό mock λ°μ΄ν„°λ‘œ μ‚½μž…ν•˜κ³  싢은데, μ–‘ν•΄ ν•΄μ£Όμ‹ λ‹€λ©΄ ν•΄λ‹Ή μ½”λ“œλŠ” λ‹€μŒ μž‘μ—…μ—μ„œ 리뷰 뢀탁 λ“œλ €λ„ 될지 λ‹΅λ³€ 뢀탁 λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

sumin-dev commented 3 months ago

MSWλŠ” μ„œλ²„ API 없이 동적인 μ›Ήμ‚¬μ΄νŠΈλ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ 정말 μ€‘μš”ν•œ κΈ°λŠ₯인데, DocsκΉŒμ§€ μ •λ¦¬ν•΄μ£Όμ…”μ„œ 큰 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€! μ„€μΉ˜ 단계뢀터 ν•Έλ“€λŸ¬ μ •μ˜, λΈŒλΌμš°μ € ν†΅ν•©κΉŒμ§€λ„ κ°œλ…κ³Ό ν•¨κ»˜ μ½”λ“œλ₯Ό 같이 λ³΄μ—¬μ£Όμ…”μ„œ 이해가 μž˜λ˜λ„€μš” πŸ‘ λ§‰μ—°ν•˜κ²Œ MSW에 λŒ€ν•΄ λͺ°λžμ„ λ•ŒλŠ” 맀우 μ–΄λ €μš΄ 기술인 쀄 μ•Œμ•˜λŠ”λ°, API ν…ŒμŠ€νŠΈμ½”λ“œ μž‘μ„±ν•˜μ‹  것을 λ³΄λ‹ˆ μ‹€μ œλ‘œ μ½”λ“œ λ‹¨μ—μ„œλŠ” λ‹€λ₯Έ 문법이 μ μš©λ˜λŠ”κ²Œ μ•„λ‹ˆλΌμ„œ ν•œλ²ˆ μ μš©μ— μ„±κ³΅ν•˜λ©΄ 이후 API 연동듀은 어렡지 μ•Šκ² κ΅°μš”!

μ •λ―Όλ‹˜κ»˜μ„œ κ²ͺμœΌμ‹  νŠΈλŸ¬λΈ”μŠˆνŒ…μ„ λ³΄λ‹ˆ λ§Žμ€ κ³ λ―Όκ³Ό μ‹œκ°„μ„ 듀인 게 λŠκ»΄μ§‘λ‹ˆλ‹€ πŸ₯Ή ν•œλ²ˆμ— μ μš©λ˜μ§€ μ•Šμ•„μ„œ μ•„μ‰¬μš°μ‹œκ² μ§€λ§Œ, μ‹€μ œ 뷰에 λ§žλŠ” mock 데이터 μž‘μ—…μ„ ν•˜λ‹€λ³΄λ©΄ 또 μƒˆλ‘œμ›€ 배움이 μžˆκ² μ§€μš”! μž‘μ—…μ΄ λλ‚˜μ§€ μ•Šμ•„μ„œ Docsλ₯Ό μž‘μ„±ν•˜κΈ° μ–΄λ €μš°μ…¨μ„ν…λ° κ³΅μœ ν•΄μ£Όμ…”μ„œ κ³ λ§™μŠ΅λ‹ˆλ‹€ μ •λ―Όλ‹˜ λ§μ”€μ²˜λŸΌ νŠΈλ ˆμ΄λ‹ˆ 관리 νŽ˜μ΄μ§€ μž‘μ—… 후에 올라올 ν•΄λ‹Ή DOCS의 νŠΈλŸ¬λΈ”μŠˆνŒ… 2κΈ°λ₯Ό 기닀리고 μžˆκ² μŠ΅λ‹ˆλ‹€ πŸ”₯

κ³ μƒλ§ŽμœΌμ…¨μŠ΅λ‹ˆλ‹€ 🧚