MongoDB 제품 데이터 구조화

MongoDBBeginner
지금 연습하기

소개

이 랩에서는 MongoDB 를 사용하여 제품 데이터에 대한 구조화된 문서 스키마를 설계하는 기본 사항을 배우게 됩니다. 전자 상거래 애플리케이션의 경우, 잘 설계된 스키마는 성능과 확장성에 매우 중요합니다. 간단한 제품 문서를 만드는 것부터 시작하여 가격 및 재고 정보와 같은 관련 데이터를 임베딩하고 다중 값 속성에 배열을 사용하여 점진적으로 개선할 것입니다. 이 랩이 끝나면 MongoDB 데이터베이스에서 제품 데이터를 효과적으로 모델링하는 방법에 대한 확실한 이해를 갖게 될 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 93%의 긍정적인 리뷰율을 받았습니다.

기본 제품 문서 생성

첫 번째 단계에서는 MongoDB 서버에 연결하고, 새 데이터베이스를 생성하며, 첫 번째 제품 문서를 삽입합니다. 이를 통해 제품 카탈로그의 기반을 마련하게 됩니다.

먼저 터미널에서 데이터베이스와 상호 작용하기 위해 MongoDB Shell (mongosh) 을 엽니다.

mongosh

test>와 같은 프롬프트가 표시되어 MongoDB 서버에 연결되었음을 나타냅니다. 이제 product_catalog라는 새 데이터베이스를 생성하고 전환합니다. MongoDB 에서는 데이터베이스에 처음 데이터를 저장할 때 자동으로 생성됩니다.

use product_catalog

switched to db product_catalog라는 출력은 현재 이 새 데이터베이스 내에서 작업 중임을 확인시켜 줍니다.

다음으로, products라는 컬렉션을 생성하고 그 안에 단일 문서를 삽입합니다. MongoDB 의 문서는 BSON 객체이며, 이는 JSON 과 유사하게 표현됩니다. insertOne() 메서드를 사용합니다.

db.products.insertOne({
  name: "Wireless Headphones",
  brand: "SoundWave",
  category: "Electronics",
  sku: "SW-HD-001"
});

이 명령은 name, brand, category, sku의 네 가지 필드를 가진 문서를 삽입합니다. 출력에는 MongoDB 에서 문서에 할당된 확인 메시지와 고유한 _id가 표시됩니다.

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

문서가 성공적으로 생성되었는지 확인하려면 find() 메서드를 사용하여 products 컬렉션의 모든 문서를 검색할 수 있습니다.

db.products.find();

출력에는 방금 삽입한 문서와 함께 자동으로 생성된 _id가 표시됩니다.

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001'
  }
]

이제 첫 번째 제품 문서를 성공적으로 생성했습니다. 다음 단계에서도 mongosh 쉘 내에서 계속 작업합니다.

가격 및 재고 정보 포함

MongoDB 의 문서 모델이 가진 핵심적인 장점 중 하나는 관련 정보를 단일 문서 내에 임베딩할 수 있다는 것입니다. 이 단계에서는 기존 제품을 업데이트하여 가격 및 재고 세부 정보를 위한 중첩된 객체 (nested objects) 를 포함시킬 것입니다. 이 접근 방식은 모든 관련 제품 데이터를 함께 유지하여, 별도의 조회가 필요 없으므로 쿼리 성능을 향상시킬 수 있습니다.

생성된 문서를 수정하기 위해 updateOne() 메서드를 사용할 것입니다. 이 메서드는 두 개의 인수를 받습니다: 업데이트할 문서를 식별하는 필터와 변경 사항을 지정하는 업데이트 연산자 (update operator) 입니다.

price 객체와 stock 객체를 추가해 보겠습니다. $set 연산자를 사용하여 이 새로운 필드를 추가할 것입니다.

db.products.updateOne(
  { sku: "SW-HD-001" },
  {
    $set: {
      price: {
        base: 149.99,
        currency: "USD"
      },
      stock: {
        quantity: 250,
        inStock: true
      }
    }
  }
);

이 명령을 자세히 살펴보겠습니다.

  • 첫 번째 객체 { sku: "SW-HD-001" }는 필터입니다. 이는 sku 필드가 "SW-HD-001"인 문서를 찾도록 MongoDB 에 지시합니다.
  • 두 번째 객체 { $set: { ... } }는 업데이트 작업입니다. $set은 새 필드를 추가하거나 기존 필드를 수정합니다. 여기서는 pricestock 필드를 추가하고 있으며, 이 필드들은 자체적으로 임베딩된 문서입니다.

출력은 하나의 문서가 일치하고 수정되었음을 확인시켜 줄 것입니다.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

이제 변경 사항을 확인하기 위해 문서를 다시 검색해 보겠습니다.

db.products.find({ sku: "SW-HD-001" });

출력에는 새로 임베딩된 pricestock 정보가 포함된 제품이 표시됩니다. 이 구조는 관계형 데이터베이스에서 가격과 재고를 위한 별도의 테이블을 갖는 것보다 더 체계적이고 직관적입니다.

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true }
  }
]

제품 속성에 배열 사용

제품에는 종종 사용 가능한 색상, 검색을 위한 태그 또는 사양 목록과 같이 여러 값을 가질 수 있는 속성이 있습니다. MongoDB 는 배열을 사용하여 이를 우아하게 처리합니다. 이 단계에서는 제품 문서에 태그 배열을 추가합니다.

$set 연산자와 함께 updateOne() 메서드를 다시 사용하여 tags라는 새 필드를 추가합니다. 이 필드에는 문자열 배열이 포함됩니다.

db.products.updateOne(
  { sku: "SW-HD-001" },
  {
    $set: {
      tags: ["audio", "wireless", "over-ear", "noise-canceling"]
    }
  }
);

이 명령은 sku: "SW-HD-001"인 제품을 찾아 tags 배열을 추가합니다. 출력은 다시 한 문서가 수정되었음을 확인시켜 줄 것입니다.

결과를 보려면 문서를 다시 쿼리합니다.

db.products.find({ sku: "SW-HD-001" });

업데이트된 문서에는 이제 tags 배열이 포함됩니다. 이러한 값을 배열에 저장하면 특정 태그가 있는 제품을 쉽게 쿼리할 수 있습니다.

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true },
    tags: [ 'audio', 'wireless', 'over-ear', 'noise-canceling' ]
  }
]

배열은 일대다 (one-to-many) 관계를 모델링하고 관련 데이터 목록을 문서 내에 직접 저장하는 강력한 기능입니다.

여러 제품 추가 및 조회

제품 카탈로그에는 많은 항목이 포함됩니다. 이 단계에서는 여러 제품을 한 번에 추가하는 방법과 필터링을 위한 기본 쿼리를 수행하는 방법을 배웁니다.

여러 문서를 컬렉션에 동시에 추가하려면 insertMany() 메서드를 사용할 수 있습니다. 이 메서드는 문서 배열을 인수로 받습니다. products 컬렉션에 두 개의 새 제품을 추가해 보겠습니다.

db.products.insertMany([
  {
    name: "Smartwatch",
    brand: "FitTech",
    category: "Electronics",
    sku: "FT-SW-005",
    price: { base: 199.99, currency: "USD" },
    stock: { quantity: 150, inStock: true },
    tags: ["wearable", "fitness", "smartwatch"]
  },
  {
    name: "Classic T-Shirt",
    brand: "UrbanWear",
    category: "Apparel",
    sku: "UW-TS-001",
    price: { base: 24.99, currency: "USD" },
    stock: { quantity: 500, inStock: true },
    tags: ["clothing", "cotton", "casual"]
  }
]);

출력은 작업을 확인하고 새로 삽입된 두 문서의 _id 값을 나열합니다.

이제 여러 제품이 있으므로 "Electronics" 카테고리에 속하는 제품만 찾기 위한 쿼리를 수행해 보겠습니다. 이는 find() 메서드에 필터 객체를 전달하여 수행할 수 있습니다.

db.products.find({ category: "Electronics" });

이 명령은 products 컬렉션을 검색하고 category 필드 값이 "Electronics"인 문서만 반환합니다.

출력에는 카탈로그에 있는 두 개의 전자 제품, 즉 "Wireless Headphones"와 "Smartwatch"가 표시됩니다.

[
  {
    _id: ObjectId('...'),
    name: 'Wireless Headphones',
    brand: 'SoundWave',
    category: 'Electronics',
    sku: 'SW-HD-001',
    price: { base: 149.99, currency: 'USD' },
    stock: { quantity: 250, inStock: true },
    tags: [ 'audio', 'wireless', 'over-ear', 'noise-canceling' ]
  },
  {
    _id: ObjectId('...'),
    name: 'Smartwatch',
    brand: 'FitTech',
    category: 'Electronics',
    sku: 'FT-SW-005',
    price: { base: 199.99, currency: 'USD' },
    stock: { quantity: 150, inStock: true },
    tags: [ 'wearable', 'fitness', 'smartwatch' ]
  }
]

이제 제품 카탈로그를 관리하기 위한 기본 작업을 연습했습니다. MongoDB 셸을 종료할 수 있습니다.

exit;

요약

이 실습에서는 MongoDB 에서 제품 데이터를 구조화하는 기본 원리를 배웠습니다. 데이터베이스를 생성하고 기본 제품 문서를 삽입하는 것으로 시작했습니다. 그런 다음 가격 및 재고 정보와 같은 관련 데이터를 중첩된 객체에 포함시켜 이 문서를 개선했습니다. 또한 제품 태그와 같이 여러 값을 갖는 속성을 처리하기 위해 배열을 사용하는 방법을 배웠습니다. 마지막으로 컬렉션에 여러 문서를 추가하고 특정 필드를 기반으로 데이터를 필터링하는 기본 쿼리를 수행하는 연습을 했습니다. 이러한 기술은 전자 상거래 애플리케이션 및 MongoDB 를 사용하는 기타 시스템을 위한 유연하고 효율적인 데이터 모델을 구축하는 강력한 기반을 제공합니다.