inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

fetch와 axios 비교

다식
1

웹 개발에서 데이터를 비동기적으로 가져오는 것은 매우 일반적인 작업이다. 이를 위해 주로 사용되는 두 가지 도구가 있는데, 바로 fetchaxios이다. 참고로 이들은 구식 브라우저에서는 지원하지 않으므로 폴리필이 필요하다.


Fetch

 

정의 :

const res = await fetch(url);

res.status;  // response 코드
res.headers;  // response 헤더

// response body
await res.json(); // JSON 문자열을 파싱해서 자바스크립트 객체로 변환함.
await res.text(); // 문자열을 그대로 가져옴.

 

fetch() 옵션

 

장점 :

단점 :

export async function getColorSurvey(id) {
  const res = await fetch(`https://www.example.com/${id}`);

  // 상태 코드에 따라 오류 메시지를 다르게 처리
  if (!res.ok) {
    if (res.status >= 400 && res.status < 500) {
      throw new Error('클라이언트 오류가 발생했습니다. 요청을 다시 확인하세요.');
    } else if (res.status >= 500) {
      throw new Error('서버 오류가 발생했습니다. 나중에 다시 시도하세요.');
    } else {
      throw new Error('알 수 없는 오류가 발생했습니다.');
    }
  }

  const data = await res.json();
  return data;
}

 


 

axios

 

정의 :

 

장점 :

axios.get('https://api.example.com/data')
  .then(response => {
    console.log(response.data); // JSON 데이터, response.json() 불필요
  })
  .catch(error => {
    console.error('Error:', error);
  });

단점 :

 

axios의 기능 3개 :

1) 인터셉터

axios의 인터셉터는 요청과 응답을 가로채고 수정할 수 있는 기능이다. 이를 통해 전역적으로 요청과 응답을 처리하거나, 특정 상황에 맞게 헤더를 추가하거나 변경할 수 있다. 예를 들어, 모든 요청에 인증 토큰을 추가하거나, 응답 데이터를 특정 형식으로 변환하는 등의 작업을 수행할 수 있다.

 

모든 요청에 대해 인증 토큰 추가하기

axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
}, error => {
  return Promise.reject(error);
});

 

응답에 대한 에러 처리하기

axios.interceptors.response.use(response => {
  // 응답이 성공인 경우
  return response;
}, error => {
  // 응답이 에러인 경우
  if (error.response.status === 401) {
    // 인증 오류 처리
  } else if (error.response.status === 404) {
    // 리소스를 찾을 수 없음 처리
  } else {
    // 기타 오류 처리
  }
  return Promise.reject(error);
});

 

요청 또는 응답에 대한 로깅

axios.interceptors.request.use(config => {
  console.log('요청 시작:', config);
  return config;
});

axios.interceptors.response.use(response => {
  console.log('응답 받음:', response);
  return response;
}, error => {
  console.error('에러 발생:', error);
  return Promise.reject(error);
});

 

2) 타임아웃

axios.get('/api/data', { timeout: 5000 })
  .then(response => {
    // 성공적으로 데이터를 받았을 때의 처리
  })
  .catch(error => {
    // 타임아웃 또는 다른 에러 처리
  });

 

3) 요청 취소 기능

const source = axios.CancelToken.source();

axios.get('/api/data', {
  cancelToken: source.token
})
.then(response => {
  // 성공적으로 데이터를 받았을 때의 처리
})
.catch(error => {
  if (axios.isCancel(error)) {
    // 요청이 취소된 경우 처리
  } else {
    // 다른 에러 처리
  }
});

// 요청 취소
source.cancel('요청이 사용자에 의해 취소되었습니다.')

웹 개발 JavaScript fetch axios

답변 0