Ajax ?
AJAX ( Asynchronous Javascript and XML) ์ ์น ํ์ด์ง์ ์ด๋์์ด ํ์ํ ๋ฐ์ดํฐ๋ง ์ ์กํ๋ ๊ธฐ์ ์ ๋๋ค.
- ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์๋ฒ์ชฝ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๋ ajax๊ธฐ๋ฒ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
- ์ด ์์ ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์๋ ์๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
- ๋น๋๊ธฐ(asynchronous)๋ ์์ฒญ์ด ๋๋ ๋ ๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ๋์์ ์ฌ๋ฌ ์์ ์ ์ํํ๊ฒ ๋ฉ๋๋ค.
- ๋์ค์ react์์๋ ๋ค๋ฅธ ์๋ฒ์ REST API์ ํต์ ์ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
ES6 fetch ๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ ์ฒ๋ฆฌ (๋ฆฌ์กํธ)
Promise = fetch(์์ฒญ์ฃผ์)
๐ ์ด๋ฒคํธ ํด๋ฆญ์ ์ฒ๋ฆฌํ๊ธฐ
- ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ useState()์ ์ ์ฅํ๋ ์์ ์ ๋๋ค.
- ๊ทน๋จ์ ์ผ๋ก ํํํด ๋ฐ์ดํฐ ํต์ ์ 100์ด ๊ฐ ์์๋๋ฉด useState๋ 100์ด ๊ฐ undefined ์ํ๊ฐ ๋ฉ๋๋ค.
- ๋ ๋๋ง ์์ ์๋ฌ๋ฅผ ๋ํ๋ด๊ธฐ ๋๋ฌธ์, undefined์ ๊ดํ ์ฒ๋ฆฌ๋ฅผ ๋์์ ์งํํฉ๋๋ค.
import { useEffect, useState } from "react";
const App = () => {
let [raw, setRaw] = useState();
const handleClick = () => {
fetch('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
.then( response => response.json() )
.then( data => {
//console.log(data)
setRaw(data)
})
}
return (
<div>
<h3>ํด๋ฆญ์์ fetch๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ</h3>
<button type="button" onClick={handleClick}>๋ฐ์ดํฐ๋ก๋</button>
{raw !== undefined ?
<div>
{raw.userId}<br />
{raw.userPw}<br />
{raw.userName}<br />
</div>
: undefined
}
</div>
)
}
export default App;
๐ํ๋ฉด ๋ ๋๋ง ์๋ฃ์ ๋ฐ์ดํฐ ์ฒ๋ฆฌํ๊ธฐ useEffect() ํ ์ฌ์ฉ
- ๋น๋๊ธฐ ์์ ์ ์ปดํฌ๋ํธ์ ๋ฐ๋ก ์ฐ๊ณ state๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ๋ฌดํ๋ฃจํ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค.
- ๊ทธ๋์ useEffect() ํ ์ ์ด์ฉํ์ฌ ์ฒซ๋ฒ์งธ ๋ ๋๋ง ์๋ฃ์๋ง ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.
import { useEffect, useState } from "react";
const App = () => {
let [data, setData] = useState()
//๋ ๋๋ง ์๋ฃ์ ๋ฐ์ดํฐ ๋ก๋
useEffect( () => {
fetch('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
.then( response => response.json() )
.then( data => {
setData(data)
})
}, [])
return (
<div>
<h3>๋ก๋ฉ์์ fetch๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(๊ฐ์ํํ)</h3>
{data && <div>
{data.userId}<br />
{data.userPw}<br />
{data.userName}<br />
</div>
}
</div>
)
}
export default App;
Axios ๋ก ๋ฐ์ดํฐ ์ฒ๋ฆฌ
์์์ค์ค๋ ๋น๋๊ธฐ๋ฅผ ๋ํธํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค.
์์์ค์ค ์ค์น
npm install axios
์์์ค์ค
Promise = axios.get(์์ฒญ์ฃผ์)
๐ ์ด๋ฒคํธ ํด๋ฆญ์ ์ฒ๋ฆฌํ๊ธฐ (fetch์ ๊ฑฐ์ ๊ฐ์ ๐)
import axios from "axios";
import { useState } from "react";
const App = () => {
const handleClick = () => {
axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
.then(response => {
setData( response.data );
})
}
return (
<div>
<h3>์์์ค์ค๋ฐ์ดํฐ</h3>
<button type="button" onClick={handleClick}>๋ฐ์ดํฐ๋ก๋</button>
{data !== undefined ?
<div>
{data.userId}<br />
{data.userPw}<br />
{data.userName}<br />
</div>
:
undefined
}
</div>
)
}
export default App;
async , await ์ ์ฉ
๋น๋๊ธฐ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๊ฒ ํฉ๋๋ค. ( async(์ด๊ฑฐ ๋น๋๊ธฐ์) , await(๊ธฐ๋ค๋ ค))
๐ async, await๊ท์น
- ์ด์ฑํฌ ํจ์ ์์์ ์ด์จ์์ ์ฌ์ฉํ๋ค
- function ์์ async ํค์๋๋ฅผ ์ถ๊ฐ ํจ์๋ ์ธ์ ๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋ฆฌํด์ด ํ๋ก๋ฏธ์ค๋ผ๋ฉด await์ ์ ์ฉํ๊ณ then์ ์ ์์จ ์ ์๋ค.
๐บ๋น๋๊ธฐ์์ 3๋ฒ์ ๋ฐ์ดํฐ ํต์ ์ ํ๋ค๊ณ ๊ฐ์ ํฉ์๋ค.
1,2,3,4,5,6์ ์์๋ก ์ถ๋ ฅ๋ ๊ฒ ๊ฐ์ง๋ง ์๋๋๋ค.
์์๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค.
...์๋ต
const handleClick = () => {
axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
.then(response => {
console.log(response.data);
console.log(1)
})
console.log(2)
axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hello.json')
.then(response => {
console.log(response.data);
console.log(3)
})
console.log(4)
axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/by.json')
.then(response => {
console.log(response.data);
console.log(5)
})
console.log(6)
}
- Axios๋ ์ด๋ฏธ Promise๋ฅผ ๋ฐํํฉ๋๋ค.
- Axios์์ await์ ์ฌ์ฉํ ์ ์๊ณ , then() ์ ์ ์๋ต ํ ์ ์์ต๋๋ค.
- Axios๋ฅผ ํธ์ถํ๋ ๋ถ๋ชจํจ์์๋ await์ ๋ฐ๋์ ๋ฌ์์ค๋๋ค.
๐ async, await์ ์ฅ์
- ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ
- ์ด์ฑํฌ, ์ด์จ์์ ๋๊ธฐ์ ๋ฐฉ์(์์๋ฅผ) ๋ณด์ฅํ๋ค
๐ async, await์ ์ฉํ์ฌ ๋ณ๊ฒฝํ๊ธฐ
const handleClick = async () => {
let response = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
console.log(response.data);
setData( response.data );
console.log(1);
let response2 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hello.json')
console.log(response2.data);
console.log(2);
let response3 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/by.json')
console.log(response3.data);
console.log(3);
}
๐ useEffect์์ async, await์ฐ๊ธฐ
useEffect(() => {
(async () => {
let url = '์ฃผ์';
let response = await axios.get(url);
//state์
๋ฐ์ดํธ
})();
}, []);
import axios from "axios";
import { useEffect } from "react";
function App() {
const handleClick = async () => {
// //๋น๋๊ธฐ ๋ฐฉ์์์ ๋ฐ์ดํฐ์ ์์๋ฅผ ๋ณด์ฅ๋ฐ๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ์์ฑํด์ผ ํฉ๋๋ค.
// axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
// .then(response => {
// console.log(response.data);
// console.log(1);
// axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hello.json')
// .then(response => {
// console.log(response.data);
// console.log(3);
// axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/by.json')
// .then(response => {
// console.log(response.data);
// console.log(5);
// });
// });
// });
//async(์ด๊ฑฐ ๋น๋๊ธฐ์ผ), await(๊ทธ๋ฌ๋๊น ๊ธฐ๋ค๋ ค)
//1. asyncํจ์ ์์์๋ง awaitํค์๋๋ฅผ ์ธ์ ์์.
//2. ๋ง์ฝ function์์ async๋ฅผ ๋ถ์ด๋ฉด ์ธ์ ๋ Promise๊ฐ์ฒด๋ฅผ ๋ฐํํจ
//3. ํจ์์ ๋ฆฌํด์ด Promise๋ผ๋ฉด awaitํค์๋๋ฅผ ๋ถ์ด๊ณ then์ ์๋ตํ ์ ์์
//์ฅ์
//1. ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง
//2. ์ํ๋ฐฉ์์ ๋๊ธฐ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๋ฉด์, ์์ ๋ณด์ฅ์ด ๋ค์ด๊ฐ.
// const data1 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
// console.log(data1.data);
// console.log(1);
// const data2 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hello.json')
// console.log(data2.data);
// console.log(2);
// const data3 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/by.json')
// console.log(data3.data);
// console.log(3);
// const result = await fetch('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
// .then(response => response.json() )
// console.log(result);
}
//์ค์ต - ํํธ๋ ์ ์ ๊ฐ์์๋ฃ์ ์์๊ฑฐ์์ ์๋ง
//ํ๋ฉด ๋ก๋์์ hi.json๋ฐ์ดํฐ๋ฅผ async, await์ผ๋ก ๊ฐ์ ธ์ค๋ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์ธ์.
// useEffect(() => {
// (async () => {
// const result = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json');
// console.log(result);
// }) ();
// }, []);
return (
<>
<h3>์์์ค์ค๋ก ๋ฐ์ดํฐ ๋ฐ๊ธฐ</h3>
<button onClick={handleClick}>ํด๋ฆญ์ ๋คํธ์ํฌํต์ ์ผ๋ก ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ</button>
</>
)
}
export default App;
const handleClick = async () => {
//๋น๋๊ธฐ ๋ฐฉ์์์ ๋ฐ์ดํฐ์ ์์๋ฅผ ๋ณด์ฅ๋ฐ๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ์์ฑํด์ผ ํฉ๋๋ค.
axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
.then(response => {
console.log(response.data);
console.log(1);
axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hello.json')
.then(response => {
console.log(response.data);
console.log(3);
axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/by.json')
.then(response => {
console.log(response.data);
console.log(5);
});
});
});
....
//async(์ด๊ฑฐ ๋น๋๊ธฐ์ผ), await(๊ทธ๋ฌ๋๊น ๊ธฐ๋ค๋ ค)
//1. asyncํจ์ ์์์๋ง awaitํค์๋๋ฅผ ์ธ์ ์์.
//2. ๋ง์ฝ function์์ async๋ฅผ ๋ถ์ด๋ฉด ์ธ์ ๋ Promise๊ฐ์ฒด๋ฅผ ๋ฐํํจ
//3. ํจ์์ ๋ฆฌํด์ด Promise๋ผ๋ฉด awaitํค์๋๋ฅผ ๋ถ์ด๊ณ then์ ์๋ตํ ์ ์์
//์ฅ์
//1. ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง
//2. ์ํ๋ฐฉ์์ ๋๊ธฐ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๋ฉด์, ์์ ๋ณด์ฅ์ด ๋ค์ด๊ฐ.
const data1 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
console.log(data1.data);
console.log(1);
const data2 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hello.json')
console.log(data2.data);
console.log(2);
const data3 = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/by.json')
console.log(data3.data);
console.log(3);
const result = await fetch('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json')
.then(response => response.json() )
console.log(result);
useEffect(() => {
(async () => {
const result = await axios.get('https://raw.githubusercontent.com/yopy0817/data_example/master/hi.json');
console.log(result);
}) ();
}, []);