๐ก Axios๋ node.js์ Browser๋ฅผ ์ํ Promise ๊ธฐ๋ฐ์ HTTP ํด๋ผ์ด์ธํธ์ด๋ค.
Server-Side ์์๋ native node.js์ http ๋ชจ๋์ ์ฌ์ฉํ๋ค๋ฉด, ํด๋ผ์ด์ธํธ ์ฆ Browser์์๋ XMLHttpRequests๋ฅผ
์ฌ์ฉํ๋ค.
Axios
์ ์ต์ํด์ง๋ ค๋ฉด ๋จผ์ ๋น๋๊ธฐ
์ Promise
์ ๋ํ ์ดํด๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํ์ฌ ์๋์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๋์กฐ๋๋ ์ฑ๊ฒฉ์ ํจ์๋ ๋๊ธฐ ํจ์
๋ผ๊ณ ํ๋๋ฐ, ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ ํจ์ ์ ํ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํจ์๋ ๋๊ฐ ํจ์์ ์ ์ธ ์์๋๋ก ํธ์ถ
์ด ๋๋ค.
๋ง์ฝ์ ์ฐ๋ฆฌ๊ฐ ์๋ฒ์ ์ ๋ณด๋ฅผ ์์ฒญํ์ฌ, ๋ฐ์์ค๋ ์์
์ ํ๋ ค๊ณ ํ๋ค๊ณ ์๊ฐํด ๋ณด์. ๋ง์ฝ ๋ฐ์ดํฐ์ ์์ด ์๊ฐ๋ณด๋ค ๋ง์, ํด๋น ํ์ด์ง์์ ํธ์ถ๋์ผํ๋ ํ๋จ์ ํจ์๋ค์ด ๋ฐ์ดํฐ ์์ฒญ ์์
์ด ๋๋๊ธฐ๊น์ง๋ง์ ๊ธฐ๋ค๋ ค์ผํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํํํ 4๋ฒ ํ์๊ฐ ๋ฐ๋ก ๋น๋๊ธฐ ํจ์
์ด๋ค.
๋น๋๊ธฐ ํจ์
์ฆ ๋น๋๊ธฐ๋ก ์์
์ ํด์ค ์ ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์
์ ํด๋น ํจ์์ ๋ค๋ฅธ ์ผ๋ฐํจ์๋ค์ ํธ์ถ๊ณผ ์๊ด์์ด background ์์ ๊ณ์ ์งํ๋๊ณ ์๋ ๋๋์ด๋ผ, ๋ค๋ฅธ ํจ์๋ค์ ์งํ์ ์ํฅ์ ๋ผ์น์ง ์๊ฒ ๋๋ค.
Axios
๊ฐ ๋ฐ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฐฉ์์ ํจ์์ธ ๊ฒ์ด๋ค.
์ด๊ฑด ๊ฐ์ธ์ ์ผ๋ก ์ ๋ง ๋ด๊ฐ ํท๊ฐ๋ ค์ ์ฐ๋๊ฑฐ๋ค. Promise ๊ฐ์ฒด vs promise ๋ฐฉ์ / ํจ์ (?)
๐ก ๋น๋๊ธฐ ์์
์ด ๋ง์ดํ ๋ฏธ๋์ ์๋ฃ or ์คํจ์ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋ด์ค.
Promise(resolve, reject) ์ ๋น๋๊ธฐ ํจ์ ์์ ์ฐ๊ณ resolve๋ผ๋ ์ธ์๋ก ๋ฏธ๋์ ๊ฒฐ๊ณผ๊ฐ ์ฑ๊ณต์ด์์ ๋,
rejcet๋ผ๋ ์ธ์๋ก ๋ฏธ๋์ ๊ฒฐ๊ณผ๊ฐ ์คํจ์ผ ๋์ return ๊ฐ์ ์ง์ ํด ์ค ์๊ฐ ์๋ค.
์์ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ์ด์ ์ ๊ณ์ callback
์ ์ง์ํด์ ๋ด๋ ค์ฃผ๊ณ ๋ด๋ ค์ฃผ๋ callback hell
ํ์์ ํด์ํ ์ ์๊ณ , ๊ฐ๋
์ฑ ๋ฐ ์ ์ง๋ณด์๋ ฅ๋ ์ข์์ง๊ฒ ๋๋ค
๊ทผ๋ฐ ๊ณ์ ์๊ฐํด๋ณด๋๊น Promise() ๋, try - catch ๋ฌธ .then - .catch๋ฌธ ๋ชจ๋ ๋ฏธ๋์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๋ฅธ ์์ธ์ฒ๋ฆฌ๋ฅผ ๋งก๋ ๊ฒ์ด์๋ค. ์ด๋ฌํ ๋ฐฉ์์ Promise ํจ์ / ๋ฐฉ์์ด๋ผ๊ณ ํ๋ ๊ฒ ๊ฐ๋ค... (์๋๋ผ๋ฉด ๊ผญ ์๋ ค์ฃผ์ธ์!)
์๋์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๋ฏธ๋์ ์ผ์ด๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐ๋ผ์ ์์ธ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋ณด์ฌ์ฃผ๋๋ฐ, ๋ฐฉ๊ธ ๋ด๊ฐ ์ ์ํ ๊ตฌ๋๋ฅผ ๋ท๋ฐ์นจํด์ฃผ๋ ๊ฒ ๊ฐ์ ์ฒจ๋ถํด ๋ณธ๋ค.
๐ ์ด์ Axios๋ก ๋ค์ ๋์ด๊ฐ ๋ณด์~
Axios
๋ ์ด์ ์ Ajax
์ fetch
์ ๊ฐ์ ๋น๋๊ธฐ ํต์ ์ ๋ด๋นํ๋ฉฐ, ์ด ์น๊ตฌ๋ค์ ๋จ์ ์ ๋ณด์ํด์ฃผ๋ ๋น๋๊ธฐ ํต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Ajax
์ Jquery๋ฅผ ์ฌ์ฉํด์ผ ์ง์ ํ ํจ์จ์ ๋ณด์ฌ์ฃผ๋ฉฐ, Promise ๊ธฐ๋ฐ์ด ์๋๋ผ๋ ๋จ์ ๊ณผ, fetch
์ ํธํํ ํธํ๊ฐ๋ฅํ ๋ธ๋ผ์ฐ์ ์ ์์ ์ผ์ผ์ด Json์ผ๋ก ๋ณํํ๊ณ , ๋คํธ์ํฌ ์๋ฌ๊ฐ ๋ฐ์ํ์ ์ response timeout ์ด ์์ด ๋์์ด ๊ธฐ๋ค๋ฆฌ๊ธฐ๋ง ํด์ผ๋๋ค๋ ๋จ์ ์ ๋ชจ๋ ๋ณด์ํ ์น๊ตฌ๊ฐ ๋ฐ๋ก ์ด Axios
์ด๋ค.
ํ์ง๋ง ๋ด์ฅ ํจ์ fetch์ Ajax์ ๋ฌ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ ์ค์นํด์ผ๋๋ค๋ ๋จ์ ์ด ์๊ธดํ๋ฐ, ์์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฐ๋ ํ๋ก์ ํธ๊ฐ ์ด๋์๋๊ฐ..!
์ค์น : npm install axios
or yarn add axios
ํ์ฉ ์์
export const getData = createAsyncThunk("post/getData", async (_, thunkAPI) => {
try {
/* ๋ํ์ ์ผ๋ก CRUD์ Read์ get / Create์ post / Update์ patch / Delete์ delete ๊ฐ ์๋ค*/
const res = await axios.get("http://localhost:3002/posts");
console.log(res);
return thunkAPI.fulfillWithValue(res.data);
} catch (err) {
console.log(err);
return thunkAPI.rejectWithValue(err);
}
});
{todos?.map((todo) => (
<TodoListDiv> ...
์ด๋ฒ ํ๋ก์ ํธ์์ useSelector
๋ก ๋ฐ์์จ ๊ฐ์ด ์ ๋๋ก ์ถ๋ ฅ์ด ์๋๋ ๋ถ๋ถ์์ ์ต์
๋์ฒด์ด๋
์ด๋๊ฑธ ์ฐ๋ฉด ์ ๋๋ก ์ถ๋ ฅ์ด ๋๋ ์ ์ ๋ฐ๊ฒฌํ ์ ์์๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๊ฑฐ์ง๋ง, ์ ๋๋์ง ๊ถ๊ธํ์ฌ ๋ฐ๋ก ์ข ๋ ์์๋ณด๊ธฐ๋ก ํ๋ค.
์ด๋ฒ์๋ ์ฐ๋ฆฌ๋ค์ ๋ฌธ๋ฒ ๊ต๊ณผ์ MDN ์ ์ฐธ๊ณ ํ์๋ค.
optional chaining ์ฐ์ฐ์ (?.)
๋ ์ฒด์ธ์ ๊ฐ ์ฐธ์กฐ๊ฐ ์ ํจํ์ง ๋ช
์์ ์ผ๋ก ๊ฒ์ฆ x -> ๋ฐ๋ก ์ฐ๊ฒฐ๋ ๊ฐ์ฒด ์ฒด์ธ ๋ด์ ๊น์์ด ์์นํ ์์ฑ ๊ฐ์ ์ฝ์ ์ ์๋ค๊ณ ํ๋ค.
๊ธฐ์กด์ ๋๋ .
์ฐ์ฐ์๋ฅผ ๊ฐ์ฒด์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ก ๋ช
์ํ ๋ ๋ฌด์์์ ์ผ๋ก ์ฌ์ฉํด์์๋๋ฐ, ์ด ๋ํ ์ฒด์ด๋ ์ฐ์ฐ์๋ผ๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฐธ์กฐ๊ฐ์ด nullish (null or undefined)
๋ผ๋ฉด ์๋ฌ ๋์ undefined
๋ฅผ ๋ด๋ฑ๋๋ค ํ๋ค. ์ด๊ฒ ๋๋ฌธ์ ์๋ ํ์
์ด ์ง์ ๋์ด์๋ ๊ฐ๋ค์ด ์ ์์ ์ผ๋ก ํธ์ถ์ด ๋์ง ์์ ๋ฏ ํ๋ค.
(์ด๋์ ๋ฏธ๋ฆฌ ํ์
์คํฌ๋ฆฝํธ๋ก ์ ์ํ์ฌ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๋ ๊ฑฐ์ผ์ง๋..)
๊ทธ๋์ ์ด๋ฌํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐธ์กฐ๊ฐ ๋๋ฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ฐ๊ฒฐ๋ ์์ฑ์ผ๋ก ์ ๊ทผํ ์, ํจ์ ์งง๊ณ ๊ฐ๋จํ ํํ์์ ์์ฑ์ด ๊ฐ๋ฅํ๋ฉฐ, ์ด๋ค ์์ฑ์ด ํ์ํ์ง์ ๋ํ ๋ณด์ฆ์ด ํ์คํ์ง ์์ ๊ฒฝ์ฐ์ ๊ฐ์ฒด์ ๋ด์ฉ์ ํ์ํ๋ ๋์ ๋์์ด ๋๋ค.