Axios - Promise 기반 HTTP 클라이언트
Axios: JavaScript HTTP 클라이언트의 표준
Axios는 Matt Zabriskie가 개발한 오픈소스 HTTP 클라이언트 라이브러리로, 브라우저와 Node.js 환경에서 모두 사용할 수 있습니다. GitHub에서 105,000개 이상의 스타를 받았으며, 가장 널리 사용되는 HTTP 클라이언트 라이브러리입니다.
HTTP 클라이언트가 필요한 이유
Fetch API의 한계
네이티브 Fetch API는 강력하지만 다음과 같은 한계가 있습니다:
- 자동 JSON 변환 없음: 응답을 수동으로 JSON으로 변환해야 함
- 에러 처리: HTTP 에러 상태 코드를 자동으로 에러로 처리하지 않음
- 요청 취소: AbortController를 직접 사용해야 함
- 인터셉터 없음: 요청/응답 가로채기 기능 없음
- 타임아웃: 직접 구현해야 함
Axios의 해결책
Axios는 이러한 문제들을 모두 해결합니다:
- 자동 JSON 변환: 요청/응답 데이터 자동 변환
- 에러 처리: HTTP 에러 상태 코드 자동 처리
- 요청 취소: 간단한 API로 요청 취소
- 인터셉터: 요청/응답 인터셉터 지원
- 타임아웃: 내장 타임아웃 지원
Axios의 핵심 기능
1. 기본 사용법
import axios from 'axios';
// GET 요청
axios.get('/api/users')
.then(response => console.log(response.data))
.catch(error => console.error(error));
// POST 요청
axios.post('/api/users', {
name: 'John',
email: 'john@example.com'
})
.then(response => console.log(response.data))
.catch(error => console.error(error));
2. 요청 메서드
// GET
axios.get('/api/users');
// POST
axios.post('/api/users', data);
// PUT
axios.put('/api/users/1', data);
// PATCH
axios.patch('/api/users/1', data);
// DELETE
axios.delete('/api/users/1');
// HEAD
axios.head('/api/users');
// OPTIONS
axios.options('/api/users');
3. 요청 설정
axios({
method: 'post',
url: '/api/users',
data: {
name: 'John',
email: 'john@example.com'
},
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token'
},
timeout: 5000,
params: {
page: 1,
limit: 10
}
});
4. 인터셉터
요청 인터셉터
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) {
// 인증 에러 처리
localStorage.removeItem('token');
window.location.href = '/login';
}
return Promise.reject(error);
}
);
5. 요청 취소
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/api/users', {
cancelToken: source.token
})
.catch(error => {
if (axios.isCancel(error)) {
console.log('Request cancelled');
}
});
// 요청 취소
source.cancel('Operation cancelled');
6. 동시 요청
// Promise.all 사용
Promise.all([
axios.get('/api/users'),
axios.get('/api/posts'),
axios.get('/api/comments')
])
.then(axios.spread((users, posts, comments) => {
console.log(users.data, posts.data, comments.data);
}));
고급 기능
1. 인스턴스 생성
const api = axios.create({
baseURL: 'https://api.example.com',
timeout: 5000,
headers: {
'Content-Type': 'application/json'
}
});
// 인스턴스 사용
api.get('/users');
api.post('/users', data);
2. 전역 설정
axios.defaults.baseURL = 'https://api.example.com';
axios.defaults.timeout = 5000;
axios.defaults.headers.common['Authorization'] = 'Bearer token';
axios.defaults.headers.post['Content-Type'] = 'application/json';
3. 에러 처리
axios.get('/api/users')
.then(response => {
console.log(response.data);
})
.catch(error => {
if (error.response) {
// 서버가 응답했지만 에러 상태 코드
console.error('Error data:', error.response.data);
console.error('Error status:', error.response.status);
console.error('Error headers:', error.response.headers);
} else if (error.request) {
// 요청이 전송되었지만 응답 없음
console.error('Error request:', error.request);
} else {
// 요청 설정 중 에러
console.error('Error message:', error.message);
}
});
4. 파일 업로드
const formData = new FormData();
formData.append('file', fileInput.files[0]);
axios.post('/api/upload', formData, {
headers: {
'Content-Type': 'multipart/form-data'
},
onUploadProgress: (progressEvent) => {
const percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
console.log(percentCompleted);
}
});
실무 활용 예시
1. API 클라이언트 래퍼
// api/client.js
import axios from 'axios';
const apiClient = axios.create({
baseURL: process.env.REACT_APP_API_URL,
timeout: 10000,
});
apiClient.interceptors.request.use(
(config) => {
const token = localStorage.getItem('token');
if (token) {
config.headers.Authorization = `Bearer ${token}`;
}
return config;
},
(error) => Promise.reject(error)
);
apiClient.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 401) {
localStorage.removeItem('token');
window.location.href = '/login';
}
return Promise.reject(error);
}
);
export default apiClient;
2. API 서비스 레이어
// api/users.js
import apiClient from './client';
export const userService = {
getAll: () => apiClient.get('/users'),
getById: (id) => apiClient.get(`/users/${id}`),
create: (data) => apiClient.post('/users', data),
update: (id, data) => apiClient.put(`/users/${id}`, data),
delete: (id) => apiClient.delete(`/users/${id}`),
};
3. React Hook과 통합
import { useState, useEffect } from 'react';
import axios from 'axios';
function useUsers() {
const [users, setUsers] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
axios.get('/api/users')
.then(response => {
setUsers(response.data);
setLoading(false);
})
.catch(error => {
setError(error);
setLoading(false);
});
}, []);
return { users, loading, error };
}
Axios의 장단점
장점
- 간단함: fetch API보다 더 간단한 사용법
- 기능: 풍부한 기능 제공
- 호환성: 브라우저와 Node.js 모두 지원
- 인터셉터: 요청/응답 가로채기 기능
- 에러 처리: 명확한 에러 응답
- 커뮤니티: 활발한 커뮤니티와 지원
단점
- 번들 크기: 추가적인 라이브러리로 인한 번들 크기 증가
- 의존성: 외부 라이브러리 의존
fetch API와의 비교
Axios가 더 나은 경우
- 자동 JSON 변환이 필요한 경우
- 인터셉터가 필요한 경우
- 요청 취소가 중요한 경우
- 더 나은 에러 처리가 필요한 경우
fetch가 더 나은 경우
- 번들 크기를 최소화해야 하는 경우
- 네이티브 API만 사용하고 싶은 경우
- 간단한 요청만 필요한 경우
결론
Axios는 JavaScript 애플리케이션에서 HTTP 요청을 처리하는 표준 라이브러리입니다. 간단한 API와 강력한 기능으로, 개발자가 API 호출을 효율적으로 처리할 수 있게 해줍니다.
특히 인터셉터를 통한 인증 처리, 자동 JSON 변환, 명확한 에러 처리 등은 개발 생산성을 크게 향상시킵니다. 브라우저와 Node.js 모두에서 동일한 API를 사용할 수 있어, 풀스택 JavaScript 개발에 이상적입니다.
대부분의 프로젝트에서 Axios를 사용하는 것이 좋은 선택입니다. 한번 익히면 HTTP 요청 처리가 훨씬 쉬워지고, 유지보수도 간단해집니다.
Axios의 진화와 미래
Axios는 2014년 Matt Zabriskie에 의해 처음 공개된 이후 지속적으로 발전해왔습니다. 초기에는 간단한 HTTP 클라이언트였지만, 현재는 인터셉터, 요청 취소, 자동 요청 재시도 등 고급 기능을 제공합니다.
특히 주목할 만한 것은 Axios의 생태계 확장입니다. Axios는 다양한 환경에서 사용할 수 있으며, TypeScript 지원도 완벽합니다. 또한 많은 라이브러리와 프레임워크에서 Axios를 기본 HTTP 클라이언트로 권장하고 있습니다.
실무에서의 Axios 활용 전략
실무에서 Axios를 효과적으로 사용하기 위해서는 몇 가지 전략이 필요합니다. 첫째, 인스턴스를 생성하여 재사용하는 것입니다. baseURL, timeout, headers 등을 설정하여 일관된 API 클라이언트를 만듭니다. 둘째, 인터셉터를 활용하는 것입니다. 요청 인터셉터에서 인증 토큰을 추가하고, 응답 인터셉터에서 에러를 처리합니다.
셋째, 에러 처리를 중앙화하는 것입니다. 인터셉터에서 공통 에러 처리 로직을 구현하여 코드 중복을 방지합니다. 넷째, 요청 취소를 활용하는 것입니다. 컴포넌트가 언마운트될 때 진행 중인 요청을 취소하여 메모리 누수를 방지합니다.
Axios와 다른 HTTP 클라이언트와의 비교
Axios는 다른 HTTP 클라이언트와 비교했을 때 독특한 특징을 가지고 있습니다. Fetch API와 비교하면, Axios는 더 간단한 API와 더 많은 기능을 제공하지만, Fetch는 네이티브 API입니다. node-fetch와 비교하면, Axios는 브라우저와 Node.js 모두에서 동일한 API를 제공합니다.
Superagent와 비교하면, Axios는 더 널리 사용되고 더 큰 커뮤니티를 가지고 있습니다. Got와 비교하면, Axios는 더 간단하지만, Got는 Node.js에 특화된 더 많은 기능을 제공합니다.
Axios 학습 로드맵
Axios를 처음 배우는 개발자라면, 단계별로 학습하는 것이 좋습니다. 첫 번째 단계는 기본 사용법을 이해하는 것입니다. get, post, put, delete 메서드를 사용하여 HTTP 요청을 보내는 방법을 익혀야 합니다. 두 번째 단계는 요청 설정을 학습하는 것입니다. headers, params, data 등을 설정하는 방법을 배워야 합니다.
세 번째 단계는 인터셉터를 이해하는 것입니다. 요청과 응답 인터셉터를 사용하여 공통 로직을 처리하는 방법을 익혀야 합니다. 네 번째 단계는 에러 처리를 학습하는 것입니다. try-catch와 인터셉터를 사용하여 에러를 처리하는 방법을 배워야 합니다.
다섯 번째 단계는 고급 기능을 학습하는 것입니다. 요청 취소, 동시 요청, 요청 변환 등을 사용하여 더 복잡한 시나리오를 처리하는 방법을 익혀야 합니다.
Axios 생태계와 도구들
Axios 생태계는 다양한 도구들로 구성되어 있습니다. Axios는 다양한 환경에서 사용할 수 있으며, TypeScript 지원도 완벽합니다. 또한 많은 라이브러리와 프레임워크에서 Axios를 기본 HTTP 클라이언트로 권장하고 있습니다.
Axios의 성능과 최적화
Axios의 성능 최적화는 여러 측면에서 고려해야 합니다. 첫째, 요청을 최적화하는 것입니다. 불필요한 요청을 제거하고, 요청을 배치하여 네트워크 오버헤드를 줄입니다. 둘째, 캐싱을 활용하는 것입니다. 자주 사용되는 데이터를 캐싱하여 서버 부하를 줄입니다.
셋째, 요청 취소를 활용하는 것입니다. 진행 중인 요청을 취소하여 불필요한 네트워크 트래픽을 방지합니다. 넷째, 타임아웃을 설정하는 것입니다. 적절한 타임아웃을 설정하여 무한 대기를 방지합니다.
Axios의 실제 사용 사례
많은 기업들이 Axios를 프로덕션 환경에서 사용하고 있습니다. GitHub의 많은 오픈소스 프로젝트에서 Axios를 사용하고 있으며, 많은 스타트업과 기업들이 Axios를 사용하여 API 통신을 구현하고 있습니다.
결론: Axios의 가치와 미래
Axios는 JavaScript 애플리케이션에서 HTTP 요청을 처리하는 표준 라이브러리입니다. 간단한 API와 강력한 기능으로, 개발자가 API 호출을 효율적으로 처리할 수 있게 해줍니다. 특히 인터셉터를 통한 인증 처리, 자동 JSON 변환, 명확한 에러 처리 등은 개발 생산성을 크게 향상시킵니다.
앞으로도 Axios는 계속 발전할 것입니다. 더 나은 성능, 더 강력한 기능, 더 나은 개발자 경험을 제공할 것입니다. Axios는 단순한 HTTP 클라이언트를 넘어, 현대적인 JavaScript 애플리케이션 개발 방법론의 핵심이 되었습니다.
개발자라면 Axios를 배워두는 것이 좋습니다. 한번 익히면 다양한 프로젝트에서 활용할 수 있으며, HTTP 요청을 효율적으로 처리하는 데 도움이 됩니다. Axios는 JavaScript 개발자에게 필수적인 도구이며, 지금 배우는 것이 가장 좋은 시기입니다.
최종적으로, Axios는 대부분의 프로젝트에서 사용하는 것이 좋은 선택입니다. 간단한 API와 강력한 기능이 제공하는 편의성은 어떤 프로젝트에서도 가치 있는 투자입니다. Axios를 배우고 활용하는 것은 개발자로서의 역량을 높이는 중요한 단계입니다.