AJAX는 Asynchronous JavaScript and XML의 약자로 JS와 XMLHttpRequest 객체를 이용하여 비동기적으로 정보를 교환하는 방법, 기술이다.
XMLHttpRequest 이라고는 하나 다른 데이터 객체도 사용가능해서 요즘은 대부분 JSON을 다룬다.
(비동기적 : 어떤 작업을 요청했을 때 그 작업이 종료될때 까지 기다리지 않고 다른 작업을 하고 있다가, 요청했던 작업이 종료되면 그에 대한 추가 작업을 수행하는 방식)
쉽게 말해 JS를 통해 새로고침 없이 서버에 데이터를 비동기 방식으로 요청하는 것이다.
전통적인 웹 사이트는 지금보다 문서 하나에 전달되는 파일의 용량이 적었다. 그래서 어떤 요소를 클릭하면 완전히 새로운 페이지를 서버에서 전송해주었고 그래도 상관이 없었지만 현대에 이르러 웹 사이트가 고도화됨에 따라 한 페이지에 해당하는 용량이 커졌고 매번 새로운 페이지를 전달하는 것이 버거워지게 된다.(서버 사이드 렌더링) 이러한 문제를 해결하기 위해 나온것이 SPA이다.
Single Page Application으로 서버로부터 완전한 새로운 페이지를 불러오지 않고 현재의 페이지를 동적으로 다시 작성한다. 렌더링의 역할을 서버에 넘기지 않고 브라우저에서 처리한다. 웹 애플리케이션에 필요한 모든 정적 리소스를 최초에 한번 다운로드 하고, 이후 새로운 페이지 요청 시 페이지 갱신에 필요한 데이터만을 전달 받는다.
AJAX는 서버와 비동기적으로 데이터를 주고받는 JS 기술이며
이를 통해 클라이언트는 필요한 데이터만을 비동기적으로 받고, 페이지의 일부만 동적으로 업데이트 할 수 있다. SPA를 만드는데 막강한 기술이다.
클라이언트의 관점에서 요약하면 이러하다.
비동기 요청을 좀 더 쓰기 편하게 해주는 api로 Promise 기반이고 JS에 내장되어 있다.
fetch(URI, option)
.then(responce => responce.json())
.then(json => console.log(json));
fetch(URI)
.then((response) => response.json())
.then((data) => console.log(data))
fetch는 default로 get 방식으로 작동한다. 옵션인자 필요 없다.
fetch(URI , {
method: "POST", // POST
headers: { // 헤더 조작
"Content-Type": "application/json",
},
body: JSON.stringify({ // 자바스크립트 객체를 json화 한다.
title: "Test",
body: "I am testing!",
userId: 1,
}),
})
.then((response) => response.json())
.then((data) => console.log(data))
새로운 포스트 생성 위해서는 method 옵션을 POST로 지정해주고, headers 옵션으로 JSON 포맷 사용한다고 알려줘야 한다. body 옵션에는 요청 데이터를 JSON 포맷으로 넣어줬다.
fetch(URI , {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Test"
}),
})
.then((response) => response.json())
.then((data) => console.log(data))
관리하는 데이터의 수정, 전체를 body의 데이터로 교체해버린다. post방식과 비슷하다.
fetch(URI , {
method: "PATCH",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
title: "Test"
}),
})
.then((response) => response.json())
.then((data) => console.log(data))
존재하는 자원 일부만 변경한다.
fetch(URI , {
method: "DELETE",
})
.then((response) => response.json())
.then((data) => console.log(data))
삭제 요청, 보낼 데이터가 없기 문에 headers, body 옵션이 필요없다.
fetch API와 마찬가지로 Promise를 활용하는 비동기 통신 라이브러리이다. 프레임워크에서 ajax를 구현할때 주로 axios를 쓰는편이다.
axios 설치
npm install axios --save
문법 구성
axios({
url: 'https://test/api/cafe/list/today',
method: 'post',
data: {
foo: 'diary'
}
});
이렇게도 가능하고
axios.post('https://test/api/cafe/list/today', {
foo : 'diary'
});
이렇게도 가능하다. (단축 메서드)
통신할 주소, 방법, 보낼 데이터 등을 넣는다.
status
는 서버 응답의 HTTP 상태 코드statusText
는 서버 응답으로 부터의 HTTP 상태 메시지headers
서버가 응답 한 헤더는 모든 헤더 이름이 소문자로 제공config
는 요청에 대해 axios
에 설정된 구성(config)request
는 응답을 생성한 요청기존 방식에서 떨어지는 가독성을 보환하는 방식이다.
get 요청은 크게 두가지로 분류된다.
1. 단순 데이터 요청
2. 파라미터 데이터를 포함시키는 경우 (조건에 맞는 조회)
// 1.
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
});
// 2.
axios.get('/user', {
params: {
ID: 12345
}
})
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
.finally(function () {
});
1번 url에 추가된 정보를 따로 분리한것이 2번이고 params 요청 옵션을 사용했다.
데이터를 저장한다.
axios.post("url", {
email : 'abc@naver.com',
password : password,
})
.then(function (response) {
}).catch(function (error) {
})
넘길 데이터를 두번째 인자로
axios.delete('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
})
delete 메서드에는 일반적으로 body가 비어있다.
데이터베이스에 저장되어 있는 내용을 삭제하는 목적으로 사용한다.
axios.put("url", {
username: "",
password: ""
})
.then(function (response) {
}).catch(function (error) {
})
데이터베이스에 저장되어 있는 내용을 갱신(수정)하는 목적으로 사용된다. put 메서드는 서버 내부적으로 get->post 과정을 거치기에 post메서드와 비슷한 형태이다.
그동안 그냥 해왔던 것을 이해하고 정리했다. 모르거나 애매한 것들은 꾸준히 찾아서 정리해야겠다. 리액트 프로젝트를 주로 할 것이기 때문에 axios를 많이 사용하게 될 것 같다.