[파이썬] requests 캐시 백엔드 연동

HTTP 요청을 처리하는 Python 라이브러리인 Requests는 간단하고 사용하기 쉬운 인터페이스를 제공합니다. 하지만 실제로 요청을 보내는 과정에서 반복적으로 동일한 요청을 처리해야 한다면, 캐시를 사용하여 이전 응답을 재사용할 수 있습니다.

캐시는 이전에 요청한 응답을 저장하는 임시 저장소로, 동일한 요청이 들어올 경우 재사용하여 네트워크 부담을 줄여줍니다. 이를 효과적으로 활용하기 위해서는 캐시 백엔드와 Requests 라이브러리를 연동하는 과정이 필요합니다.

캐시 백엔드 선택하기

먼저 캐시 백엔드를 선택해야 합니다. 여러 가지 캐시 백엔드 중에서는 Redis, Memcached, SQLite, MongoDB와 같은 다양한 선택지가 있습니다. 이 예제에서는 SQLite를 사용하여 캐시 백엔드를 구성하는 방법을 알아보겠습니다.

SQLite를 이용한 캐시 백엔드 설정

먼저 sqlite3 모듈을 설치해야 합니다. 다음 명령을 사용하여 설치할 수 있습니다:

pip install pysqlite3

가상환경이나 서버에서 설치한 후에는 sqlite3 모듈을 import하여 사용할 수 있습니다:

import sqlite3

SQLite는 단일 파일 기반의 데이터베이스이므로 별도의 서버 설정이 필요하지 않습니다. 따라서 캐시 백엔드로 SQLite를 사용하는 것은 간편합니다.

SQLAlchemy를 통한 SQLite 연동

Requests 라이브러리에서 SQLite를 사용하기 위해서는 SQLAlchemy를 통해 SQLite 데이터베이스에 연결해야 합니다.

from sqlalchemy import create_engine

cache_backend = create_engine('sqlite:///cache.db')

위의 예제 코드에서는 create_engine 함수를 사용하여 SQLite 데이터베이스에 연결합니다. sqlite:///cache.dbcache.db 파일이 현재 디렉토리에 생성되어 있다고 가정한 것입니다.

Requests에서 SQLite 캐시 백엔드 사용하기

Requests의 세션(session) 객체를 생성하여 SQLite 캐시 백엔드를 사용할 수 있습니다. 세션 객체는 앞에서 설정한 cache_backend를 인자로 받습니다:

import requests

session = requests.session()
session.mount('http://', requests_cache.backends.sqlite.SQLiteCache(control=session-cache.db))

위의 코드는 requests_cache.backends.sqlite.SQLiteCache를 사용하여 세션 객체를 생성하고, 세션을 마운트합니다. 이렇게 생성된 세션 객체(session)를 통해 모든 요청을 보낼 수 있습니다. 이후 동일한 요청이 들어왔을 때, 이전 응답을 캐시에서 가져오게 됩니다.

캐시 제어하기

Requests에서 제공하는 캐시 관련 옵션을 사용하여 캐시 동작을 제어할 수 있습니다. 예를 들어, 캐시를 비활성화하려면 다음과 같이 설정할 수 있습니다:

session = requests.session()
session.cache = False

세션에 대한 캐시정책을 커스터마이징하고자 한다면 다음과 같이 설정할 수 있습니다:

session = requests.session()
session.cache = requests_cache.backends.sqlite.SQLiteCache(control=db_path,
                                                          allowable_methods=('GET', 'POST'),
                                                          expire_after=3600)

위의 예제에서 control 매개변수는 SQLite 데이터베이스 파일 경로를 나타내며, allowable_methods는 캐싱할 요청 방식을 지정합니다. 그리고 expire_after는 캐시 유지 시간을 초 단위로 설정합니다.

마치며

이번 포스트에서는 Requests 라이브러리와 SQLite 캐시 백엔드를 연동하는 방법에 대해 알아보았습니다. 이를 통해 반복되는 동일한 요청을 효율적으로 처리하고 네트워크 부담을 줄일 수 있습니다. 다양한 캐시 백엔드를 활용하여 요청 성능을 향상시킬 수 있으니, 필요에 따라 다른 캐시 백엔드와의 연동 방법도 살펴보시기 바랍니다.

Happy coding!