신규 프로젝트를 진행하기 위해 서버와 데이터를 주고받기 위해 HTTP 통신을 해야하는법을 알아야 했다.
그 중 Axios를 통해 HTTP 통신하는 방법에 대해 알고 싶어서 찾아봤다.
왜 React에서 주로 Axios를 이용해 통신하는지, HTTP 통신을 가능하게 하는 Ajax와 Fetch와 비교해보자.
React에서 promise가 async, await과 사용될 때 그 장점을 생각해보면 Ajax는 매력적이지 않다.
Fetch는 ES6부터 자바스크립트의 내장 라이브러리로 들어왔다.
코드 또한 단순하다.
fetch(url, options)
.then((response) => console.log("response:", response))
.catch((error) => console.log("error:", error));
브라우저 호환성이 떨어지고 response timeout 처리 방법이 없는 등 기능적인 부분이 상대적으로 부족하다.
그럼에도 내장 라이브러리인만큼 안정적이지 않은 프레임워크에선 유용하게 사용하기 좋다
Axios는 node.js와 브라우저를 위한 HTTP 통신 라이브러리다.
Fetch처럼 Promise를 지원한다는 공통점이 있지만 Fetch와는 달리 브라우저 호환성이 좋고 편리하며 기능이 많다.
라이브러리 설치가 필요하다는 단점(...?)이 있지만 Fetch에 비해 기능상으로 더 디테일하다는 큰 장점이 있다.
그래서 React에서 HTTP 통신을 할 때엔 주로 Axios를 이용한다. promise기반에 호환성이 좋고 디테일한 기능들을 사용할 수 있기 때문이다.
📌 나 역시 새로 진행하는 프로젝트에서 Axios를 사용한다.
Axios는 브라우저, Node.js를 위한 Promise API를 활용하는 HTTP 비동기 통신 라이브러리다.
전반적으로 axios를 통해 서버와 소통하는 과정은 아래와 같이 두 단계로 이뤄진다.
- 서버에 요청을 보내고(request)
- 서버로부터 응답이 오면(response) 제대로 응답이 왔을 때와 못 왔을 때를 구분하여 처리
서버에 요청을 보냈을 때 응답이 오기까지 시간이 걸리므로 서버에 보내는 요청은 비동기 처리를 해주며, 그 이후에 응답을 바탕으로 처리하는 과정은 .then
이나 await
를 이용한다.
전 게시물에서 설명한 HTTP 메소드 4가지를 주로 request로 사용한다.
이 네 가지 메소드를 사용하기 위해서는 아래와 같이 함께 보내야 하는 데이터가 있다.
axios({
//request
method: "get",
url: "url",
responseType: "type"
}).then(function (response) {
// response Action
});
자신이 사용하는 패키지 매니저로 프로젝트에 추가하고 사용할 파일에서 불러온다.
npm i axios
import axios from 'axios'
입력한 url에 존재하는 자원에 요청을 한다.
axios.get(url,[,config])
async function getData() {
try {
//응답 성공
const response = await axios.get('url');
console.log(response);
} catch (error) {
//응답 실패
console.error(error);
}
}
async function getData() {
try {
//응답 성공
const response = await axios.get('url',{
params:{
//url 뒤에 붙는 param id값
id: 12345
}
});
console.log(response);
} catch (error) {
//응답 실패
console.error(error);
}
}
🤔 Get이 데이터를 받아오는 것이라고 했는데, 로그인을 구현할때 GET을 사용 한 경우에는?
www.example.com/login?id=userid&pw=userpw
웹 사이트 뒤에
쿼리스트링
이 붙여진 것을 확인할 수 있다.
✔ GET은 서버에서 어떤 데이터를 가져와서 보여주는 용도다.
✔ 주소에 있는 쿼리스트링
을 활용해서 정보를 전달하는 것이지 GET은 값이나 상태 등을 바꿀 수 없다.
// example
import axios from 'axios';
axios.get('https://example.com/list').then((response)=>{
console.log(response.data);
}).catch((Error)=>{
console.log(Error);
})
[
// example
{ id: 1, pw: '1234', name: 'hello' },
{ id: 2, pw: '1234', name: 'hi' },
{ id: 3, pw: '1234', name: 'welcome' }
]
GET으로 요청해 JSON데이터로 받아온 걸 확인할 수 있다.
새로운 리소스를 생성(create)할 때 사용한다.
axios.post("url주소",{
data객체
},[,config])
post 메서드의 두 번째 인자는 본문으로 보낼 데이터를 설정한 객체 리터럴을 전달한다.
🤔 Post는 새로운 리소스를 생성할 때 사용되는데 그러면 언제 POST를 사용하는가?
✔ 로그인, 회원가입 등 사용자가 생성한 파일을 서버에다가 업로드할때 사용한다.
✔ POST를 사용하면 주소창에 쿼리스트링
이 남지 않기때문에 GET보다 안전하다.
async function postData() {
try {
//응답 성공
const response = await axios.post('url',{
//보내고자 하는 데이터
id: id,
password: password
}, { withCredentials: true, });
console.log(response);
} catch (error) {
//응답 실패
console.error(error);
}
}
Delete메서드는 HTML Form 태그에서 기본적으로 지원하는 HTTP 메서드가 아니다.
RestAPI 기반 프로그램에서 DB에 저장되어 있는 내용을 삭제하는 목적으로 사용한다.
axios.delete(URL,[,config]);
✔ 데이터베이스 내부의 데이터를 삭제하는 DELETE 메소드는 일반적으로 body가 비어있는 형태이지만, query나 params가 많아서 헤더에 많은 정보를 담기 어려운 상황에 한해서만 두번째 인자에 data를 추가한다.
async function deleteData() {
try {
//응답 성공
const response = await axios.delete('url주소');
console.log(response);
} catch (error) {
//응답 실패
console.error(error);
}
}
async function deleteData() {
try {
//응답 성공
const response = await axios.delete('url주소',{
//헤더에 포함된 정보들
data:{
post_id: 1,
comment_id: 13,
username: "foo"
}
});
console.log(response);
} catch (error) {
//응답 실패
console.error(error);
}
}
PUT메서드는 HTML Form 태그에서 기본적으로 지원하는 HTTP 메서드가 아니다.
RestAPI 기반 프로그램에서 데이터베이스에 저장되어 있는 내용을 변경 및 갱신하는 목적으로 사용된다.
axios.put(url[, data[, config]])
async function putData() {
try {
//응답 성공
const response = await axios.put('url주소',{
//항목에 새롭게 넣을 데이터
id: id,
password: password
});
console.log(response);
} catch (error) {
//응답 실패
console.error(error);
}
}