Next.js + MongoDB: 스키마 필드 추가 후 값이 저장되지 않는다?...

Faithful Dev·2025년 6월 30일
0

셀파트너랩스

목록 보기
5/6

회사 스크래핑 프로젝트를 이해하기가 너무 어려워서 스크래핑 공부 및 실습을 하던 중,,,

문제 상황

  • 아마존 상품의 카테고리(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 || ""
}
  • findOneAndUpdate:
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 때 마이그레이션에 여러번 당한 적이 있어서 두려워했었던 것 같음
profile
Turning Vision into Reality.

0개의 댓글