캐싱 전략

캐싱 전략

개요

Rhymix에서 제공하는 다양한 캐싱 기능과 최적화 전략을 소개합니다.

Rhymix 캐싱 시스템

1. Object Cache

메모리 기반 캐싱으로 빠른 데이터 접근을 제공합니다.

// Redis 설정
$rx_defaults->cache = array(
    'type' => 'redis',
    'host' => '127.0.0.1',
    'port' => 6379,
    'dbindex' => 1,
);

// Memcached 설정
$rx_defaults->cache = array(
    'type' => 'memcached',
    'servers' => array(
        array('127.0.0.1', 11211, 1),
    ),
);

2. Template Cache

템플릿 컴파일 결과를 캐싱하여 성능을 향상시킵니다.

// 템플릿 캐시 사용
Context::set('use_template_cache', true);

// 특정 템플릿 캐시 무효화
FileHandler::removeFilesInDir('./files/cache/template');

3. Query Cache

데이터베이스 쿼리 결과를 캐싱합니다.

// 쿼리 캐시 사용
$output = executeQueryArray('module.getDocumentList', $args, $cache_key);

// 캐시 TTL 설정
$output = executeQueryArray('module.getDocumentList', $args, array(
    'cache_key' => $cache_key,
    'cache_ttl' => 3600 // 1시간
));

페이지 캐싱

Full Page Cache

전체 페이지를 캐싱하여 서버 부하를 줄입니다.

// 페이지 캐시 설정
$rx_defaults->cache['pages'] = array(
    'enabled' => true,
    'ttl' => 3600,
    'exclude' => array('admin', 'member'),
);

Fragment Cache

페이지의 일부분만 캐싱합니다.

// 위젯 캐싱
{@
    $cache_key = 'widget_recent_documents_' . $module_srl;
    $cached_content = CacheHandler::get($cache_key);
}

<!--@if(!$cached_content)-->
    {@$widget_content = Widget::execute('content', $widget_args)}
    {@CacheHandler::put($cache_key, $widget_content, 3600)}
<!--@else-->
    {@$widget_content = $cached_content}
<!--@end-->

{$widget_content}

정적 리소스 캐싱

CSS/JS 최적화

// 자동 병합 및 압축 설정
$rx_defaults->optimize = array(
    'minify_css' => true,
    'minify_js' => true,
    'concat_css' => true,
    'concat_js' => true,
);

이미지 캐싱

# .htaccess 설정
<IfModule mod_headers.c>
    <FilesMatch "\.(jpg|jpeg|png|gif|ico)$">
        Header set Cache-Control "max-age=31536000, public"
    </FilesMatch>
</IfModule>

데이터베이스 최적화

인덱스 최적화

-- 자주 사용되는 쿼리에 인덱스 추가
CREATE INDEX idx_document_list ON documents(module_srl, status, list_order);
CREATE INDEX idx_comment_list ON comments(document_srl, status);

쿼리 최적화

// 필요한 컬럼만 선택
$columnList = array('document_srl', 'title', 'regdate');
$output = DocumentModel::getDocumentList($args, $columnList);

// JOIN 최적화
$query = DB::table('documents')
    ->select(['documents.*', 'member.nick_name'])
    ->leftJoin('member', 'documents.member_srl', '=', 'member.member_srl')
    ->where('module_srl', $module_srl)
    ->limit(20);

CDN 활용

정적 파일 CDN 설정

// config/config.user.inc.php
$rx_defaults->cdn = array(
    'url' => 'https://cdn.example.com',
    'include' => array(
        'common/css/*',
        'common/js/*',
        'modules/*/tpl/css/*',
        'modules/*/tpl/js/*',
        'files/attach/*',
    ),
);

동적 콘텐츠 CDN

// CloudFlare Page Rules 예시
/*
Cache Level: Cache Everything
Edge Cache TTL: 1 hour
*/

캐시 무효화 전략

자동 무효화

// 문서 수정 시 관련 캐시 자동 삭제
function afterUpdateDocument($obj) {
    CacheHandler::delete('document_' . $obj->document_srl);
    CacheHandler::delete('document_list_' . $obj->module_srl);
}

수동 무효화

// 특정 캐시 삭제
CacheHandler::delete($cache_key);

// 패턴으로 캐시 삭제
CacheHandler::deleteByPrefix('widget_*');

// 전체 캐시 비우기
CacheHandler::truncate();

모니터링 및 디버깅

캐시 히트율 확인

// 캐시 통계 확인
$stats = CacheHandler::getStatistics();
debugPrint($stats);

성능 프로파일링

// 실행 시간 측정
$start_time = microtime(true);

// ... 코드 실행 ...

$execution_time = microtime(true) - $start_time;
debugPrint("Execution time: {$execution_time}s");

모범 사례

  1. 적절한 TTL 설정: 콘텐츠 특성에 맞는 캐시 유효 시간 설정
  2. 캐시 워밍: 중요한 페이지는 미리 캐시 생성
  3. 캐시 키 설계: 고유하고 의미 있는 캐시 키 사용
  4. 모니터링: 캐시 효율성을 지속적으로 모니터링

관련 문서