๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL -์ผ๊ฐ„ํ•™์Šต๊ธฐ๋ก/React

Stateairline-client ๊ณผ์ œ

by ___Jin 2022. 2. 9.

[React] ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ดํ•ด์™€ ๋น„๋™๊ธฐ ์š”์ฒญ ์ฒ˜๋ฆฌ

์ดํ‹€์— ๊ฑธ์ณ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„, state์ƒํƒœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ์™€ useEffect AJAX์š”์ฒญ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค.

 

๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” 1๊ฐ€์ง€์˜ ์ผ๋งŒ ํ•˜๊ณ  ๋‹จ๋ฐฉํ–ฅ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ€์ง„๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์— ๋‹ด์•„์ค˜์•ผํ• ์ง€ ์ •ํ•ด์ค˜์•ผํ•œ๋‹ค.(๋ฐ์ดํ„ฐ์ •์˜)

 

๋ถ€๋ชจ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ž์‹์—๊ฒŒ props(์ฝ๊ธฐ์ ์šฉ)๋กœ ๋‚ด๋ ค์ค€๋‹ค(์ธ์ž ํ˜น์€ ์†์„ฑ์ฒ˜๋Ÿผ ๋‚ด๋ ค์คŒ)

์ž์‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค๋ฐ›์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์—์„œ ์™”๋Š”์ง€๋Š” ์•Œ์ง€๋ชปํ•œ๋‹ค.

 

[์ƒํƒœ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ]

๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์ด top-down ๋ฐฉ์‹์ด์ง€๋งŒ, ์ž์‹์ปดํฌ๊ฐ€ ๋ถ€๋ชจ์ปดํฌ์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ”์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”

(์˜ˆ. ์ž์‹์ปดํฌ์— ์ „์†ก๋ฒ„ํŠผ์ด ์žˆ์–ด ํด๋ฆญ์‹œ ๋ถ€๋ชจ์˜ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก์ด ์—…๋ฐ์ดํŠธ ๋˜์–ด์•ผ ํ•˜๋Š”๊ฒฝ์šฐ)

๋ถ€๋ชจ์ปดํฌ๋‚ด์— ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋‘๊ณ  ์ž์‹์ปดํฌ์— ์ด ์ƒํƒœ ๋ณ€๊ฒฝํ•จ์ˆ˜๋ฅผ props๋กœ ์ „๋‹ฌํ•ด์„œ ํ•ด๊ฒฐํ•œ๋‹ค.

์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋‚ด๊ฐ€ ์ •๋ฆฌํ•œ ์ƒ๋Œ์€ (์ž์‹ ์ปดํฌ์— ๋ฒ„ํŠผ์ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์—)

1. ๋ถ€๋ชจ์ปดํฌ์— ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ   <์ž์‹์ปดํฌ /> ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

2. ์ž์‹์ปดํฌ์— <์ž์‹์ปดํฌ ์ ๋‹นํ•œํ•จ์ˆ˜๋ช… ={๋ถ€๋ชจ์˜ ์ƒํƒœ๋ณ€๊ฒฝํ•จ์ˆ˜} /> ๋กœ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

3.  ์ž์‹์ปดํฌ์˜ ์ธ์ž๋กœ ์ ๋‹นํ•œํ•จ์ˆ˜๋ช…์„ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. ex. function ์ž์‹์ปดํฌ({์ ๋‹นํ•œํ•จ์ˆ˜๋ช…})

4. ์ž์‹์˜ ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‹ฌ๊ณ  ํ•ธ๋“ค ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

5. ํ•ธ๋“ค ํ•จ์ˆ˜๋‚ด์— ๋‚ด๋ ค๋ฐ›์€ ์ ๋‹นํ•œํ•จ์ˆ˜๋ช…(); ์„ ๋„ฃ์–ด์ค€๋‹ค. 

 

[useEffect]

๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง„๋‹ค. ํ•˜์ง€๋งŒ ajax์š”์ฒญ์ด๋‚˜ LocalStorage ๋˜๋Š” ํƒ€์ด๋จธ์™€ ๊ฐ™์€ React์™€ ์ƒ๊ด€์—†๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ• ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ฆฌ์•กํŠธ์˜ ์ž…์žฅ์—์„œ๋Š” ์ „๋ถ€ Side Effect๋กœ ๋ฐ›๋Š”๋‹ค. Side Effect๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ Hook์ด useEffect์ด๋‹ค. 

useEffect๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ธ ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ๋ฐ”๋กœ console.log(ํŒจ์น˜์˜ ๊ฐ’)์„ ํ•  ๊ฒฝ์šฐ ํŒจ์น˜๊ฐ€ ๋‹ค ์ง„ํ–‰๋˜์ง€ ์•Š์€

์ƒํ™ฉ์—์„œ ์ฝ˜์†”์š”์ฒญ์ด ๋“ค์–ด์˜ค๊ธฐ ๋•Œ๋ฌธ์— ใ…‡ใ…‡ใ…‡ of defined ์—๋Ÿฌ๋ฅผ ๋„์šฐ๋Š”๋ฐ, useEffect๋ฅผ ์‚ฌ์šฉํ• ๊ฒฝ์šฐ '๋ฆฌ์•กํŠธ๊ฐ€ ์•Œ์•„์„œ ๊ธฐ๋‹ค๋ ค์„œ ๊ฐ’ ๋ฐ›์„ํ…Œ๋‹ˆ ์‹ ๊ฒฝ์“ฐ์ง€๋งˆ' ๋ผ๋Š” ๋Š๋‚Œ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค.

 

๋ณดํ†ต,

 useEffect( () =>{
    //side Effect๋ฅผ ์‹คํ–‰ํ•˜๋Š”์ž‘์—…
    })
    
  },[์ข…์†์„ฑ ๋ฐฐ์—ด])

 ์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์ข…์†์„ฑ ๋ฐฐ์—ด์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’์ด ๋ณ€๊ฒฝ๋ ๋•Œ๋งŒ ์‹คํ–‰ํ•˜๊ณ , ๋นˆ๋ฐฐ์—ด์ด๋ผ๋ฉด 1๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ ,

์•„์˜ˆ ๋น„์›Œ๋‘”๋‹ค๋ฉด ์ตœ์ดˆ์—๋งŒ ์‹คํ–‰ํ•œ๋‹ค.

 

[AJAX์š”์ฒญ] - Asynchronous JavaScript And XML

 

fetch๋Š” ES6๋ถ€ํ„ฐ JavaScript์˜ ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋“ค์–ด์™”๊ณ ,
promise๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ์žฅ์ ์œผ๋กœ ์ธํ•ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋‹ค.

resolve,reject๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์—๋Ÿฌ ์ฒ˜๋ฆฌ์—๋„ ์šฉ์ดํ•˜๋‹ค.

 

fetch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ 

๊ฐ„๋‹จํ•˜๊ฒŒ 

export function getFlight(filterBy = {}) {
  
  let query = ''
 
  if(filterBy.departure){ // ๋”ฐ๋กœ ๋ฐ›์•„์™€์•ผํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์–ด ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๊ฑธ๋ €๋‹ค 
    query = query +'departure='+ filterBy.departure +"&";
  }
  if(filterBy.destination){
    query = query + 'destination='+filterBy.destination;
  }//query parameter(/flight?departure=ICN&destination=CJU)๊ฐ€ ์œ ์ €์˜
  //์š”์ฒญ์—๋”ฐ๋ผ ์œ ๋™์ ์œผ๋กœ ๋ณ€ํ•ด์•ผ ํ•ด์„œ endpoint์— ๋ฐฑํ‹ฑ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
  
  let endPoint =  
  `http://ec2-13-124-90-231.ap-northeast-2.compute.amazonaws.com:81/flight?${query}`

  return fetch(endPoint) //URL์„ ๋ฐ›์•„ json()ํ•ด์คŒ.
  .then(res => res.json());

์ฒ˜๋ฆฌํ–ˆ๋‹ค.

 

fetch๋Š” promise์™€ async await์—ฎ์–ด์„œ ๋‹ค์‹œ ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค.

 

์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€

๋Œ“๊ธ€