
results, setTimeout
신발 데이터를 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);
}