IT/NodeJS

Node.js에서 MongoDB 쿼리 최적화

KeepGooing 2024. 11. 26. 09:34
반응형

Node.js에서 MongoDB 쿼리 최적화

 

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를 사용하는 애플리케이션의 성능을 크게 개선할 수 있습니다.

반응형