백엔드 개발에서 캐시 시스템은 성능 최적화와 데이터 엑세스 시간을 줄이는 데 큰 역할을 합니다. 이번 글에서는 Redis를 활용한 간단한 캐시 시스템을 구축하는 미니 프로젝트를 진행해 보겠습니다. Redis는 메모리 기반의 데이터 구조 저장소로, 빠른 속도와 다양한 데이터 구조를 지원합니다. 이를 통해 우리는 효율적인 캐시 시스템을 구현할 수 있습니다.
프로젝트 환경 설정
먼저, 프로젝트에서 사용할 기술 스택을 정리하겠습니다:
- 언어: Python
- 웹 프레임워크: Flask
- 데이터베이스: Redis
1. Redis 설치
Redis를 설치하기 위해 먼저 패키지 관리자를 통해 설치할 수 있습니다. Ubuntu 기준으로 Redis를 설치하는 방법은 다음과 같습니다:
sudo apt update
sudo apt install redis-server
설치가 완료되면 Redis 서버를 시작합니다:
sudo service redis-server start
2. Flask 프로젝트 설정
Flask 프로젝트를 생성하고 필요한 라이브러리를 설치합니다. 아래 명령어를 통해 Flask와 Redis 클라이언트를 설치하세요:
pip install Flask redis
이제 간단한 Flask 애플리케이션을 만들어 보겠습니다. app.py 파일을 생성하고 다음 코드를 작성합니다.
from flask import Flask, jsonify
import redis
app = Flask(__name__)
cache = redis.Redis(host='localhost', port=6379, db=0)
@app.route('/data/<int:key>', methods=['GET'])
def get_data(key):
# 캐시에서 데이터 조회
cached_data = cache.get(key)
if cached_data:
return jsonify({"data": cached_data.decode('utf-8'), "source": "cache"})
# 데이터베이스에서 데이터 조회 (여기서는 예시로 고정된 데이터를 사용)
data = f"Data for key {key}"
# 캐시 저장
cache.set(key, data)
return jsonify({"data": data, "source": "database"})
if __name__ == '__main__':
app.run(debug=True)
위 코드에서 /data/<int:key> 경로로 GET 요청이 들어오면, 먼저 Redis 캐시에서 해당 데이터를 조회합니다. 데이터가 캐시에 존재하면 그 데이터를 반환하고, 그렇지 않으면 데이터베이스에서 데이터를 조회한 뒤 캐시에 저장하고 반환합니다.
3. 캐시 테스트
Flask 애플리케이션을 실행하기 위해 터미널에서 다음 명령어를 입력합니다:
python app.py
이제 웹 브라우저나 Postman을 통해 http://localhost:5000/data/1로 접근해 보세요. 처음 요청 시에는 데이터베이스에서 데이터를 조회하고 캐시에 저장합니다. 다음 번에 같은 요청을 할 경우 캐시에서 데이터를 가져오는 것을 확인할 수 있습니다.
curl http://localhost:5000/data/1
# 두 번째 요청: {"data": "Data for key 1", "source": "cache"}
4. 캐시 만료 설정
Redis에서는 캐시의 만료 시간을 설정할 수 있습니다. 이를 통해 캐시가 자동으로 삭제되도록 할 수 있습니다. 아래와 같이 cache.set 메서드에 ex 인자를 추가하여 만료 시간을 초 단위로 설정할 수 있습니다.
# 캐시 저장 (10초 후 만료)
cache.set(key, data, ex=10)
이렇게 하면 캐시된 데이터는 10초 후에 만료되어 다음 요청 시에는 다시 데이터베이스에서 데이터를 조회하게 됩니다.
5. 예외 처리 추가
실제 환경에서는 예외 처리도 중요합니다. Redis 서버가 다운되거나 연결할 수 없는 경우를 대비해 적절한 예외를 처리하는 로직을 추가하는 것이 좋습니다.
try:
cached_data = cache.get(key)
except redis.ConnectionError:
return jsonify({"error": "Cache server is not reachable"}), 500
마무리
Redis를 사용한 캐시 시스템 구현을 통해 성능 최적화를 경험해 보았습니다. Flask와 Redis를 결합하여 간단한 API를 구축하고, 데이터 캐싱의 기본 흐름을 확인했습니다. 이러한 기법은 데이터베이스에 대한 불필요한 요청을 줄이고, 사용자 경험을 향상시키는 데 큰 도움이 됩니다. 앞으로도 다양한 캐시 전략과 Redis의 고급 기능을 활용하여 더욱 효율적인 백엔드 시스템을 구축해 보시기 바랍니다.