http ํต์ ์ ์ํด ์ฌ์ฉํ๋ API๋ก ๋ํ์ ์ธ ๋ ๊ฐ์ง๊ฐ ์๋ค.
1. XMLHttpRequest
2. fetch
(axios๋ ์ด๋ค์ ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.)
fetch๊ฐ ๋์ค๊ธฐ ์ด์ ์๋ ajax ํต์ ์ ์ํ์ฌ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฌ ๋น๋๊ธฐ ํต์ ์ ํ์์ง๋ง fetch API์ ๋ฑ์ฅ์ดํ๋ก promise๊ธฐ๋ฐ ๋ฐ ์ฌ์ฉ์ ๊ฐํธํจ ๋ฐ ๊ฐ๋ ์ฑ ๋ฑ์ ์ด์ ๋ก fetch API๊ฐ ๋๋ถ๋ถ์ ์ ์ ์จ์ ์ฐจ์งํ๊ณ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ ๊ฐ์ API๋ ์ด๋ค์ง ์ดํด๋ณด๊ณ ์ด๋ ํ ์ฐจ์ด์ ์ด ์๋ ์ดํด๋ณด์.
๋ํ ์ด๋ค์ ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ axios๋ ์ด๋ ํ ์ฐจ์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ดํด๋ณด์.
XMLHttpRequest ๊ฐ์ฒด๋ ajax ๋น๋๊ธฐ ํต์ ์ ์ํด ์ฌ์ฉ๋๋ค.
XMLHttpRequest๋ http ๋น๋๊ธฐ ํต์ ์ ์ํ ํ๋กํผํฐ ๋ฐ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
๋ธ๋ผ์ฐ์ ๋ ์ฃผ์์ฐฝ์ด๋ HTML์ form ํ๊ทธ ๋๋ aํ๊ทธ๋ฅผ ํตํด HTTP ์์ฒญ ์ ์ก ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ์ ๊ณตํ๋ค.
์ ๊ธฐ๋ฅ ๋ฟ๋ง ์๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ http ํต์ ์ ํ ์ ์์ผ๋ฉฐ XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํต์ ํ ์ ์๋ค.
XMLHttpRequest ๊ฐ์ฒด๋ XMLHttpRequest ์์ฑ์ ํจ์๋ฅผ ํธ์ถํ์ฌ ์์ฑํ๋ค.
XMLHttpRequest ๊ฐ์ฒด๋ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ Web API์ด๋ฏ๋ก ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ง ์ ์์ ์ผ๋ก ์คํ๋๋ค.
const xhr = new XMLHttpRequest()
XMLHttpRequest ๊ฐ์ฒด๋ฅผ ํตํด Http ์์ฒญ์ ํ ๋์ ๋๋ต ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์งํ๋๋ค.
const xhr = new XMLHttpRequest()
// http ์์ฒญ ์ด๊ธฐํ
xhr.open("GET","/posts")
// http ์์ฒญ ํค๋ ์ค์
xhr.setRequestHeader("content-type","application/json")
// http ์์ฒญ ์ ์ก
xhr.send()
๋ง์ฝ setRequestHeader๋ฅผ ์ค์ ํ์ง ์๋๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ์
์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์๋๋ก ์ค์ ๋๋ค. ("content-type","*/*"
)
์๋ต ์ฒ๋ฆฌ
์ ์์ฒญ์ ๋ํ ์๋ต์ ๋ํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ์ํด์๋ XMLHttpRequest ์ด๋ฒคํธ์์ ์บ์นํ๋ฉด ๋๋ค.
onreadystatechange ์ด๋ฒคํธ์์ ํต์ ์ธ๋ถ ๋จ๊ณ๋ณ๋ก ์บ์นํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง ๋ณดํต http์์ฒญ์ด ์๋ฃ๋์ ๋์ ์ํฉ์ ๋ ๋ง์ด ๋ค๋ฃจ๋ฉฐ ์๋ฃ๋ฌ์ ๋๋ง ์ฒ๋ฆฌํ ๋์๋ ์ด๋ฒคํธ์ธ onload๊ฐ ๋ ๊ฐํธํ๊ธฐ ๋๋ฌธ์ onload ์ด๋ฒคํธ๋ก ํด๋ณด์.
const xhr = new XMLHttpRequest()
xhr.open("GET","https://jsonplaceholder/todos")
xhr.send()
xhr.onload= () => {
if(xhr.status === 200){
console.log(JSON.parse(xhr.response))
}
else{
console.log("Error",xhr.status,xhr.statusText)
}
}
http ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ์์ฒญ ์ํ์ธ status๊ฐ 200์ด ๋๋ค.
๊ทธ๋์ ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋๋ฉด ์๋ต๊ฐ์ ๊ฐ์ ธ์ค๋ฉด ๋๋ค.
fetch๋ XMLhttpRequest ๊ฐ์ฒด์ ๋น์ทํ๊ฒ HTTP ํต์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ WEB API์ด๋ฉฐ XMLhttpRequest๋ณด๋ค ๋ ์ฝ๊ณ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ API์ด๋ค.
const promise = fetch(url [options])
XMLhttpRequest์ fetch๋ฅผ ๋น๊ตํด๋ณด์.
XMLhttpRequest
const promiseGet = (url) => {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open("Get", url);
xhr.send();
xhr.onload = () => {
if (xhr.status === 200) resolve(JSON.parse(xhr.response));
else reject(new Error(xhr.status));
};
});
};
promiseGet("https://jsonplaceholder.typicode.com/posts/1");
fetch
fetch("https://jsonplaceholder.typicode.com/posts/1")
ํ์คํ fetch๊ฐ ๋ ๊ฐ๊ฒฐํ๋ค.
๋ํ fetch๋ ๊ธฐ๋ณธ์ ์ผ๋ก HTTP ์์ฒญ ๋ฉ์๋๊ฐ "GET"์ด๊ณ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด ๋๋ฒ์งธ ์ธ์๋ก ๋ฉ์๋๋ฅผ ๋ณ๊ฒฝํด ์ค ์ ์๋ค.
fetch()์ ๋๋ฒ์งธ ์ธ์๋ก HTTP ์์ฒญ ๋ฉ์๋ , HTTP ์์ฒญ ํค๋, ํ์ด๋ก๋ ๋ฑ์ ๊ฐ์ฒด๋ก ๋ฌถ์ด ์ค์ ํ ์ ์๋ค.
์๋ต ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ธฐ ์ํด์ Response ๊ฐ์ฒด์ json๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
json๋ฉ์๋๋ Response ๊ฐ์ฒด์์ HTTP ์๋ต ๋ชธ์ฒด๋ฅผ ๊ฐ์ฒดํํ์ฌ ์ทจ๋ํ๋ค.
fetch("https://jsonplaceholder.typicode.com/posts/1")
.then((response) => response.json())
.then((json) => console.log(json));
credentials : include
์ต์
์ ์ค์ ํด์ฃผ๊ณ Access-Control-Allow-Credentials:true
๋ฅผ ์ค์ ํด์ค์ผ ํด๋น ๋ฆฌ์์ค๋ฅผ ์ป์ด์ฌ ์ ์๋ค. ๋ํ ์๋ฒ์์ ํด๋น URL์ ๋ช
์์ ์ผ๋ก ์
๋ ฅํด์ค์ผํ๋ค.fetch('https://example.com', {
credentials: 'include'// server | Access-Control-Allow-Credentials:true
});
fetch("https://jsonplaceholder.typicode.com/todo22")
.then((response) => {
const responseStatus = response.status;
console.log("responseStatus :", responseStatus);
return response.json();
})
.then((json) => {
console.log(json);
})
.catch((e) => console.error(e));
๋๋ฌธ์ 404๋ 500 ์๋ฌ๊ฐ ๋ฐ์ํด๋ catch ๋ฉ์๋๋ก ํด๋น ์๋ฌ๋ฅผ ์ก์ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
fetch๋ XMLHttpRequest๋ณด๋ค ๊ฐํธํ๊ฒ ์ธ ์ ์์ผ๋ฉฐ promise๊ธฐ๋ฐ์ผ๋ก ์๋๋์ด ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ฅ์ด ๋ง๋ค๋ ์ฅ์ ์ด ์๋ค.
ํ์ง๋ง XMLHttpRequest๊ฐ ์ง์ํ๋ ๊ธฐ๋ฅ์ fetch์์๋ ์ฌ์ฉํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
๋๋ฌธ์ XMLHttpRequest์์๋ง ์ง์ํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉฐ fetch๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ํ์ํ API๋ฅผ ๋์ ํด ์ฌ์ฉํ๊ฑฐ๋ ์๋๋ฉด XMLHttpRequest์ ๊ทธ๋ฅ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๊ฒ ๋ค.
๋ฐ๋ผ์ ์ํฉ์ ๋ฐ๋ผ ์ ๋์ ์ผ๋ก ๋ ๊ฐ์ API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค.
(ํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ fetch๋ฅผ ์ฌ์ฉํด๋ ๊ฑฐ์ ๋ฌธ์ ๊ฐ ์๋ค.)
npm i axios
axios๋ ํ๋ก๋ฏธ์ค ๊ธฐ๋ฐ httpํต์ ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋ํ์ ํน์ง์ ๊ธฐ์กด xhr์ด๋ fetch๋ Web api๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ง ์ง์์ด ๋์ง๋ง axios๋ node.jsํ๊ฒฝ์์๋ ์ง์๋๋ค๋ ์ฅ์ ์ด ์๋ค.
์ ํน์ง์ ํฌํจํ์ฌ axios์ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ XMLHttpRequest๋ฅผ ํตํด http ํต์
node.jsํ๊ฒฝ์ผ๋ก๋ถํฐ http๋ฅผ ํตํด http ํต์
promise ๊ธฐ๋ฐ์ผ๋ก ์๋
์์ฒญ๊ณผ ์๋ต์ ์ค๊ฐ์ ์บ์นํ ์ ์๋ค.
์์ฒญ๊ณผ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ณํํด์ค ์ ์๋ค.
์์ฒญ์ ์ทจ์ํ ์ ์๋ค.(abort | fetch์์๋ ์ง์์ด ์๋จ.)
์๋์ผ๋ก json data๋ก ๋ณํํด์ฃผ์ด json()๋ฉ์๋๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค.
XSRF๋ก๋ถํฐ ๋ณดํธํด์ค๋ค.
axios์ fetch๋ ๊ฒ๋ณด๊ธฐ์ ์ฌ์ฉ๋ฒ์ด ๋น์ทํด๋ณด์ด๋๋ฐ ๋ง์ ์ฌ๋๋ค์ด axios๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ญ๊น?
์ฐ์ ์ฒ์ ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ node.jsํ๊ฒฝ์์๋ ์คํ๊ฐ๋ฅํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก xhr์ด๋ fetch๋ ์น API์ด์ฌ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ง ์ ์ฉ๊ฐ๋ฅํ๋ axios๋ node.jsํ๊ฒฝ์์๋ ์ ์ฉ๊ฐ๋ฅํ ์ฅ์ ์ด ์๋ค.
axios๋ axios ์์ฒด์์ get๋ฟ๋ง ์๋๋ผ post,put,delete์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฐ๋ฉด fetch๋ ๊ธฐ๋ณธ์ ์ผ๋ก get ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง๋ง post,put,delete์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋๋ฒ์งธ ์ธ์์ ๊ฐ์ฒด ํํ๋ก ๋ฉ์๋๋ฅผ ๋ช
์ํด์ค์ผํ๋ค.
axios
axios.get(url, {
// ์ค์ ์ต์
});
axios.post(url, {
// ์ค์ ์ต์
});
axios.put(url, {
// ์ค์ ์ต์
});
axios.delete(url, {
// ์ค์ ์ต์
});
fetch
fetch("https://example.com/profile", {
method: "POST", // or 'PUT' or 'DELETE'
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(data),
});
xhr์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ ธ fetch์์ ์ฌ์ฉํ ์ ์๋ xhr์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด fetch์์๋ ๋ช๋ช xhr์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๋ณด์๋ค.
ํ์ง๋ง axios๋ xhr๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ก๊ธฐ ๋๋ฌธ์ timesout, abort ๊ธฐ๋ฅ ,interceptors ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
๋ํ ์๋์ผ๋ก ์๋ต ๋ฐ์ดํฐ๋ฅผ json ๊ฐ์ฒดํ ํด์ค๋ค.
xhr์ด๋ fetch๋ฅผ ์ฌ์ฉํ์ ๋ ์๋ต ๋ฐ์ดํฐ๋ json ํํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ json()๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒดํ์์ผ์ค์ผํ๋ค.
ํ์ง๋ง axios๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก json ํํ๋ก ๋ณํ ํด์ฃผ์ด ๋ฒ๊ฑฐ๋ก์์ ์ค์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
์์ฒญ ๋ฐ์ดํฐ ์ฆ post๋ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํตํด ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋์ ์๋์ผ๋ก ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ค๋ค.
fetch๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋์ JSON.stringify(data)
๋ฅผ ํตํ์ฌ data๋ฅผ ๋ฌธ์์ดํํด์ค์ผํ๋ค.
fetch
fetch(url, {
method: "POST", // *GET, POST, PUT, DELETE, etc.
body: JSON.stringify(data), // body data type must match "Content-Type" header
});
axios
const url = "https://jsonplaceholder.typicode.com/todos";
const todo = {
title: "A new todo",
completed: false,
};
axios
.post(url, {
headers: {
"Content-Type": "application/json",
},
data: todo,
})
.then(console.log);
axios
const client1 = axios.create({
baseURL: 'https://first-domain.com/api/',
timeout: 1000,
headers: {'X-Custom-Header': 'foobar'}
});
const client2 = axios.create({
baseURL: 'https://second-domain.com/api/',
timeout: 3000,
headers: {'X-Custom-Header': 'foobar'}
});
const client3 = axios.create({
baseURL: 'https://third-domain.com/api/',
timeout: 5000,
headers: {'X-Custom-Header': 'foobar'}
});
๋ง์ฝ fetch๋ฅผ ํตํด ์ฌ๋ฌ ์๋ฒ์ ํต์ ์ ํด์ผํ๊ณ ๊ฐ ์๋ฒ์ ๋ํ์ฌ ํค๋๋ฅผ ์ค์ ํด์ค์ผํ๋ค๋ฉด ์๋ฒ์ ๋ํ ์์ฒญ์ ๋ณด๋ผ ๋๋ง๋ค ์๋ฒ์ ๋ง๋ ํค๋ ๋ฐ ์ต์
๋ค์ ๋ช
์ํด์ค์ผํ ๊ฒ์ด๋ค.
(๋ฌผ๋ก ํค๋ ๋ฐ ์ต์
๋ค์ ์ค์ ํ์ฌ fetch๋ฅผ ๋ฐํํ๋ ํจ์๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ฉด ๊ทธ๋ด ํ์๋ ์๋ค.)
fetch
functio createInstance1Fetch(url){
return fetch(url,{
"Cache-Control": "no-cache",
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",})
}
functio createInstance2Fetch(url){
return fetch(url,{
"Cache-Control": "no-cache",
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",})
}
...
ํ์ง๋ง axios๋ฅผ ์ฌ์ฉํ๋ฉด axios.create๋ผ๋ ๋ช ์์ ์ธ ๋ฉ์๋๋ฅผ ํตํด ๊ฐ ์๋ฒ์ ๋ํ ์ธ์คํด์ค๋ฅผ ๊ตฌ๋ถ์ง์ ์ ์๋ค.
axios์ fetch ๋ ๋ค ์ฌ์ฉํ๊ธฐ ํธํ API, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
fetch์ ์๋ xhr๊ธฐ๋ฅ ๋ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ axios๋ฅผ ์ฌ์ฉํด๋ ์ข์ง๋ง
(๋ฟ๋ง์๋๋ผ ์์์ ์ธ๊ธํ๋ฏ์ด ์ฌ๋ฌ๊ฐ์ง ์ฅ์ ์ด ์์.)
ํด๋น ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ฉด ๊ตณ์ด axios๋ฅผ ์ค์นํ์ฌ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ๋ค.
๋ฐ๋ผ์ ์ํฉ์ ๋ฐ๋ผ fetch or axios๋ฅผ ์ ํํ์ฌ ์ฌ์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.