Installation
API Generator를 사용하기 위해선 instance.ts
파일이 필요합니다.
1. 자동 생성
- pnpm
- npm
- yarn
pnpm mash-up-web
npx mash-up-web
package.json 스크립트 추가
{
"scripts": {
...
"mash-up-web": "node .node_modules/.bin/mash-up-web"
}
...
}
yarn mash-up-web
Instance 파일 생성
CLI를 실행하면 다음과 같은 메뉴가 나타납니다:
? 명령을 선택해주세요. (Use arrow keys)
gen:config
❯ gen:api-config
gen:api
- **
gen:api-config
**를 선택하세요.
다음으로 사용할 HTTP 클라이언트 타입을 선택합니다:
? HTTP 클라이언트를 선택해주세요 (Use arrow keys)
❯ fetch
axios
instance.ts
파일이 생성됩니다.
info
자동생성 경로는 src/config/__generated__/{fetch 또는 axios}/instance.ts
입니다.
2. 수동 생성
원하는 경로에 instance.ts
파일을 생성합니다.
fetch
instance.ts
/**
* 인터셉터 처리를 위한 핸들러 함수
*/
let requestInterceptor: ((config: RequestInit) => RequestInit) | null = null;
let responseInterceptor: ((response: Response) => Response) | null = null;
/**
* fetch API를 확장한 커스텀 함수
* 요청/응답 인터셉터 기능 제공
*/
const customFetch = async (
input: RequestInfo | URL,
init?: RequestInit
): Promise<Response> => {
try {
// 요청 전 인터셉터 적용
let config = init || {};
if (requestInterceptor) {
config = requestInterceptor(config);
}
// 실제 fetch 요청 실행
const response = await fetch(input, config);
// 응답 후 인터셉터 적용
if (responseInterceptor) {
return responseInterceptor(response);
}
return response;
} catch (error) {
return Promise.reject(error);
}
};
/**
* 인터셉터 설정 인터페이스
*/
const interceptors = {
request: {
use: (handler: (config: RequestInit) => RequestInit) => {
requestInterceptor = handler;
},
},
response: {
use: (handler: (response: Response) => Response) => {
responseInterceptor = handler;
},
},
};
// 요청 인터셉터 설정
interceptors.request.use(config => {
return {
...config,
headers: {
...config.headers,
// 필요한 헤더 추가
// 예: "Content-Type": "application/json",
},
};
});
// 응답 인터셉터 설정
interceptors.response.use(response => {
return response;
});
Object.assign(customFetch, { interceptors });
export default customFetch;
axios
instance.ts
import axios, { AxiosError } from 'axios';
const instance = axios.create({
// baseURL을 작성해주세요.
baseURL: '',
});
/**
* 요청 인터셉터
*/
instance.interceptors.request.use(
async config => {
return config;
},
error => {
return Promise.reject(error);
}
);
/**
* 응답 인터셉터
*/
instance.interceptors.response.use(
res => {
return res;
},
async (error: AxiosError) => {
try {
return Promise.reject(error);
} catch (e) {
return Promise.reject(e);
}
}
);
export default instance;