๐Ÿ“† 22.10.17 - Axios, Promise ๋น„๋™๊ธฐ, Optional Chaining

๋ฒ„๋“คยท2022๋…„ 10์›” 17์ผ
0

โœจToday I Learn (TIL)

๋ชฉ๋ก ๋ณด๊ธฐ
10/62
post-custom-banner

1. Axios

๐Ÿ’ก Axios๋ž€ node.js์™€ Browser๋ฅผ ์œ„ํ•œ Promise ๊ธฐ๋ฐ˜์˜ HTTP ํด๋ผ์ด์–ธํŠธ์ด๋‹ค. 
Server-Side ์—์„œ๋Š” native node.js์˜ http ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ํด๋ผ์ด์–ธํŠธ ์ฆ‰ Browser์—์„œ๋Š” XMLHttpRequests๋ฅผ 
์‚ฌ์šฉํ•œ๋‹ค.

Axios์— ์ต์ˆ™ํ•ด์ง€๋ ค๋ฉด ๋จผ์ € ๋น„๋™๊ธฐ์™€ Promise์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์•„๋ž˜์— ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋น„๋™๊ธฐ ํ•จ์ˆ˜

๋Œ€์กฐ๋˜๋Š” ์„ฑ๊ฒฉ์˜ ํ•จ์ˆ˜๋Š” ๋™๊ธฐ ํ•จ์ˆ˜ ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ๋Š” ํ•จ์ˆ˜ ์œ ํ˜•์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํ•จ์ˆ˜๋Š” ๋Œ€๊ฐœ ํ•จ์ˆ˜์˜ ์„ ์–ธ ์ˆœ์„œ๋Œ€๋กœ ํ˜ธ์ถœ์ด ๋œ๋‹ค.
๋งŒ์•ฝ์— ์šฐ๋ฆฌ๊ฐ€ ์„œ๋ฒ„์— ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜์—ฌ, ๋ฐ›์•„์˜ค๋Š” ์ž‘์—…์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ๋ณด์ž. ๋งŒ์•ฝ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์•„, ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ํ˜ธ์ถœ๋˜์•ผํ•˜๋Š” ํ•˜๋‹จ์˜ ํ•จ์ˆ˜๋“ค์ด ๋ฐ์ดํ„ฐ ์š”์ฒญ ์ž‘์—…์ด ๋๋‚˜๊ธฐ๊นŒ์ง€๋งŒ์„ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํƒ€ํŒŒํ•  4๋ฒˆ ํƒ€์ž๊ฐ€ ๋ฐ”๋กœ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ด๋‹ค.
๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ฆ‰ ๋น„๋™๊ธฐ๋กœ ์ž‘์—…์„ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์€ ํ•ด๋‹น ํ•จ์ˆ˜์— ๋‹ค๋ฅธ ์ผ๋ฐ˜ํ•จ์ˆ˜๋“ค์˜ ํ˜ธ์ถœ๊ณผ ์ƒ๊ด€์—†์ด background ์—์„œ ๊ณ„์† ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ๋Š๋‚Œ์ด๋ผ, ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์˜ ์ง„ํ–‰์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
Axios ๊ฐ€ ๋ฐ”๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฐฉ์‹์˜ ํ•จ์ˆ˜์ธ ๊ฒƒ์ด๋‹ค.

Promise

์ด๊ฑด ๊ฐœ์ธ์ ์œผ๋กœ ์ •๋ง ๋‚ด๊ฐ€ ํ—ท๊ฐˆ๋ ค์„œ ์“ฐ๋Š”๊ฑฐ๋‹ค. Promise ๊ฐ์ฒด vs promise ๋ฐฉ์‹ / ํ•จ์ˆ˜ (?)

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์™€ ๋‹ฌ๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ ์„ค์น˜ํ•ด์•ผ๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๊ธดํ•œ๋ฐ, ์š”์ฆ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์•ˆ์“ฐ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ด๋””์žˆ๋Š”๊ฐ€..!

  • Axios ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ
  1. ์„ค์น˜ : npm install axios or yarn add axios

  2. ํ™œ์šฉ ์˜ˆ์ œ

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);
  }
});

Optional Chaining

 {todos?.map((todo) => (
        <TodoListDiv> ...
                    

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ useSelector๋กœ ๋ฐ›์•„์˜จ ๊ฐ’์ด ์ œ๋Œ€๋กœ ์ถœ๋ ฅ์ด ์•ˆ๋˜๋Š” ๋ถ€๋ถ„์—์„œ ์˜ต์…”๋„์ฒด์ด๋‹์ด๋ž€๊ฑธ ์“ฐ๋ฉด ์ œ๋Œ€๋กœ ์ถœ๋ ฅ์ด ๋˜๋Š” ์ ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋œ ๊ฑฐ์ง€๋งŒ, ์™œ ๋˜๋Š”์ง€ ๊ถ๊ธˆํ•˜์—ฌ ๋”ฐ๋กœ ์ข€ ๋” ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

์ด๋ฒˆ์—๋„ ์šฐ๋ฆฌ๋“ค์˜ ๋ฌธ๋ฒ• ๊ต๊ณผ์„œ MDN ์„ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.

optional chaining ์—ฐ์‚ฐ์ž (?.) ๋Š” ์ฒด์ธ์˜ ๊ฐ ์ฐธ์กฐ๊ฐ€ ์œ ํšจํ•œ์ง€ ๋ช…์‹œ์ ์œผ๋กœ ๊ฒ€์ฆ x -> ๋ฐ”๋กœ ์—ฐ๊ฒฐ๋œ ๊ฐ์ฒด ์ฒด์ธ ๋‚ด์— ๊นŠ์ˆ™์ด ์œ„์น˜ํ•œ ์†์„ฑ ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ธฐ์กด์— ๋‚˜๋Š” .์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ์ฒด์•ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ฐ๋กœ ๋ช…์‹œํ•  ๋•Œ ๋ฌด์˜์‹์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์™”์—ˆ๋Š”๋ฐ, ์ด ๋˜ํ•œ ์ฒด์ด๋‹ ์—ฐ์‚ฐ์ž๋ผ๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ฐธ์กฐ๊ฐ’์ด nullish (null or undefined) ๋ผ๋ฉด ์—๋Ÿฌ ๋Œ€์‹  undefined๋ฅผ ๋‚ด๋ฑ‰๋Š”๋‹ค ํ•œ๋‹ค. ์ด๊ฒƒ ๋•Œ๋ฌธ์— ์›๋ž˜ ํƒ€์ž…์ด ์ง€์ •๋˜์–ด์žˆ๋˜ ๊ฐ’๋“ค์ด ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ์ด ๋˜์ง€ ์•Š์€ ๋“ฏ ํ•˜๋‹ค.
(์ด๋ž˜์„œ ๋ฏธ๋ฆฌ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋กœ ์ •์˜ํ•˜์—ฌ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๋Š” ๊ฑฐ์ผ์ง€๋„..)

๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฐธ์กฐ๊ฐ€ ๋ˆ„๋ฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์—ฐ๊ฒฐ๋œ ์†์„ฑ์œผ๋กœ ์ ‘๊ทผํ•  ์‹œ, ํ›จ์‹  ์งง๊ณ  ๊ฐ„๋‹จํ•œ ํ‘œํ˜„์‹์„ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์–ด๋–ค ์†์„ฑ์ด ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•œ ๋ณด์ฆ์ด ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ๊ฐ์ฒด์˜ ๋‚ด์šฉ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋™์•ˆ ๋„์›€์ด ๋œ๋‹ค.

profile
ํƒœ์–ด๋‚œ ๊น€์— ๋งŽ์€ ๊ฒฝํ—˜์„ ํ•˜๋ ค๊ณ  ์•„๋“ฑ๋ฐ”๋“ฑ ์• ์“ฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€