SvelteKit 애플리케이션에서 MongoDB를 사용하고, 그 데이터를 Redis로 캐시하여 성능을 최적화하는 방법을 소개합니다. 이 글에서는 Redis와 MongoDB를 통합하는 방법과 함께, 캐시를 적용하여 더 빠르고 효율적인 데이터를 제공하는 방법을 설명합니다.
1. 환경 설정
먼저, SvelteKit 애플리케이션에서 Redis와 MongoDB를 사용할 수 있도록 환경을 설정해야 합니다.
필요한 패키지 설치
먼저 Redis와 MongoDB를 사용하기 위한 패키지를 설치합니다. 터미널에서 아래 명령어를 실행하여 필요한 라이브러리를 설치합니다:
npm install redis mongodb ioredis
Redis 연결 설정
Redis 연결을 위한 설정을 `src/lib/redis.js` 파일에 작성합니다. 아래 코드처럼 Redis 연결을 설정하고 이를 다른 파일에서 사용할 수 있게 export합니다.
// src/lib/redis.js
import Redis from 'ioredis';
// Redis 연결 설정 (실제 환경에 맞게 수정해야 함)
const redis = new Redis({
host: '192.168.1.10', // Redis 서버 주소
port: 6379, // 기본 포트
password: '', // 패스워드 설정이 필요하다면
});
export default redis;
위 코드에서는 Redis 서버 주소, 포트, 비밀번호를 설정하고, `ioredis` 패키지를 사용해 Redis 클라이언트를 생성한 후 export합니다. 이렇게 설정된 Redis 클라이언트를 다른 파일에서 import하여 사용할 수 있습니다.
2. 캐시 구현
MongoDB에서 데이터를 가져오기 전에 Redis 캐시를 먼저 확인하여 데이터가 이미 캐시되어 있는지 확인합니다. 만약 캐시가 없다면 MongoDB에서 데이터를 조회한 후 Redis에 저장합니다.
캐시 조회 및 저장 로직
캐시 조회 및 저장을 위한 기본적인 로직을 작성합니다. Redis에서 데이터를 조회하고, 데이터가 없으면 MongoDB에서 가져와서 Redis에 저장합니다.
import redis from '$lib/redis';
import { MongoClient } from 'mongodb';
// MongoDB 연결 설정
const mongoClient = new MongoClient('mongodb://localhost:27017');
const db = mongoClient.db('your_database_name');
const collection = db.collection('your_collection_name');
// 예시: 상품 정보 조회
export async function load() {
const productId = 987;
const cacheKey = `product:${productId}`; // 캐시 키 설정
// Redis에서 데이터 조회
let cachedData = await new Promise((resolve, reject) => {
redis.get(cacheKey, (err, data) => {
if (err) {
return reject(err);
}
resolve(data ? JSON.parse(data) : null);
});
});
// 캐시가 없으면 MongoDB에서 조회 후 Redis에 저장
if (!cachedData) {
console.log('캐시가 없어 MongoDB에서 조회');
await mongoClient.connect();
const data = await collection.findOne({ productId });
// MongoDB에서 데이터를 가져왔다면 Redis에 캐시 저장
if (data) {
redis.setex(cacheKey, 3600, JSON.stringify(data)); // 1시간 동안 캐시
cachedData = data;
}
}
return {
props: { data: cachedData },
};
}
코드 설명
- 캐시 조회: `redis.get(cacheKey)`를 통해 Redis에서 캐시된 데이터를 가져옵니다.
- 캐시가 없을 경우: 캐시된 데이터가 없으면, MongoDB에서 데이터를 조회하여 Redis에 캐시하고 반환합니다.
- 캐시 저장: `redis.setex(cacheKey, 3600, JSON.stringify(data))`를 사용하여 1시간 동안 데이터를 Redis에 저장합니다.
3. 캐시 만료 및 관리
Redis에서 저장한 데이터는 일정 시간이 지나면 만료됩니다. 이를 통해 데이터를 최신 상태로 유지할 수 있습니다. Redis는 기본적으로 **만료 시간**을 설정할 수 있으며, 이를 통해 데이터가 일정 시간 후에 자동으로 삭제되도록 할 수 있습니다.
캐시 만료 시간 설정
위 코드에서 `setex`를 사용하여 만료 시간을 설정했습니다. 만약 더 세밀한 만료 시간 설정이나 캐시 정책을 관리하고 싶다면 Redis의 `maxmemory-policy` 등을 활용할 수 있습니다.
캐시 갱신
만약 데이터가 변경되면 캐시도 갱신해야 합니다. 예를 들어, 상품 정보를 업데이트할 때마다 Redis의 해당 캐시를 삭제하고 새로운 데이터를 캐시할 수 있습니다. Redis에서 데이터를 삭제하는 방법은 `del` 명령어를 사용합니다.
redis.del(cacheKey); // 캐시 삭제
redis.setex(cacheKey, 3600, JSON.stringify(updatedData)); // 갱신된 데이터 캐시 저장
4. Redis와 MongoDB의 장점
- 성능 향상: Redis는 메모리 기반 캐시 시스템으로 매우 빠르기 때문에, MongoDB와 같은 데이터베이스의 부담을 줄여줍니다.
- 데이터베이스 부하 감소: 캐시된 데이터를 Redis에서 빠르게 읽을 수 있기 때문에, MongoDB나 다른 데이터베이스에 대한 부하를 줄일 수 있습니다.
- 데이터 최신화 관리: Redis는 캐시 만료 시간 설정을 통해 일정 주기로 데이터를 최신 상태로 유지할 수 있습니다.
5. 결론
이번 글에서는 SvelteKit과 MongoDB를 연동하여 Redis 캐시를 사용하여 성능을 최적화하는 방법에 대해 설명했습니다. 캐시를 잘 활용하면 데이터를 빠르게 조회하고, 데이터베이스의 부하를 줄일 수 있습니다. Redis와 MongoDB의 연동을 통해 더 나은 성능을 제공하는 애플리케이션을 만들 수 있습니다.
'Web > SvelteKit' 카테고리의 다른 글
MongoDB 데이터를 Redis로 캐시 처리하기(예제) (0) | 2025.02.21 |
---|---|
SvelteKit에서 서버 데이터를 클라이언트로 전달시 유의사항 (0) | 2025.02.17 |
SvelteKit에서 "localStorage"를 이용해 배열 순서 변경 관리하기 (0) | 2025.02.17 |
SvelteKit에서 MongoDB 사용하기 (0) | 2025.02.16 |