tech2 min read9 views
PostgreSQL + Redis 캐싱 전략: 실전 패턴 가이드
API 응답 캐싱부터 캐시 무효화까지, 실제 프로젝트에서 사용한 Redis 캐싱 전략을 공유합니다.
#PostgreSQL#Redis#Caching#Performance
PostgreSQL + Redis 캐싱 전략: 실전 패턴 가이드
왜 캐싱이 필요한가?
데이터베이스 쿼리는 네트워크 I/O, 디스크 I/O, 쿼리 파싱 등 여러 단계를 거칩니다. 자주 요청되는 데이터를 메모리에 캐싱하면 응답 시간을 10배 이상 단축할 수 있습니다.
캐싱 전략
1. HTTP 캐시 인터셉터
NestJS의 Interceptor 패턴을 활용하여 API 응답을 자동 캐싱합니다:
@Injectable()
export class HttpCacheInterceptor implements NestInterceptor {
constructor(private readonly cacheService: CacheService) {}
async intercept(context: ExecutionContext, next: CallHandler) {
const key = \`api:\${request.url}\`;
const cached = await this.cacheService.get(key);
if (cached) return of(JSON.parse(cached));
return next.handle().pipe(
tap(data => this.cacheService.set(key, JSON.stringify(data), 3600))
);
}
}2. 캐시 무효화
데이터 변경 시 관련 캐시를 즉시 삭제합니다:
- **발행/비발행 토글**: `blog:latest` 캐시 삭제
- **프로젝트 수정**: `projects:*` 패턴 매칭 삭제
- **시드 데이터**: `FLUSHDB`로 전체 초기화
3. 3단계 캐시 무효화
| Layer | 캐시 | TTL | 무효화 |
|-------|------|-----|--------|
| Redis | API 응답 | 1시간 | DEL key |
| Next.js ISR | 페이지 캐시 | 300초 | 재빌드 |
| Browser | HTTP 캐시 | max-age | Cache-Control |
성능 측정 결과
| 시나리오 | 캐시 미스 | 캐시 히트 | 개선율 |
|---------|----------|----------|--------|
| 프로젝트 목록 | 180ms | 12ms | 15x |
| 블로그 상세 | 95ms | 8ms | 12x |
| 최신 글 3개 | 65ms | 5ms | 13x |
주의사항
- 캐시 일관성: 데이터 변경 시 반드시 관련 캐시 삭제
- TTL 설정: 너무 길면 stale data, 너무 짧으면 캐시 효과 감소
- 메모리 관리: Redis maxmemory 정책 설정 필수