본문 바로가기
면접질문

MongoDB의 Schema는 무엇인가요? 그리고 Model은 또 무엇인가요?

by momomoo 2024. 5. 23.

MongoDB는 스키마리스(Schema-less) 데이터베이스이지만, Mongoose와 같은 ODM(Object Data Modeling) 라이브러리를 사용하면 스키마를 정의하고 모델을 생성할 수 있습니다. 이를 통해 데이터 구조와 제약 조건을 설정할 수 있습니다. 여기에서는 MongoDB에서 Mongoose를 사용하여 스키마와 모델을 정의하고 사용하는 방법을 설명하겠습니다.

### Mongoose의 Schema와 Model

#### Schema
스키마(Schema)는 MongoDB 컬렉션에 저장될 문서의 구조를 정의합니다. 각 필드의 데이터 타입, 기본값, 유효성 검사 등을 설정할 수 있습니다. 스키마를 통해 데이터 구조와 제약 조건을 명확히 정의할 수 있어 일관성을 유지하고 데이터 무결성을 보장하는 데 도움이 됩니다.

**예시: User 스키마 정의**

```javascript
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  age: {
    type: Number,
    min: 0,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  }
});

module.exports = userSchema;
```



위의 예시에서 `userSchema`는 사용자(User) 문서의 구조를 정의합니다. 각 필드에 데이터 타입과 제약 조건을 설정할 수 있습니다. 예를 들어, `name`과 `email`은 문자열 타입이며, 필수(`required`) 필드입니다. `email`은 또한 고유(`unique`)해야 합니다. `age`는 숫자 타입이며 0 이상의 값이어야 하고, `createdAt` 필드는 문서 생성 시 자동으로 현재 시간으로 설정됩니다.

#### Model
모델(Model)은 스키마를 기반으로 생성된 MongoDB 컬렉션의 인터페이스입니다. 모델을 사용하여 데이터베이스에서 문서를 생성(Create), 읽기(Read), 업데이트(Update), 삭제(Delete)할 수 있습니다. 모델은 데이터베이스와 상호작용하는 메서드를 제공하며, 스키마에서 정의한 구조와 제약 조건을 따릅니다.

**예시: User 모델 사용**

```javascript
const mongoose = require('mongoose');
const userSchema = require('./userSchema'); // 위에서 정의한 User 스키마

const User = mongoose.model('User', userSchema);

// 사용자 생성
const newUser = new User({
  name: 'John Doe',
  email: 'john.doe@example.com',
  age: 30
});

newUser.save()
  .then(user => console.log('User saved:', user))
  .catch(err => console.error('Error saving user:', err));

// 사용자 조회
User.findOne({ email: 'john.doe@example.com' })
  .then(user => console.log('User found:', user))
  .catch(err => console.error('Error finding user:', err));

// 사용자 업데이트
User.updateOne({ email: 'john.doe@example.com' }, { age: 31 })
  .then(result => console.log('User updated:', result))
  .catch(err => console.error('Error updating user:', err));

// 사용자 삭제
User.deleteOne({ email: 'john.doe@example.com' })
  .then(result => console.log('User deleted:', result))
  .catch(err => console.error('Error deleting user:', err));
```



위의 예시에서 `User` 모델은 `userSchema`를 기반으로 만들어졌습니다. 이를 통해 새로운 사용자를 생성하고, 데이터를 조회하며, 업데이트하고, 삭제하는 작업을 수행할 수 있습니다.

### 요약
- **Schema**: MongoDB 컬렉션에 저장될 문서의 구조를 정의합니다. 각 필드의 데이터 타입, 기본값, 유효성 검사 등을 설정할 수 있습니다.
- **Model**: 스키마를 기반으로 생성된 데이터베이스 인터페이스입니다. 모델을 사용하여 데이터베이스에서 CRUD 작업을 수행할 수 있습니다.

Mongoose를 사용하면 MongoDB의 유연한 스키마 구조를 보완하여, 데이터베이스의 일관성을 유지하고 데이터 무결성을 보장할 수 있습니다. 이를 통해 더 체계적으로 데이터를 관리하고, 보다 안정적인 애플리케이션을 개발할 수 있습니다.