Node.js와 MongoDB를 함께 사용할 때 쿼리 성능은 애플리케이션의 전반적인 성능에 큰 영향을 미칩니다.
이 글에서는 Node.js 환경에서 MongoDB 쿼리를 최적화하는 주요 전략과 기법을 살펴보겠습니다.
1. 인덱싱 활용
인덱싱은 MongoDB 쿼리 최적화의 기본입니다. 자주 사용되는 필드에 인덱스를 생성하여 쿼리 성능을 크게 향상시킬 수 있습니다.
// 인덱스 생성
db.collection.createIndex({ fieldName: 1 });
// 복합 인덱스 생성
db.collection.createIndex({ field1: 1, field2: -1 });
// Node.js에서 인덱스 생성
await collection.createIndex({ fieldName: 1 });
팁: explain() 메서드를 사용하여 쿼리가 인덱스를 효과적으로 사용하고 있는지 확인할 수 있습니다.
2. 쿼리 구조 최적화
효율적인 쿼리 구조는 성능 향상에 중요합니다. 프로젝션과 적절한 연산자 사용으로 쿼리를 최적화할 수 있습니다.
// 프로젝션 사용
const result = await collection.find({ status: "active" }, { name: 1, email: 1 }).toArray();
// $in 연산자 대신 $or 사용 (소규모 데이터셋의 경우)
const result = await collection.find({
$or: [{ category: "A" }, { category: "B" }]
}).toArray();
주의: $where 연산자 사용을 피하고, 대규모 배열에 대해 $in 및 $nin 연산자를 주의해서 사용하세요.
3. 페이지네이션 구현
대량의 데이터를 처리할 때 페이지네이션을 사용하여 쿼리 성능을 개선할 수 있습니다.
const pageSize = 20;
const page = 1;
const result = await collection
.find()
.skip((page - 1) * pageSize)
.limit(pageSize)
.toArray();
4. 집계 파이프라인 최적화
복잡한 데이터 처리에는 MongoDB의 집계 파이프라인을 활용해야하는데,
초기 단계에서 데이터를 필터링하여 처리할 문서 수를 줄이는 것이 중요합니다.
const result = await collection.aggregate([
{ $match: { status: "active" } },
{ $group: { _id: "$category", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]).toArray();
5. 캐싱 구현
자주 액세스하는 데이터에 대해 캐싱을 구현하여 데이터베이스 쿼리 수를 줄일 수 있습니다.
const NodeCache = require("node-cache");
const cache = new NodeCache({ stdTTL: 100, checkperiod: 120 });
async function getCachedData(key) {
let value = cache.get(key);
if (value === undefined) {
value = await collection.findOne({ _id: key });
cache.set(key, value);
}
return value;
}
6. 성능 모니터링
MongoDB의 프로파일러를 사용하여 쿼리 성능을 모니터링하고 최적화가 필요한 쿼리를 식별하세요.
// 프로파일러 활성화
await db.command({ profile: 2, slowms: 100 });
// 프로파일 데이터 조회
const profileData = await db.collection('system.profile').find().toArray();
console.log(profileData);
결론
Node.js에서 MongoDB 쿼리를 최적화하는 것은 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 인덱싱, 효율적인 쿼리 구조, 페이지네이션, 집계 파이프라인 최적화, 캐싱, 그리고 지속적인 성능 모니터링을 통해 데이터베이스 쿼리의 효율성을 극대화할 수 있습니다. 이러한 기법들을 적절히 조합하여 사용하면, Node.js와 MongoDB를 사용하는 애플리케이션의 성능을 크게 개선할 수 있습니다.