MongoDB에서 데이터 무결성을 유지하려면 validator를 사용하여 유효성 검사 규칙을 설정할 수 있습니다. 이 글에서는 $jsonSchema를 활용해 컬렉션 생성 시 필수 필드와 데이터 타입을 지정하고, 규칙에 맞지 않는 문서의 삽입이 어떻게 차단되는지 실제 예제로 살펴보겠습니다.
1. 유효성 검사 규칙이 적용된 컬렉션 생성
컬렉션을 생성할 때 validator 옵션과 함께 $jsonSchema>를 지정하면, 문서 구조에 대한 검증 규칙을 정의할 수 있습니다. 아래 예제는 FirstName과 LastName 두 필드를 필수(string 타입)로 요구하는 컬렉션입니다.
> db.createCollection("demo437", {
... validator: { $jsonSchema: {
... bsonType: "object",
... required: ["FirstName", "LastName"],
... properties: {
... FirstName: {
... bsonType: "string",
... description: "This is required" },
... LastName: {
... bsonType: "string",
... description: "This is required" }
... }
... }}
})
{ "ok" : 1 }{ "ok" : 1 }이 반환되면 유효성 검사 규칙이 정상적으로 적용된 것입니다.
2. 유효성 검사 동작 확인하기
규칙을 위반하는 문서 삽입 시
이제 문서를 삽입해 보겠습니다. LastName에 문자열이 아닌 숫자(1234)를 넣으면 어떻게 될까요?
> db.demo437.insertOne({"FirstName":"John","LastName":1234});
2020-03-22T17:49:55.590+0530 E QUERY [js] WriteError: Document failed validation :
WriteError({
"index" : 0,
"code" : 121,
"errmsg" : "Document failed validation",
"op" : {
"_id" : ObjectId("5e7757ebbbc41e36cc3cae9a"),
"FirstName" : "John",
"LastName" : 1234
}
})에러 코드 121(Document failed validation)과 함께 삽입이 거부됩니다. 반대로 모든 조건을 충족하는 문서는 정상적으로 저장됩니다.
> db.demo437.insertOne({"FirstName":"John","LastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e7757f7bbc41e36cc3cae9b")
}다른 필드에서 타입 위반이 발생한 경우
마찬가지로 FirstName에 숫자를 넣어도 유효성 검사에 실패합니다.
> db.demo437.insertOne({"FirstName":9887,"LastName":"Miller"});
2020-03-22T17:50:29.631+0530 E QUERY [js] WriteError: Document failed validation :
WriteError({
"index" : 0,
"code" : 121,
"errmsg" : "Document failed validation",
"op" : {
"_id" : ObjectId("5e77580dbbc41e36cc3cae9c"),
"FirstName" : 9887,
"LastName" : "Miller"
}
})모든 필드가 string 타입으로 올바르게 입력된 문서만 성공적으로 저장됩니다.
> db.demo437.insertOne({"FirstName":"David","LastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e775816bbc41e36cc3cae9d")
}3. 저장된 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.demo437.find();
실행 결과는 다음과 같습니다. 유효성 검사를 통과한 두 개의 문서만 저장된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e7757f7bbc41e36cc3cae9b"), "FirstName" : "John", "LastName" : "Smith" }
{ "_id" : ObjectId("5e775816bbc41e36cc3cae9d"), "FirstName" : "David", "LastName" : "Miller" }정리
MongoDB의 $jsonSchema 기반 validator를 사용하면 스키마 수준의 데이터 검증이 가능합니다. 이를 통해 잘못된 타입의 데이터나 필수 필드가 누락된 문서가 데이터베이스에 저장되는 것을 사전에 방지할 수 있으며, 애플리케이션 코드 수정 없이도 데이터 품질을 일관되게 유지할 수 있습니다.