
AJAX๋?
- JavaScript๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ํต์
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ XML, JSON ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ธฐ์ ์ด๋ค.
- AJAX๋ ๊ธฐ์ ์์ฒด๋ฅผ ๋ปํ๊ธฐ ๋ณด๋จ, HTML, XHTML, CSS, JavaScript, DOM, XML, XSLT, XMLHttpRequest ์ค๋ธ์ ํธ๋ค์ด ์กฐํฉํ ๊ธฐ์ ์ ์ด์นญ์ ์ผ์ปซ๋๋ค.
- XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ด์ฉํด์, ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ํ์ด์ง์ ์ผ๋ถ๋ง์ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๊ธฐ๋ฒ์ด๋ค.
- AJAX(Asynchronous JavaScript and XML)์ X๋ XML์ ๋ปํ์ง๋ง, JSON์ด ๋ ๊ฐ๋ณ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค๋ธ์ ํธ๋ก ์ฝ๊ฒ ๋ณํ๋๋ค๋ ์ ๋๋ฌธ์ XML ๋ณด๋ค ๋ง์ด ์ฌ์ฉ๋๋ค.
AJAX๋ฅผ ์ฌ์ฉํ๋ ์ด์
- ํ๋ฉด์์ ๋ฌด์ธ๊ฐ ๋ถ๋ฅด๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ํ์ด์ง ์ ์ฒด๋ฅผ ์๋ก๊ณ ์นจํ์ง ์๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- HTTP ํ๋กํ ์ฝ์ ํด๋ผ์ด์ธํธ์ชฝ์์ Request๋ฅผ ๋ณด๋ด๊ณ ์๋ฒ์ชฝ์์ Response๋ฅผ ๋ฐ์ผ๋ฉด ์ด์ด์ก๋ ์ฐ๊ฒฐ์ด ๋๊ธฐ๊ฒ ๋์ด์๋ค. ๊ทธ๋์ ํ๋ฉด์ ๋ด์ฉ์ ๊ฐฑ์ ํ๊ธฐ ์ํด์๋ ๋ค์ request๋ฅผ ํ๊ณ response๋ฅผ ํ๋ฉฐ ํ์ด์ง ์ ์ฒด๋ฅผ ๊ฐฑ์ ํ๊ฒ ๋๋ฉฐ, ์ด๋ ์์ฒญ๋ ์์๋ญ๋น์ ์๊ฐ๋ญ๋น๋ฅผ ์ด๋ํ๊ณ ๋ง ๊ฒ์ด๋ค.
- ํ์ง๋ง XMLHttpRequest ๊ฐ์ฒด๋ฅผ ํตํด ์๋ฒ์ request ํ๋ ๊ฒฝ์ฐ, JSON์ด๋ XMLํํ๋ก ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ์ ๊ฐฑ์ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋งํผ์ ์์๊ณผ ์๊ฐ์ ์๋ ์ ์๋ค.
AJAX์ ์ฅ์
- ์น ํ์ด์ง์ ์๋ ํฅ์
- ์๋ฒ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
- ์๋ฒ์์ Data๋ง ์ ์กํ๋ฉด ๋๋ฏ๋ก ์ ์ฒด์ ์ธ ์ฝ๋ฉ์ ์์ด ์ค์ด๋ ๋ค.
- ๊ธฐ์กด ์น์์๋ ๋ถ๊ฐ๋ฅํ๋ ๋ค์ํ UI๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. (์ฌ์ง์ ์ ๋ชฉ์ด๋ ํ๊ทธ๋ฅผ ํ์ด์ง์ ๋ฆฌ๋ก๋ ์์ด ์์ ๊ฐ๋ฅ)
AJAX์ ๋จ์
- ํ์คํ ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๋์ง ์๋๋ค.
- ํ์ด์ง ์ด๋์๋ ํต์ ์ผ๋ก ์ธํ ๋ณด์์์ ๋ฌธ์ ๊ฐ ์๋ค.
- XMLHttpRequest๋ฅผ ํตํด ํต์ ํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์์๊ฒ ์๋ฌด๋ฐ ์งํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง์ง ์๋๋ค.
= ์์ฒญ์ด ์๋ฃ๋์ง ์์๋๋ฐ ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ๋ ๋๊ฑฐ๋ ์ค์๋ํ ์ฐ๋ ค๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. - HTTP ํด๋ผ์ด์ธํธ์ ๊ธฐ๋ฅ์ด ํ์ ๋์ด ์๋ค.
- AJAX๋ฅผ ์ธ ์ ์๋ ๋ธ๋ผ์ฐ์ ์ ๋ํ ๋ฌธ์ ์ด์๊ฐ ์๋ค.
- Script๋ก ์์ฑ๋๋ฏ๋ก ๋๋ฒ๊น ์ด ์ฉ์ดํ์ง ์๋ค.
- ๋์ผ-์ถ์ฒ ์ ์ฑ ์ผ๋ก ์ธํ์ฌ ๋ค๋ฅธ ๋๋ฉ์ธ๊ณผ๋ ํต์ ์ด ๋ถ๊ฐ๋ฅํ๋ค. (Cross-Domain๋ฌธ์ )
XMLHttpRequest API์ธ Axios์ Fetch ์๊ฐ

๋น๋๊ธฐ ํต์ ์ ๋ชฉ์
1) ํ์ด์ง๋ฅผ ๋ฆฌ๋ก๋ฉํ์ง ์๊ณ ์ปจํ
์ธ ๋ง ๋ฐ๋๊ฒ ํ๊ธฐ์ํด API ํต์ ์ ํ๋ค.
2) API๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๋๋๋ง ์์ด ์ปจํธ๋กค๋ฌ๋ก๋ง์ผ๋ก๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ ํ ์ ์๋ค.
fetch
1) ์๊ฒฉ API๋ฅผ ๊ฐํธํ๊ฒ ํธ์ถํ๋ Built-in API๋ก ๋ณ๋์ ์ค์น ์์ด ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ ์ ์๋ ํจ์์ด๋ค.
2) window ๊ฐ์ฒด์ ์ ์๋์ด ์์ผ๋ฉฐ, HTTP Pipeline(Request/Response)๋ฅผ ์ํ Javascript Interface์ด๋ค.
fetch ํ์ ๊ณผ์
1. ํด๋ผ์ด์ธํธ ๋จ์์ ์ง์ http์์ฒญ ์๋ต๋ฐ๋ ๊ณผ์ ์ ๋งค์ฐ ๋ณต์กํ๋ค.
2. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์์ ๋ฐ์ผ๋ฉด ๋ฒ๋ค๋ฌ ํฌ๊ธฐ ๊ฐ์ค๋๋ค.
3. ๋ด์ฅํจ์ fetch ๋ฑ์ฅ
fetch('URL' [, OptionObj]) => Promise
fetch ํจ์์ ๋ฆฌํด ๊ฐ์ Promise๊ฐ์ฒด๋ค.
API ํธ์ถ์ด ์ฑ๊ณตํ์ ๊ฒฝ์ฐ์๋ ์๋ต(response) ๊ฐ์ฒด๋ฅผ resolveํ๊ณ , ์คํจํ์ ๊ฒฝ์ฐ์๋ error ๊ฐ์ฒด๋ฅผ rejectํ๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1').then((response) =>
console.log(response)
);
// Response {status: 200, ok: true, redirected: false, type: "cors",
1) GET ํธ์ถ
๋๋ถ๋ถ์ REST API๋ค์ JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ ์๋ตํ๋ค. ์๋ต(response) ๊ฐ์ฒด๋ json() ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํตํด JSON ํฌ๋ฉง์ ์๋ต ์ ๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ป์ ์ ์๋ค.
fetch('https://jsonplaceholder.typicode.com/posts/1')
.then((response) => response.json())
.then((data) => console.log(data));
// { "userId": 1, "id": 1, "title": "hi"}
2) POST ํธ์ถ
์๊ฒฉ API์์ ๊ด๋ฆฌํ๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํด์ผ ํ๋ค๋ฉด, ์์ฒญ ์ ๋ฌธ(๋ณด๋ผ ๋ด์ฉ, req.body์ ๋ค์ด๊ฐ ๋ด์ฉ) ํฌํจํ ์ ์๋ POST ๋ฐฉ์์ HTTP ํต์ ์ด ํ์ํ๋ค.
1) method ์ต์
์ POST๋ก ์ง์ ํด์ฃผ๊ณ ,
2) headers ์ต์
์ ํตํด JSON ํฌ๋ฉง์ ์ฌ์ฉํ๋ค๊ณ ์๋ ค์ค์ผ ํ๋ฉฐ,
3) body ์ต์
์ ์์ฒญ ์ ๋ฌธ์ JSON ํฌ๋ฉง์ผ๋ก ์ง๋ ฌํํ์ฌ ์ค์ ํด์ค๋ค.
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: 'Test', body: 'I am testing!', userId: 1 }),
}).then((response) => console.log(response));
// Response {
// type: "cors",
// url: "https://jsonplaceholder.typicode.com/posts",
// redirected: false, status: 201, ok: true,
// … }
์๋ต ๊ฐ์ฒด์ json() ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์๋ต ์ ๋ฌธ์ ๊ฐ์ฒด ํํ๋ก ์ป์ ์ ์๋ค.
fetch('https://jsonplaceholder.typicode.com/posts', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: 'Test', body: 'I am testing!', userId: 1 }),
})
.then((response) => response.json())
.then((data) => console.log(data));
// {title: "Test", body: "I am testing!", userId: 1, id: 101}
Node ์ฝ๋ ์์
videoPlayer.addEventListener("ended", ()=>registerView());
const registerView = () => {
const videoId = window.location.href.split("/videos/")[1];
fetch(`/api/${videoId}/view`, { method: "POST", }
}
apiRouter.post(routes.registerView, postRegisterView);
const postRegisterView = async (req, res) => {
const {
params: { id },
} = req;
try {
const video = await Video.findById(id);
video.views += 1;
video.save();
res.status(200);
} catch (error) {
res.status(400);
} finally {
res.end();
}
};
[๋ณด๋์ค] ์ฌ์ฉ์ฑ ๊ฐ์
fetch() ํจ์๋ ์ฌ์ฉ๋ฒ์ด ์์ฃผ ๊ฐ๋จํ์ง๋ง, ๊ณ์ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๋๊ฐ์ ์ฝ๋๊ฐ ๋ฐ๋ณต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด์ response.json()์ ๋งค๋ฒ ํธ์ถํ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋, HTTP ์์ฒญ ํค๋์ "Content-Type": "application/json"๋ก ์ค์ ํด์ฃผ๋ ๋ถ๋ถ์ ์ง๋ฃจํ๊ฒ ๋๊ปด์ง ์ ์๋ค. ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋น๊ตํด๋ดค์ ๋, fetch() ํจ์์ Promise ๊ธฐ๋ฐ์ API๊ฐ ์ข ํฌ๋ฐํ๋ค๊ณ ๋๋ ์ ์๋ค.
์ด๋ด ๋๋ fetch() ํจ์๋ฅผ ์ง์ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋, ๋ณธ์ธ ์
๋ง์ ๋ง๊ฒ ๋ณ๋์ ํจ์๋ ๋ชจ๋๋ก ๋นผ์ ์ฌ์ฉํ์๊ธฐ๋ฅผ ์ถ์ฒํ๋ค. ๋๊ฐ์ ๊ฒฝ์ฐ์๋ ํ๋ก์ ํธ์ ์ํฉ์ ๋ง๊ฒ ๋ค์๊ณผ ๊ฐ์ด async/await ํค์๋๋ฅผ ์ด์ฉํ์ฌ HTTP ๋ฐฉ์๋ณ๋ก ๋น๋๊ธฐ ํจ์๋ฅผ ์์ฑํ๊ณ ๋ชจ๋ํํ์ฌ ์ฌ์ฉํ๊ณค ํ๋ค.
async function post(host, path, body, headers = {}) {
const url = `https://${host}/${path}`;
const options = {
method: 'POST',
headers: { 'Content-Type': 'application/json', ...headers },
body: JSON.stringify(body),
};
const res = await fetch(url, options);
const data = await res.json();
if (res.ok) {
return data;
} else {
throw Error(data);
}
}
post('jsonplaceholder.typicode.com', 'posts', {
title: 'Test',
body: 'I am testing!',
userId: 1,
})
.then((data) => console.log(data))
.catch((error) => console.log(error));
์ด ๋ฐฉ๋ฒ์ผ๋ก API ํธ์ถํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์์๋ง ๊ฐ๋ฅํ์ง๋ง, Node.js ํ๊ฒฝ์์๋ node-fetch๋ unfetch์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค. ์ธํฐ๋ท ์ต์คํ๋ก๋ฌ์์๋ fetch() ํจ์๋ฅผ ์ง์ํ์ง ์์ผ๋ ์ฐธ๊ณ ํด์ ์ฌ์ฉํ์.
Axios
Axios ๋ ์จ๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ์ด ๋ณด์ฅ๋๋ฉฐ, ์ฌ์ฉํ๊ธฐ๋ ์ฌ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ฌ์ฉํ๊ณ ์๋ค.
React ์ฝ๋ ์์
// $ npm install axios
const getMovies = async () => {
const {
data: {
data: { movies },
},
} = await axios.get(
'https://yts-proxy.nomadcoders1.now.sh/list_movies.json?sort_by=date_added'
);
this.setState({ movies, isLoading: false });
};
axios๋ HTTP request ์์ฒญ์ ๊ฐ์ํํ๋ค.