PHP 프레임워크 – CodeIgniter – 8 – 캐시와 성능 최적화

PHP 프레임워크 - CodeIgniter - 8 - 캐시와 성능 최적화
PHP 프레임워크 – CodeIgniter – 8 – 캐시와 성능 최적화

PHP 프레임워크 – CodeIgniter – 캐시와 성능 최적화

안녕하세요~ 여러분 😊
이번 시간에는 웹 개발의 뒷단에서 큰 역할을 하면서도
많은 분들이 놓치고 있는 “캐시(Cache)”와 성능 최적화에 대해 함께 알아보겠습니다!

웹사이트를 방문했는데 로딩이 느리다면 사용자는 금방 떠나버릴 수도 있어요.
그럴 때 필요한 것이 바로 캐시!
“한 번 계산한 값을 다시 쓰자!”라는 철학을 가진 아주 똑똑한 전략이에요.
마치 밥을 한 번 지어 놓고 여러 번 데워먹는 지혜와 비슷하답니다 🍚🔥


1. 캐시(Cache)란?

**캐시(Cache)**란 이미 처리된 결과를 일정 시간 동안 저장해두었다가
같은 요청이 들어올 때 다시 계산하지 않고 저장된 결과를 응답하는 기술입니다.

예를 들어, 같은 뉴스 페이지를 수천 명이 본다면
매번 DB를 조회하지 말고 한 번만 처리해서 재활용하는 거죠!


2. CodeIgniter에서 지원하는 캐시 방식

CodeIgniter는 다양한 방식의 캐시를 지원합니다:

캐시 종류 설명
File Cache 기본 방식, 파일로 저장
Redis Cache 빠른 성능, 별도 서버 필요
Memcached 대용량 캐시에 적합
APCu PHP 전용 메모리 캐시
Dummy Cache 테스트용 (실제 저장 안 됨)

3. 기본 캐시 설정하기

.env 또는 app/Config/Cache.php에서 설정 가능합니다.

public $handler = 'file';  // file, redis, memcached, etc.
public $backupHandler = 'dummy';
public $storePath = WRITEPATH . 'cache/';

4. 간단한 캐시 사용 예시

$cache = \Config\Services::cache();

// 저장
$cache->save('weather_data', $weatherArray, 600);  // 10분간 저장

// 불러오기
$data = $cache->get('weather_data');

// 삭제
$cache->delete('weather_data');
  • save(키, 값, 만료시간(초))
  • get(키)
  • delete(키)

5. 실전 예시: 뉴스 목록 캐시

public function news()
{
    $cache = \Config\Services::cache();

    $news = $cache->get('latest_news');

    if (!$news) {
        $model = new NewsModel();
        $news = $model->orderBy('created_at', 'desc')->findAll(10);

        $cache->save('latest_news', $news, 300); // 5분 캐시
    }

    return view('news/list', ['news' => $news]);
}

데이터가 자주 바뀌지 않는다면 꼭 캐시를 활용해보세요!
서버의 부하도 줄이고, 사용자 속도도 빠르게 개선됩니다 💨


6. 페이지 캐싱 (Page Caching)

전체 페이지를 캐시할 수도 있어요!

// 컨트롤러 내에서
$this->cachePage(60);  // 60초간 페이지 전체 캐싱

단점: 로그인 정보나 사용자별 페이지가 있을 경우 주의 필요


7. 캐시 드라이버별 장단점 비교

캐시 드라이버 장점 단점
File 설정 쉬움, 기본 지원 속도 느림
Redis 빠름, 키-값 구조 서버 따로 설치 필요
Memcached 대규모 데이터 처리 서버 구성 복잡
APCu PHP 내장, 속도 빠름 CLI에서는 사용 불가
Dummy 테스트용 실제 캐시 안 됨

8. 데이터베이스 쿼리 캐싱

CodeIgniter는 쿼리 결과 자체도 캐시할 수 있어요.

$db = \Config\Database::connect();
$query = $db->table('products')
            ->where('active', 1)
            ->cacheOn()
            ->get();
  • cacheOn()을 사용하면 쿼리 결과를 자동으로 캐시합니다.
  • cacheOff()를 사용하면 캐시 사용 안 함

단, 쿼리 결과는 DB 변경 시 자동 갱신되지 않으므로 사용 시 주의가 필요합니다!


9. 성능 최적화 팁 정리

전략 설명
쿼리 최소화 필요한 칼럼만 선택 (select('name, price'))
N+1 문제 제거 join() 또는 with()로 한 번에 가져오기
로딩 최적화 이미지 lazy-load, 스크립트 async/defer
라우팅 캐시 php spark routes:cache로 라우팅 캐시
뷰 캐싱 cachePage() 활용
컴파일러 캐시 사용 뷰/클래스 파일 캐시를 기본으로 사용함 (자동 처리)

10. Redis 설정 (고급자용)

Redis 설치 후, 아래 설정 필요:

// app/Config/Cache.php
public $handler = 'redis';

public $redis = [
    'host'     => '127.0.0.1',
    'password' => null,
    'port'     => 6379,
    'timeout'  => 0,
    'database' => 0,
];
$cache = \Config\Services::cache();
$cache->save('popular_items', $itemData, 600);

Redis는 대규모 실시간 처리에 아주 적합한 고성능 캐시 서버예요!


주의사항 및 체크리스트 ✅

항목 주의할 점
캐시 데이터 DB 변경 시 캐시 갱신 필요 (수동 삭제 또는 주기적 캐시 무효화)
사용자별 페이지 로그인 상태에 따라 다른 데이터가 나오면 페이지 캐시는 위험
캐시 만료 저장 시 만료 시간 지정 안 하면 영구 저장됨 (꼭 설정하세요!)
보안 캐시에 민감한 정보 저장 금지!
메모리 제한 Redis/APCu는 서버 메모리 제한 주의 필요

마무리하며 😊

웹사이트 속도가 빨라지면 사용자 만족도도 덩달아 쑥쑥 올라가요!
CodeIgniter는 기본적인 캐시 기능부터 고급 Redis 연동까지
모두 지원하고 있어 아주 훌륭한 선택지랍니다.

오늘 배운 캐시와 성능 최적화 기법을 프로젝트에 적극적으로 활용해보세요!
사이트의 로딩 속도가 빨라지고, 서버의 부담도 훨씬 줄어들 거예요 😄🚀

다음 시간에는 유닛 테스트와 자동화된 코드 품질 점검에 대해 배워볼게요.
오늘도 좋은 하루 되시고, 빠르고 가벼운 웹사이트 만들기 성공하세요~ 💪💻✨

답글 남기기