MongoDB Academy · 강의

유형, 필수 필드, 열거형 제약 조건

JSON Schema 검증기 안에서 유형 제한, 필수 필드, 허용된 열거형 값을 정의합니다.

레슨 2/413개 단계

유형, 필수 필드, 열거형 제약 조건은(는) CoddyKit의 무료 MongoDB Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 MongoDB Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. MongoDB Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

세 가지 핵심 제약 조건 유형

MongoDB JSON Schema 검증기는 실제 환경에서 필요한 검증의 대부분을 다루는 세 가지 기본 제약 조건 범주를 지원합니다. 필드의 BSON 데이터 유형을 강제하는 type 제약 조건, 특정 필드의 존재를 요구하는 required 제약 조건, 필드 값을 미리 정의된 허용 목록으로 제한하는 enum 제약 조건입니다. 이 세 가지는 함께 운영 환경의 모든 Schema 검증기를 구성하는 핵심 기반이 됩니다.

BSON 유형과 JSON Schema 유형 비교

JSON Schema는 string, number, object와 같은 표준 JSON 유형을 사용합니다. MongoDB는 bsonType 키워드로 선언하는 BSON 유형을 추가로 제공합니다. 예로 objectId, date, int, long, double, decimal 등이 있습니다. 숫자 하위 유형이나 objectId, date와 같은 MongoDB 전용 유형을 정확하게 지정해야 한다면 MongoDB 검증기에서는 항상 type이 아닌 bsonType을 사용하십시오.

// BSON type names to use in validators
// 'string', 'bool', 'int', 'long', 'double', 'decimal',
// 'objectId', 'date', 'array', 'object', 'null', 'binData'

db.createCollection('products', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      properties: {
        _id:       { bsonType: 'objectId' },
        price:     { bsonType: 'decimal' },
        stock:     { bsonType: 'int' },
        isActive:  { bsonType: 'bool' },
        createdAt: { bsonType: 'date' }
      }
    }
  }
});

필수 필드 선언

required 키워드는 컬렉션에 삽입되거나 업데이트되는 모든 문서에 반드시 있어야 하는 필드 이름의 배열을 받습니다. 필수 필드 중 하나라도 없으면 쓰기가 거부됩니다. 필수 필드는 개별 속성 정의 안이 아니라 Schema 수준에서 선언합니다.

db.createCollection('employees', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['firstName', 'lastName', 'email', 'hiredAt'],
      properties: {
        firstName: { bsonType: 'string' },
        lastName:  { bsonType: 'string' },
        email:     { bsonType: 'string' },
        hiredAt:   { bsonType: 'date' },
        salary:    { bsonType: 'decimal' }  // optional
      }
    }
  }
});

Enum 제약 조건: 허용 값 제한

enum 키워드는 필드 값을 허용된 값의 고정 목록으로 제한합니다. 상태 필드, 범주 코드 또는 관리되는 용어 집합에서 값을 가져와야 하는 모든 필드에 적합합니다. enum 목록에 없는 값을 삽입하려고 하면 검증 오류와 함께 쓰기가 실패합니다.

db.createCollection('tickets', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['title', 'status', 'priority'],
      properties: {
        title:    { bsonType: 'string' },
        status:   { enum: ['open', 'in_progress', 'resolved', 'closed'] },
        priority: { enum: ['low', 'medium', 'high', 'critical'] }
      }
    }
  }
});

숫자 범위 제약 조건

숫자 필드에 JSON Schema는 minimum, maximum, exclusiveMinimum, exclusiveMaximum 키워드를 제공합니다. 이러한 키워드는 bsonType과 함께 작동하여 유효한 범위를 강제합니다. 예를 들어 상품 가격이 양수인지, 평점이 1에서 5 사이인지 확인할 수 있습니다.

db.createCollection('reviews', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['productId', 'rating'],
      properties: {
        productId: { bsonType: 'objectId' },
        rating: {
          bsonType: 'int',
          minimum: 1,
          maximum: 5,
          description: 'Rating must be between 1 and 5'
        },
        price: {
          bsonType: 'decimal',
          minimum: 0,
          exclusiveMinimum: true
        }
      }
    }
  }
});

문자열 길이 제약 조건

문자열 필드는 minLength와 maxLength를 사용하여 문자 수 제한을 적용할 수 있습니다. 사용자 이름은 최소 3자, 최대 30자여야 할 수 있습니다. 설명 필드는 2000자로 제한할 수 있습니다. 이러한 제약 조건은 실수로 빈 문자열을 저장하거나 화면 표시 한도를 초과하는 잘린 텍스트를 저장하는 일을 방지합니다.

db.createCollection('profiles', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['username'],
      properties: {
        username: {
          bsonType: 'string',
          minLength: 3,
          maxLength: 30,
          description: 'Username must be 3-30 characters'
        },
        bio: {
          bsonType: 'string',
          maxLength: 500
        }
      }
    }
  }
});

문자열의 패턴 제약 조건

pattern 키워드는 정규 표현식 문자열을 받아 필드 값이 해당 표현식과 일치하는지 검증합니다. 이메일 형식, 전화번호 패턴, UUID 형식 또는 슬러그 규칙을 강제할 때 유용합니다. 검색에 사용하는 정규식 쿼리와 달리 패턴 제약 조건은 쓰기 시점에 실행되어 규칙에 맞지 않는 데이터가 컬렉션에 들어오는 것을 차단합니다.

db.runCommand({
  collMod: 'users',
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['email'],
      properties: {
        email: {
          bsonType: 'string',
          pattern: '^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$',
          description: 'Must be a valid email address'
        },
        slug: {
          bsonType: 'string',
          pattern: '^[a-z0-9]+(?:-[a-z0-9]+)*$'
        }
      }
    }
  }
});

유형과 Enum 결합

유형과 enum은 함께 사용할 수 있습니다. bsonType과 enum을 모두 지정하면 값이 올바른 유형이면서 허용된 집합에 포함되는지 확인할 수 있습니다. bsonType이 없으면 JavaScript의 형 변환이 적용되는 경우 문자열 값과 같은 숫자를 포함하여 enum이 일치하는 모든 유형을 허용할 수 있습니다. 유형을 명시하면 검증 의도가 분명해집니다.

properties: {
  role: {
    bsonType: 'string',
    enum: ['admin', 'editor', 'viewer'],
    description: 'Must be a string and one of the allowed roles'
  }
}

알 수 없는 필드를 허용하지 않는 additionalProperties

기본적으로 MongoDB 검증기는 properties에 언급되지 않은 추가 필드를 허용합니다. additionalProperties: false를 설정하면 Schema에 선언되지 않은 필드가 문서에 포함되지 않도록 할 수 있습니다. 이는 개발 중 필드 이름의 오타를 발견하는 엄격한 모드이지만, 자주 발전하는 Schema에는 지나치게 엄격할 수 있습니다.

db.createCollection('strictUsers', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['name', 'email'],
      additionalProperties: false,  // reject any undeclared fields
      properties: {
        _id:   { bsonType: 'objectId' },
        name:  { bsonType: 'string' },
        email: { bsonType: 'string' }
      }
    }
  }
});

도움이 되는 오류 설명 제공

각 속성 정의 안의 description 키워드는 클라이언트에 반환되는 검증 오류 메시지에 포함됩니다. 'Email must be a valid address'나 'Rating must be between 1 and 5'처럼 명확하고 사람이 읽기 쉬운 설명을 작성하면 개발자와 API 사용자가 Schema를 읽지 않고도 검증 실패의 원인을 이해하고 수정하기가 훨씬 쉬워집니다.

검증기 테스트

검증기를 추가한 후에는 예상대로 동작하는지 확인하기 위해 항상 유효한 문서와 유효하지 않은 문서로 모두 테스트해야 합니다. 필수 필드가 누락된 문서, 잘못된 유형의 필드가 포함된 문서, enum에 없는 값이 들어 있는 문서를 삽입해 보십시오. 또한 완전히 유효한 문서도 삽입하여 정상적으로 허용되는지 확인하십시오. 이렇게 양쪽 경우를 모두 테스트하면 정상적인 쓰기 작업까지 차단하는 지나치게 엄격한 검증기를 방지할 수 있습니다.

// Should FAIL — missing required 'email'
try { db.users.insertOne({ name: 'Bob' }); } catch(e) { console.log('Correctly rejected:', e.code); }

// Should FAIL — wrong type for 'age'
try { db.users.insertOne({ name: 'Bob', email: 'b@b.com', age: 'thirty' }); } catch(e) { console.log('Correctly rejected'); }

// Should PASS
db.users.insertOne({ name: 'Bob', email: 'b@b.com', age: 30 });
console.log('Valid document accepted');

빠른 확인

이 레슨에서 배운 MongoDB 및 NoSQL 데이터베이스 개념을 제대로 이해했는지 테스트해 보십시오.

레슨 요약

이 레슨에서는 다음을 배웠습니다. bsonType은 objectId와 date를 포함한 BSON 전용 데이터 유형을 강제합니다. required는 스키마 수준에서 필수 필드를 선언합니다. 또한 enum은 필드를 허용된 값의 고정 목록으로 제한합니다. 다음으로는 MongoDB가 이러한 규칙을 얼마나 엄격하게 적용할지 제어하는 검증 수준과 동작을 살펴보겠습니다.

무료로 시작

AI 튜터와 함께 JavaScript을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“유형, 필수 필드, 열거형 제약 조건” 강의는 무료인가요?

네 — “유형, 필수 필드, 열거형 제약 조건” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 MongoDB Academy 강의 전체를 잠금 해제할 수 있습니다. MongoDB Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“유형, 필수 필드, 열거형 제약 조건”에서 뭘 배우나요?

JSON Schema 검증기 안에서 유형 제한, 필수 필드, 허용된 열거형 값을 정의합니다. 브라우저에서 직접 실행하는 실습 코드로 MongoDB Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

MongoDB Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 MongoDB Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“유형, 필수 필드, 열거형 제약 조건” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 MongoDB Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 MongoDB Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 컬렉션에 검증기 추가
  2. 유형, 필수 필드, 열거형 제약 조건
  3. 검증 수준과 작업
  4. 중단 없이 스키마 발전시키기
← MongoDB Academy(으)로 돌아가기