[ mongoDB ] mongoose.model 와 mongoose.schema 의 차이
최근 몽고디비로 작업해야해서 하다가 궁금한점 발견
mongoose.model 와 mongoose.model 의 정확한 차이는 무엇이고 어떻게 써야하는가?
Model
model은 'schema'의 wrapper이다
Schema
데이터의 구조와 타입을 정의하는 JSON 객체로 데이터베이스의 스키마와 같은 뜻
코드 예시 (model로 schema wrap한 모습)
export const Schemas: any = {
Services: mongoose.model(
"Services",
new mongoose.Schema(
{
name: { type: String, unique: true },
createdAt: Date,
updatedAt: Date,
deletedAt: Date,
},
{ collection: "Services" }
)
코드 설명
이 코드는 Mongoose를 사용하여 MongoDB 데이터 모델을 정의하는 예시입니다. Mongoose는 MongoDB를 위한 Node.js 환경의 객체 모델링 도구(Object Data Modeling, ODM)입니다. 즉, MongoDB와의 상호작용을 쉽게 만들어주는 라이브러리입니다.
export const Schemas: any = {
- 이 줄은 Schemas라는 이름의 객체를 내보내며, 이 객체는 애플리케이션에서 사용할 여러 Mongoose 스키마를 담게 됩니다. any 타입은 TypeScript 문법으로, Schemas 객체가 어떤 형태의 값도 가질 수 있음을 의미합니다.
Services: mongoose.model(
- Services는 Schemas 객체 내에 정의된 속성 중 하나로, mongoose.model 메소드를 사용하여 Mongoose 모델을 생성합니다. 이 모델은 "Services"라는 이름의 MongoDB 컬렉션과 연결됩니다
"Services",
- 첫 번째 인자는 모델의 이름을 나타냅니다. 이 이름은 MongoDB의 컬렉션 이름과 연결됩니다.
new mongoose.Schema(
- 이 부분에서는 Mongoose 스키마를 정의합니다. 스키마는 MongoDB 컬렉션 내의 문서가 어떤 형태와 필드를 가질지 정의하는 객체입니다.
{
name: { type: String, unique: true },
createdAt: Date,
updatedAt: Date,
deletedAt: Date,
},
- 스키마 정의 부분입니다. name 필드는 문자열 타입이며, unique: true로 설정되어 있어 중복 값을 허용하지 않습니다. createdAt, updatedAt, deletedAt 필드는 모두 날짜 타입으로, 문서가 생성, 업데이트, 삭제된 시간을 기록합니다.
collection: "Services" }
- 이 부분은 스키마에 대한 추가 옵션을 설정합니다. { collection: "Services" }는 이 모델이 사용할 MongoDB 컬렉션의 이름을 명시적으로 지정합니다. Mongoose는 모델 이름을 자동으로 복수형으로 변환하여 컬렉션 이름으로 사용하는데, 이 옵션을 통해 컬렉션 이름을 직접 지정할 수 있습니다. 예를 들어, 모델 이름이 "Service"라면 자동으로 "services" 컬렉션을 찾으려 시도하지만, 이 옵션을 통해 "Services" 컬렉션을 명시적으로 사용하도록 설정한 것입니다.
한줄로 정리하자면,
const User = mongoose.model("Services", Schemas, { collection: "Services" });
이런 구조가 되는 것이다
컬렉션이란? (=테이블)
mongodb는 컬렉션(Collection)을 사용해 데이터를 하나로 묶는다. 컬렉션이란 그저 용도가 같거나 유사한 문서들을 그룹으로 묶은 것을 말한다. 컬렉션은 기존 SQL 데이터베이스의 테이블처럼 동작한다.