MongoDB 인덱스란 무엇인가?
MongoDB에서 인덱스(Index)는 데이터 조회 속도를 크게 향상시키는 핵심 기능입니다. 인덱스가 없으면 MongoDB는 컬렉션의 모든 문서를 하나씩 스캔해야 하지만, 인덱스를 사용하면 특정 필드를 기준으로 빠르게 문서를 찾을 수 있습니다.
MongoDB에서 인덱스를 생성하려면 ensureIndex() 메서드를 사용합니다. 참고로 최신 버전의 MongoDB에서는 ensureIndex()가 deprecated(사용 중단 권고) 상태이므로, 동일한 역할을 하는 createIndex() 사용이 권장됩니다.
1단계: 테스트용 컬렉션 생성
먼저 다음 쿼리로 컬렉션을 생성합니다.
> db.createCollection("creatingUniqueIndexDemo");
{ "ok" : 1 }컬렉션이 정상적으로 생성되면 { "ok" : 1 } 응답이 반환됩니다.
2단계: 고유(Unique) 인덱스 생성
이제 위에서 만든 컬렉션에 UserCountryName 필드를 기준으로 고유 인덱스를 생성합니다. unique: true 옵션을 지정하면 해당 필드에 중복된 값이 저장되는 것을 방지할 수 있습니다.
> db.creatingUniqueIndexDemo.ensureIndex({"UserCountryName":1},{unique:true});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}결과를 보면 인덱스 수가 1개(_id 기본 인덱스)에서 2개로 증가한 것을 확인할 수 있습니다.
3단계: 문서 삽입 및 중복 오류 확인
생성된 컬렉션에 문서를 삽입해 보겠습니다.
> db.creatingUniqueIndexDemo.insertOne({"UserName":"John","UserAge":21,"UserCountryName":"US"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9947bd330fd0aa0d2fe4d8")
}
> db.creatingUniqueIndexDemo.insertOne({"UserName":"Mike","UserAge":23,"UserCountryName":"UK"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9947c9330fd0aa0d2fe4d9")
}John(US)과 Mike(UK)는 서로 다른 국가 코드를 가지고 있어 정상적으로 삽입되었습니다. 그런데 이번에는 이미 존재하는 US 값을 가진 문서를 삽입해 보겠습니다.
> db.creatingUniqueIndexDemo.insertOne({"UserName":"Robert","UserAge":26,"UserCountryName":"US"});
2019-03-26T02:57:52.670+0530 E QUERY [js] WriteError: E11000 duplicate key error collection: test.creatingUniqueIndexDemo index: UserCountryName_1 dup key: { : "US" } :E11000 duplicate key error 오류가 발생했습니다. 이는 고유 인덱스가 설정된 UserCountryName 필드에 이미 존재하는 값 US를 중복해서 삽입하려 했기 때문입니다. 이처럼 unique 인덱스는 데이터 무결성을 보장하는 강력한 도구입니다.
이번에는 다른 국가 코드를 사용해 다시 삽입해 보겠습니다.
> db.creatingUniqueIndexDemo.insertOne({"UserName":"Robert","UserAge":26,"UserCountryName":"AUS"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9947e3330fd0aa0d2fe4db")
}중복되지 않는 값이므로 정상적으로 삽입됩니다.
4단계: find()로 전체 문서 조회
find() 메서드를 사용해 컬렉션의 모든 문서를 조회합니다.
> db.creatingUniqueIndexDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9947bd330fd0aa0d2fe4d8"),
"UserName" : "John",
"UserAge" : 21,
"UserCountryName" : "US"
}
{
"_id" : ObjectId("5c9947c9330fd0aa0d2fe4d9"),
"UserName" : "Mike",
"UserAge" : 23,
"UserCountryName" : "UK"
}
{
"_id" : ObjectId("5c9947e3330fd0aa0d2fe4db"),
"UserName" : "Robert",
"UserAge" : 26,
"UserCountryName" : "AUS"
}정리
MongoDB에서 인덱스 생성 절차를 요약하면 다음과 같습니다.
① createCollection()으로 컬렉션 생성 → ② ensureIndex()(또는 최신 버전의 createIndex())에 unique: true 옵션을 지정해 고유 인덱스 생성 → ③ 중복 값 삽입 시 E11000 오류 발생 여부로 인덱스 동작 검증 → ④ find()로 결과 확인.
고유 인덱스를 활용하면 애플리케이션 레벨의 별도 검증 로직 없이도 데이터베이스 차원에서 중복 데이터를 효과적으로 방지할 수 있습니다.