Axios는 node.js와 브라우저를 위한 Promise 기반 HTTP 클라이언트이다. 동일한 코드베이스로 브라우저와 node.js에서 실행할 수 있다. 서버 사이드에서는 네이티브 node.js의 http 모듈을 사용하고, 클라이언트(브라우저)에서는 XMLHttpRequests를 사용한다.
GET은 서버의 데이터를 조회할 때 사용한다. 기본적인 사용방법은 아래와 같다.
// url에는 서버의 url이 들어가고, config에는 기타 여러가지 설정을 추가할 수 있다.
// config는 axios 공식 문서에서 확인 가능하다.
axios.get(url[, config]) //GET
Axios를 사용해서 GET 요청 코드를 작성하기에 앞서, 어떤 방식으로 요청해야 할지는 우리가 사용하는 json-server의 방식을 알아야 한다.
다시 말해, Axios는 GET 요청을 할 수 있도록 도와주는 패키지일 뿐이지, '어떻게 요청을 해야하지?'와 같은 방식에 대한 확인은 우리가 사용할 API 명세서를 보아야 한다는 뜻이다.
예를 들어, GET 요청을 할 때 path variable로 해야할지, query로 보내야할지는 API를 만든 사람이 하라는 대로 해야 하기 때문이다.
json-server의 공식 문서를 보면, 전체 정보나 상세 정보는 path variable로 url을 작성해야 하고,
filter와 같은 기능을 위해서 GET요청을 할 때는 query로 보내라고 명시되어 있다.
axios.post(url[, data[, config]]) // POST
POST는 보통 서버에 데이터를 추가할 때 사용한다. 다만 post 요청에 대한 로직은 BE 개발자가 구현하는 것이기 때문에 추가 외에 다른 용도로 사용될 수 있지만, 보통은 클라이언트의 데이터를 body 형태로 서버에 보내고자 할 때 사용한다.
네트워크 쪽 개발을 할 때는 항상 브라우저에 있는 네트워크 탭을 확인하면서 개발을 진행해야 한다.
어떤 문제가 생겼을 때 이 정보를 통해 디버깅을 할 수 있기 때문이다.
DELETE는 저장되어 있는 데이터를 삭제하고자 요청을 보낼 때 사용한다.
axios.delete(url[, config]) // DELETE
PATCH는 보통 어떤 데이터를 수정하고자 서버에 요청을 보낼 때 사용하는 메서드이다. 다만, 이것은 http 환경에서 서로가 한 약속이자 문맥이기 때문에, 수정을 하고자 반드시 patch, put을 써야만 하는 것은 아니다. BE에 의한 POST를 통해서 '수정'이라는 기능은 충분히 만들 수 있기 때문이다. 다만 이러한 약속을 대부분의 개발자들이 지키고 있다.
axios.patch(url[, data[, config]]) // PATCH
.env는 API key, port, DB 등 민감한 정보를 환경변수에 담아 관리하는 방법이다.
Fetch는 ES6부터 도입된 JavaScript 내장 라이브러리이다. Promise 기반 비동기 통신 라이브러리며, axios처럼 데이터를 다루기 쉽고, 내장 라이브러리이기 때문에 별도의 설치 및 import를 필요로 하지 않는다.
하지만 다음과 같은 단점을 가진다.
CASE 1. 데이터 읽어오기
(1) fetch
const url = "https://jsonplaceholder.typicode.com/todos";
fetch(url)
.then((response) => response.json())
.then(console.log);
(2) axios
const url = "https://jsonplaceholder.typicode.com/todos";
axios.get(url).then((response) => console.log(response.data));
CASE 2. 에러 처리
(1) fetch
const url = "https://jsonplaceholder.typicode.com/todos";
fetch(url)
.then((response) => {
if (!response.ok) {
throw new Error(
`This is an HTTP error: The status is ${response.status}`
);
}
return response.json();
})
.then(console.log)
.catch((err) => {
console.log(err.message);
});
fetch의 경우, catch()가 발생하는 경우는 오직 네트워크 장애 케이스이다. 따라서 개발자가 일일히 then() 안의 모든 케이스에 대한 HTTP 에러 처리를 해야한다.
(2) axios
const url = "https://jsonplaceholder.typicode.com/todos";
axios
.get(url)
.then((response) => console.log(response.data))
.catch((err) => {
console.log(err.message);
});
const url = "https://jsonplaceholder.typicode.com/todos";
// axios 요청 로직
axios
.get(url)
.then((response) => console.log(response.data))
.catch((err) => {
// 오류 객체 내의 response가 존재한다 = 서버가 오류 응답을 주었다
if (err.response) {
const { status, config } = err.response;
// 없는 페이지
if (status === 404) {
console.log(`${config.url} not found`);
}
// 서버 오류
if (status === 500) {
console.log("Server error");
}
// 요청이 이루어졌으나 서버에서 응답이 없었을 경우
} else if (err.request) {
console.log("Error", err.message);
// 그 외 다른 에러
} else {
console.log("Error", err.message);
}
});