React의 useEffect 내부에서 비동기(async) 호출하기

Posted by , November 28, 2024
React
Series ofReact

thumbnail

UseEffect에서 비동기 호출을...

useEffect는 다들 알다시피 컴포넌트가 렌더링 이후 실행을 하는 훅(Hook)이다.
하나의 함수와, 의존성 배열을 같이 전달받아 처리를 하는데,
보통은 이 안에서 렌더링 이후의 값 처리 등을 사용한다.

근데 가끔 이 안에서 비동기 함수를 호출해야 할 때가 있다.
나의 경우 마와셀에서 와인의 국가코드를 가져오는 부분을 만들 때 사용했었다.
당시 UI 테스트를 위해 급하게 사용한 거라 지금은 다른 방식으로 구현되어 있지만...

와인의 생산 국가의 코드를 가져오는 함수는 아래와 같이 구현되어 있다.

async function getCountryCode(countryName: string) {
  const response = await fetch("https://restcountries.com/v3.1/all")
  const countries = await response.json()
  const country = countries.find(
    (c: any) => c.name.common.toLowerCase() === countryName.toLowerCase()
  )

  return country ? country.cca2.toLowerCase() : "Unknown country code"
}

그리고 이를 useState의 함수에 set 해주는데, 처음엔 아래와 같이 구현해보려 했다.

useEffect(async () => {
  const code = await getCountryCode(props.country)
  setCountryCode(code)
}, [props.country])

이렇게 해서 되면 모두가 행복했겠지만, 호락호락하지 않다.
저 useEffect를 보면 정리 함수(()=>{})만 반환이 된다.

즉 Promise<> 이거는 반환이 불가능하다는 이야기다.
그럼 어떻게 해결을 해야 할까?

Result

뭐 특이한 방법은 아니다.
그냥 useEffect 내부에서 비동기 함수를 만들어 주고, 그것을 호출하는 형태로 가면 된다.

코드를 보면 바로 이해가 될 것이다.

useEffect(() => {
  const fetchCountryCode: any = async () => {
    const code = await getCountryCode(props.country)
    setCountryCode(code)
  }

  fetchCountryCode()
}, [props.country])

이렇게 처리하면 useEffect 내부에서 비동기 함수를 호출 처리할 수 있다.