[React]-위치 기반 미세먼지 체크 앱(feat.토이프로젝트)/Axios와 async/await 같이 사용하기!

badassong·2023년 5월 23일
1

React

목록 보기
52/56
post-thumbnail

공공 API로 토이 프로젝트를 하나 만들어 볼까? 해서 시작한 위치 기반 미세먼지 체크 앱 만들기!
공공데이터 사이트에서 적합한 API를 발견해 바로 시작해부렀다.

내가 생각한 로직은

  1. Geolocation API로 WGS84 좌표를 불러온다!
  2. 불러온 좌표를 kakao 좌표 변환 API를 통해 TM으로 변환한다!
  3. 변환한 좌표를 좌표에 따른 근처 대기 측정소 데이터를 호출하는 공공 API 파라미터로 넣어 데이터를 불러온다!
  4. 불러온 측정소 데이터를 미세먼지 데이터를 호출하는 공공 API 파라미터로 넣어 데이터를 뿌린다!
    +5. 아까 불러온 WGS84 좌표를 kakao API를 통해 좌표 => 주소로 변환한다!

이거였는데 뭔가 데이터 불러오고 그 데이터 넣어서 또 호출하고 이 패턴 반복인 것 같아서 오! 간단하겠군! 했는데..

음 생각보다 간단하진 않았다. 하하!

우선 Postman에서 다 호출해보니까 잘 되길래 바로 작업을 시작했는데 api key부터가 말썽이었다. 분명 .env에 넣어서 환경변수 만들어서 잘 불렀는데 왜 access denied야!! 찾아보니 dotenv 설치하면 된다 해서 설치했더니 에러 안남 ㅎㅎ

그리고 이 데이터를 어떻게 연속적으로(?) 꼬리에 꼬리를 무는 식으로(?) 호출 하지? 라는 고민에 계속 빠져서 하루 왠종일 씨름했다. 하다가 너무 복잡해서 내던질 뻔 했ㄷㅏ...계속 좌표 변환까지 밖에 안되서 중간에는 그냥 도시별로 데이터 뿌려줄까.. 하다가 뭔가 위치 기반으로 하는 게 의미가 있는 것 같아서 계속 찾아봤다.

그런데 찾다보니 Axios랑 async/await 같이 쓰는 방법을 발견하고 증말..
유레카..!!!를 외쳤다.
여태 axios는 promise-then 방식으로 사용했는데 요런 방법도 있었다.
then 방식의 경우 api 호출이 복잡해지면 then을 then 내부나 또는 chain 형태로 연달아 쓰는 경우가 발생한다고 한다! (딱 지금 하는 작업의 경우인 듯 하다!)

// then 을 연속적으로 호출하는 예시
const TestApiCall = () {
  axios.get('https://test.com/api/v1')
    .then((response) => {
      const data = response.data;
      const userId = data.userId;
      axios.get('https://test2.com/api/v2/' + userId)
        .then((response) => {
          console.log("Response >>", response.data)
        })
        .catch(() => {
        })
    })
    .catch((error) => {
      console.log("Error >>", err);
    })
}

하지만 이 방식은 보기에 복잡하고 불편해서 선호하는 방식은 아니라고..!

아래가 async/await를 이용한 코드이다. 에러처리는 try-catch 방식으로 작업해야 한다!

// async/await 를 활용하는 수정된 방식
const TestApiCall = async () {
  try {
    const response = await axios.get('https://test.com/api/v1')
    const userId = response.data.userId;
    const response2 = await axios.get('https://test2.com/api/v2/' + userId);
    console.log("response >>", response2.data)
  } catch(err) {
    console.log("Error >>", err);
  }
}

그리하여 하루동안 현재 위치, 미세먼지 농도, 측정소 데이터 불러오는 것까지 해결했다!

이제 추가 데이터도 더 불러오고 스타일링 작업까지 해서 완성할 예정이다!

profile
프론트엔드 대장이 되어보쟈

0개의 댓글