250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

y.developer

[TIL] Day 44 axios, fetch 그리고 instance, interceptors 본문

카테고리 없음

[TIL] Day 44 axios, fetch 그리고 instance, interceptors

y.developer 2023. 12. 5. 12:59
728x90

2023.12.05 화

 

1. fetch와 axios

- HTTP 요청을 처리하기 위한 도구
- fetch와 axios는 모두 HTTP 요청을 처리하기 위한 JavaScript 라이브러리이다.
- GET, POST, PUT, PATCH, DELETE

 


2. React에서 axios를 fetch보다 선호하는 이유

- 자동 JSON 변환

axios는 응답을 자동으로 JSON으로 변환한다.

반면, fetch를 사용할 때는 응답을 JSON으로 수동 변환해야 한다.

 

- 요청 취소

axios는 요청 취소 기능을 제공한다. 이는 특정 조건 하에서 API 호출을 중단할 수 있게 해준다.

fetch는 기본적으로 이 기능을 제공하지 않는다.

 

- 타임아웃 설정

axios를 사용하면 요청에 대한 타임아웃을 설정할 수 있다. 이는 서버 응답이 너무 오래 걸릴 때 유용하다.

fetch는 기본적으로 이 기능을 제공하지 않는다.

 

- 에러 처리

axios는 네트워크 오류가 발생했거나 서버가 2xx 범위가 아닌 상태 코드를 반환했을 때 에러를 발생시킨다.

fetch는 네트워크 오류 시에만 예외를 발생시키고, HTTP 오류 상태에 대해서는 예외를 발생시키지 않는다.

 

- 인터셉터

axios는 요청과 응답을 인터셉트할 수 있는 기능을 제공한다. 이를 통해 전역적으로 요청 또는 응답을 처리하거나 수정할 수 있다.

 

 

3. 하지만 꼭 axios만이 유일한 정답이라고 할 수는 없다.

물론 이러한 장점에도 불구하고,

fetch는 더 가볍고 브라우저에 내장된 기능을 사용하기 때문에 간단한 요청에는 더 적합할 수 있다.
프로젝트의 요구 사항과 개발 환경에 따라 더 적합한 도구를 선택하는 것이 중요하다.

 

 

4. 심화 기술로 가장 기억해야 할 내용 2개 ⇒ instance, interceptors

- 인스턴스 instance

프로그래밍 세계에서 instance는 보통 객체를 의미하곤 한다.

key, value를 지정할 수 있는 객체의 특징 때문인지 정말 많은 경우 데이터는 객체 형태로 주고받는다.

또한 주요 라이브러리 등도 객체 형태로 우리가 선언 또는 import 후 사용한다.

특히 axios에서 instance는 단순히 해당 코드로 가져온 객체일 뿐이다.

import axios from 'axios';

이를 우리의 입맛대로 가공한 custom instance를 사용하면 반복적인 코드를 작성할 필요 없이 편한 것이다.
아래 코드가 여러 군데에서 사용된다고 하면 너무 많은 줄을 작성해야 한다.

/** 많은 코드 계속 작성 */
const handle01ButtonClick = async () => {
	axios.get('https://api.example.com/data/sample01', {
	  timeout: 1000 // 1000ms 후에 타임아웃
	})
	.then(response => {
	  console.log(response);
	})
	.catch(error => {
	  console.log('Timeout or other error:', error);
	});
}

const handle01ButtonClick = async () => {
	axios.get('https://api.example.com/data/sample02', {
	  timeout: 1000 // 1000ms 후에 타임아웃
	})
	.then(response => {
	  console.log(response);
	})
	.catch(error => {
	  console.log('Timeout or other error:', error);
	});
}

하지만, custom instance를 사용하게 된다면

import axios from 'axios';

// 공통 설정을 가진 Axios 인스턴스 생성
const apiInstance = axios.create({
  baseURL: 'https://api.example.com/data/',
  timeout: 1000, // 모든 요청에 대해 1000ms 후 타임아웃
});

// 간결화된 핸들러 함수
const handleButtonClick = async (sampleNumber) => {
  try {
    const response = await apiInstance.get(`sample0${sampleNumber}`);
    console.log(response);
  } catch (error) {
    console.log('Timeout or other error:', error);
  }
}

// 사용 예시
// handleButtonClick(1); // 첫 번째 버튼 클릭
// handleButtonClick(2); // 두 번째 버튼 클릭

 

 

- 인터셉터 interceptors

위에서 만든 axios instance를 interceptors를 사용할 수도 있다.

프로그래밍 세계에서 ‘인터셉터’는 보통 아래 그림을 의미한다.

 

코드로 살펴보자면, 이렇게 된다.

import axios from 'axios';

// Axios 인스턴스 생성
const api = axios.create({
  baseURL: 'https://api.example.com'
});

// 요청 인터셉터 추가
api.interceptors.request.use(
  config => {
    // 요청을 보내기 전에 수행할 작업
    console.log('Request sent at:', new Date().toISOString());
    // 예: 인증 토큰이 필요한 경우 헤더에 추가
    const token = localStorage.getItem('authToken');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  error => {
    // 요청 오류 처리
    console.log('Request error:', error);
    return Promise.reject(error);
  }
);

// 응답 인터셉터 추가
api.interceptors.response.use(
  response => {
    // 응답 데이터를 가공
    console.log('Response received at:', new Date().toISOString());
    return response;
  },
  error => {
    // 응답 오류 처리
    if (error.response && error.response.status === 401) {
      console.log('Unauthorized access:', error);
      // 예: 로그인 페이지로 리디렉트
    }
    return Promise.reject(error);
  }
);

export default api;

 

 

 


하루를 마치며

axios가 더 편하고 범용적으로 사용된다는 것은 알았지만, 이렇게 디테일한 차이점이 있는지 몰랐다. axios가 장점이 많지만 그렇다고 해서 fetch 무조건 안 좋다는 것도 아니라는 사실. fetch가 사용하기에 더 가볍고 브라우저에 내장된 기능이기 때문에 간단한 요청을 할 때는 axios처럼 별도의 설치 없이 사용할 수 있다는 점도 알게 되었다.

동일한 코드의 반복을 최대한 줄일 수 있게 해주는 istance와 interceptors를 통해서 효율적인 코드를 작성할 수 있을 것이다. 비동기 데이터를 마음대로 다루고 요청과 응답을 자유자재로 할 수 있도록 공부해야겠다.

 

 

오늘의 한 줄
장단점은 늘 공존한다.
단점을 받아들이고 장점을 극대화하자

 

 

728x90