axios에서는 api 호출시에 중복되는 코드나 기능을 생략할 수 있는 axiosinstance라는 기능이 있습니다.
이를 활용하면 코드의 유지보수성과 확장성을 얻을 수 있습니다.
axios 공식 홈페이지가 설명이 굉장히 친절하게 되어 있어서 직접 확인 하는 것도 좋습니다.
https://axios-http.com/kr/docs/intro
import axios, { InternalAxiosRequestConfig } from 'axios';
const axiosInstance = axios.create({
baseURL: 'http://localhost:3000/',
timeout: 100000,
headers: {
'content-type': 'application/json;charset=UTF-8',
accept: 'application/json,',
},
});
axiosInstance.interceptors.request.use(
(config: InternalAxiosRequestConfig<{ headers: string }>) => {
const access_token = sessionStorage.getItem('authorization');
// config.headers 초기화
config.headers = config.headers || {};
if (access_token !== null) {
config.headers['Authorization'] = `${access_token}`;
}
return config;
}
);
export default axiosInstance;
위 코드는 서버에 api호출시에 로그인을 했다면 저장된 토큰을 자동으로 전송하기 위해서 작성한 코드입니다.
이는 api호출시 request단계에서 매번 토큰을 불러오는 과정을 직접 입력할 필요가 없어지죠.
사실 axios 자체가 타입 추론이 잘되어서 별다른 코드를 작성하지 않고 타입가드 정도만 해도 정상적으로 작동합니다.
하지만 이럴 경우 any 타입으로 선언이 되기 때문에 타입스크립트의 장점이 드러나지 않습니다.
따라서 저는 제가 사용하는 토큰 전송시에만 간단하게 타입 처리를 하였습니다.

초기 config는 InternalAxiosRequestConfig 타입에 any값이 제네릭에 들어오는 것을 알 수 있습니다.
저는 이때 config 안에 있는 header를 사용하기 때문에
axiosInstance.interceptors.request.use(
(config: InternalAxiosRequestConfig<{ headers: string }>) => {
const access_token = sessionStorage.getItem('authorization');
// config.headers 초기화
config.headers = config.headers || {};
if (access_token !== null) {
config.headers['Authorization'] = `${access_token}`;
}
return config;
}
);
로 수정했습니다.
이처럼 타입 추론이 굉장히 잘 되기 때문에, 원하시는 혹은 추가하고 싶은 타입이 있다면 해당 부분에 마우스를 올려서 어떤 값이 any로 들어오고 있는지 확인하고 이를 수정하시면 됩니다.

https://velog.io/@bang9dev/axios-interceptor-with-ts 에서 타입을 굉장히 꼼꼼히 쓰신 예시를 볼 수 있는데, 참고하시는 것도 좋을 것 같습니다!
Axios 인터셉터 타입스크립트에서 제대로 쓰기
Axios 에는 interceptors 라는 기능이 있다. 이를 통해서 request/response 에 선행, 후행 처리를 커스텀하게 할 수 있다. 하지만 interceptor 를 통해서 변경된 값이 타입에 적용되지는 않는데, 이를 멋지게
velog.io
'프론트엔드' 카테고리의 다른 글
antd 라이브러리를 활용해서 공용 Modal 컴퍼넌트 만들기(상태관리)-1 (0) | 2023.08.28 |
---|---|
react 기본 브라우저 css 없애기 (0) | 2023.08.25 |
VITE 란? (0) | 2023.08.22 |
React swiper 라이브러리 사용 (0) | 2023.08.21 |
리엑트 fullCalender 라이브러리 사용 (0) | 2023.08.16 |