1️⃣ MSW 설치
npm install msw --save-dev
// MSW는 브라우저 환경에서 동작하기 위해 서비스 워커 파일이 필요합니다.
// 이 명령어는 public/mockServiceWorker.js 파일을 생성합니다.
npx msw init public/ --save
2️⃣ 환경 설정
// 서비스 워커 로딩 로직 수정
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.tsx'
import { BrowserRouter } from 'react-router-dom'
import { CookiesProvider } from 'react-cookie'
import { startMSW } from './mocks/mockStore.ts'
// MSW 활성화
async function startApp() {
// 개발 환경에서만 MSW 시작
if (process.env.NODE_ENV === 'development') {
// 서비스 워커 등록이 완료될 때까지 기다림
await startMSW()
console.log('MSW 초기화 완료, 애플리케이션 시작')
}
// 애플리케이션 렌더링
createRoot(document.getElementById('root')!).render(
<CookiesProvider>
<BrowserRouter>
<App />
</BrowserRouter>
</CookiesProvider>,
)
}
startApp()
import { testMSW } from './mocks/testStore'
function App() {
// 개발 환경에서 MSW 테스트 실행
useEffect(() => {
if (process.env.NODE_ENV === 'development') {
// MSW가 정상적으로 작동하는지 테스트
testMSW().then((success) => {
if (success) {
console.log('MSW가 올바르게 설정되었습니다.')
} else {
console.warn('MSW 설정이 올바르지 않을 수 있습니다.')
}
})
}
}, [])
return (
<>
<Fonts />
<Routes>
...
</Routes>
</>
)
}
export default App
// axios 인스턴스 생성
const apiRequester: AxiosInstance = axios.create({
// baseURL: BASE_URL as string
baseURL: process.env.NODE_ENV === 'development' ? '' : (BASE_URL as string),
timeout: 5000,
})
3️⃣ src/mocks/설정 파일 생성
// src/mocks/mockStore.ts
import { rest } from 'msw'
import { setupWorker } from 'msw'
// 방문 매장 목록 모킹 데이터
const mockVisitedStores = [
{
storeId: 1,
storeName: "오더미 부산점",
address: "부산광역시 강서구 녹산산업중로 333",
contactNumber: "031-210-5114",
businessHours: "09:00-22:00",
visitCount: 2,
lastVisitDate: "2025-05-12T23:49:25"
},
{
storeId: 2,
storeName: "오더미 서울점",
address: "서울특별시 강남구 테헤란로 212",
contactNumber: "02-3429-5114",
businessHours: "08:00-23:00",
visitCount: 15,
lastVisitDate: "2025-05-13T01:05:56"
},
{
storeId: 3,
storeName: "오더미 대구점",
address: "대구광역시 중구 동성로 123",
contactNumber: "053-123-4567",
businessHours: "10:00-21:00",
visitCount: 8,
lastVisitDate: "2025-05-10T14:30:20"
},
{
storeId: 4,
storeName: "오더미 인천점",
address: "인천광역시 연수구 송도동 123",
contactNumber: "032-987-6543",
businessHours: "09:30-22:30",
visitCount: 22,
lastVisitDate: "2025-05-09T18:15:10"
},
{
storeId: 5,
storeName: "오더미 제주점",
address: "제주특별자치도 제주시 노형동 456",
contactNumber: "064-345-6789",
businessHours: "08:30-21:30",
visitCount: 28,
lastVisitDate: "2025-05-08T11:45:30"
}
]
// API 응답 타입 정의
interface ApiResponse<T> {
status: number
success: boolean
message: string
data: T
}
// API 요청을 가로채서 모킹 응답을 반환하는 핸들러 정의
export const handlers = [
// 방문 매장 목록 조회 API
http.get('/api/stores/visited', async () => {
console.log('MSW: 방문 매장 목록 요청 가로챔')
// 500ms 지연
await new Promise((resolve) => setTimeout(resolve, 500))
return HttpResponse.json<ApiResponse<VisitedStoreInfo[]>>(
{
status: 200,
success: true,
message: '요청이 성공했습니다.',
data: mockVisitedStores,
},
{ status: 200 },
)
}),
]
// 서비스 워커 생성
export const worker = setupWorker(...handlers)
// 서비스 워커 시작 함수 (Promise 반환)
export async function startMSW(): Promise<void> {
// 개발 환경에서만 MSW 시작
if (process.env.NODE_ENV === 'development') {
try {
// onUnhandledRequest 옵션을 추가하여 모든 요청 로깅
await worker.start({
onUnhandledRequest: 'warn', // 가로채지 않은 요청에 대해 경고
serviceWorker: {
url: '/mockServiceWorker.js', // 서비스 워커 파일 경로 명시적 지정
},
})
console.log('🔶 Mock Service Worker 활성화됨')
return Promise.resolve()
} catch (error) {
console.error('MSW 시작 실패:', error)
return Promise.reject(error)
}
}
return Promise.resolve()
}
// src/mocks/testStore.ts - 테스트 콘솔 코드
/**
* MSW 디버깅 파일
* 이 파일에서는 MSW가 올바르게 설정되었는지 확인하는 테스트 함수를 제공합니다.
*/
export async function testMSW() {
try {
// 방문 매장 목록 API 테스트
console.log('MSW 테스트: 방문 매장 목록 요청 시작...')
const storesResponse = await fetch('/api/stores/visited')
const storesData = await storesResponse.json()
console.log('MSW 테스트: 방문 매장 목록 응답', storesData)
if (storesData.success && Array.isArray(storesData.data)) {
console.log('✅ MSW 테스트: 방문 매장 목록 모킹 성공!')
} else {
console.error('❌ MSW 테스트: 방문 매장 목록 모킹 실패')
}
console.log('🔶 모든 MSW 테스트 완료!')
return true
} catch (error) {
console.error('❌ MSW 테스트 실패:', error)
return false
}
}
4️⃣ 실행
1. 서비스 워커 파일을 생성합니다 (아직 없는 경우):
>> npx msw init public/ --save
2. 개발 서버를 재시작합니다:
>> npm run dev
3. 브라우저 개발자 도구 콘솔에서 MSW 관련 메시지를 확인합니다.