회사 스크래핑 프로젝트를 이해하기가 너무 어려워서 스크래핑 공부 및 실습을 하던 중,,,
문제 상황
- 아마존 상품의 카테고리(category)를 스크래핑해서 DB에 저장하려고 함
- 스크래퍼에서 category를 잘 파싱해서 객체에 넣었고,
- Mongoose 스키마에도
category: { type: String }
필드를 추가함
- 그런데 실제 MongoDB에는 category 필드가 저장되지 않았다..
- 프론트엔드(ProductCard)에서는 category가 계속 undefined/빈 값으로 표시됨
해결 과정
스크래퍼에서 category 파싱 확인
const category = $('#wayfinding-breadcrumbs_feature_div > ul > li:nth-child(1) > span > a').text().trim();
console.log('Scraped category:', category);
DB 저장 로직 점검
scrapedProduct
에는 category가 잘 들어가고 있었다
- DB에 저장하는 코드:
product = {
...scrapedProduct,
priceHistory: updatePriceHistory,
category: scrapedProduct.category || existingProduct?.category || ""
}
const newProduct = await Product.findOneAndUpdate(
{ url: scrapedProduct.url },
{ $set: product },
{ upsert: true, new: true }
);
콘솔 로그로 값 추적
- 파일 처음부터 끝까지 category 들어가는지 질척거리며 확인
- scrapedProduct에는 값이 있는데, newProduct에는 undefined라니.
DB document 직접 확인
- MongoDB에서 document를 조회해도 category 필드가 없었다,,
마이그레이션 스크립트로 기존 상품에 category 필드 추가
- 기존 상품에는 category가 없으니, 일괄 추가:
db.products.updateMany(
{ category: { $exists: false } },
{ $set: { category: "" } }
)
여전히 안됨......
- 코드, DB, 스크래퍼 모두 정상인데도 category가 저장되지도 출력되지도 않음...
원인: Mongoose 모델 캐싱/서버 재시작 필요했다고 한다
- Mongoose는 최초 모델 생성 시점의 스키마를 캐싱하기 때문에
- 개발 중 스키마를 수정(필드 추가)해도, 서버를 재시작하지 않으면 새 필드가 반영되지 않는다고;
- 서버를 완전히 재시작하니
category 필드가 정상적으로 DB에 저장되고 출력되는 것을 확인할 수 있었다. (나의 소중한 시간..)
결론
- Mongoose 스키마를 수정(필드 추가/변경)했다면, 반드시 서버를 재시작하자.
- 로그 살펴보며 질척거리는 게 답인 것 같긴 하다
- 기존 데이터에는 마이그레이션이 필요한데,, MS AI School 때 마이그레이션에 여러번 당한 적이 있어서 두려워했었던 것 같음