💜 Key Point

results, setTimeout

💜 Today I Learned

[최종 프로젝트]

신발 데이터를 DB에 저장을 하기 위해 우선 선별한 브랜드별로 신발 데이터를 1000개씩 저장하기로 하였다.
브랜드 하나씩 테스트를 해보기 위해 Body에 브랜드를 입력하고 100개씩 10번 반복하여 1000개를 저장하는 코드를 작성했다.

async fetchSneakers(saveShoesDto: SaveShoesDto) {
    const { brand } = saveShoesDto;
    for (let i = 1; i <= 10; i++) {
      const page = i.toString();
      const sneakersData = await this.SneakersApiCall(page, brand);
      const sneakersDataSave = sneakersData.results.map((sneakerData) => {
        const { brand, styleId, title, media } = sneakerData;
        if (media.imageUrl === null) {
          return null;
        } else {
          return { brand, shoeCode: styleId, name: title, imgUrl: media };
        }
      });
      await this.saveSneakers(sneakersDataSave);
      await new Promise((resolve) => setTimeout(resolve, 1000));
    }
  }

호출한 api의 데이터에서 DB에 필요한 데이터를 선별하기 위해 map 함수를 이용하여 필요 데이터를 추출하여 배열로 저장하였다.
처음에는 sneakersData.map 이라고 작성을 했었는데 sneakersData가 객체이기 때문에 배열로 받을 수 없었다.
api 호출 결과에서 실제 데이터가 담긴 배열 속성인 results를 통해 sneakersData.results 라고 작성하게 되면 배열의 각 요소에 접근할 수 있게 된다.
초당 5개의 요청을 넘으면 안되기에 그냥 하나의 요청이 끝날때마다 1초씩 지연을 주었다.


저장하는 로직을 작성하고 실행해보니 DB에 이미지 파일이 null로 들어가는 것들이 있어서 그것을 제외하는 코드도 추가하였다.

async saveSneakers(sneakersDataSave: any[]) {
    const filterData = sneakersDataSave.filter((sneakers) => sneakers !== null);
    await this.shoesRepository.save(filterData);
  }

0개의 댓글