[python] Marshmallow와 Redis를 활용한 캐싱 및 성능 향상 기법

서론

최근에 대용량 데이터를 다루는 웹 애플리케이션을 개발한다면, 성능 문제가 항상 주요 관심사 중 하나입니다. 데이터베이스에서 데이터를 가져오는 작업은 많은 시간과 리소스를 소비할 수 있기 때문에, 이를 최적화하기 위한 다양한 기법이 필요합니다. 이번 글에서는 Marshmallow와 Redis를 조합하여 캐싱을 사용하여 성능을 향상시키는 방법에 대해 알아보겠습니다.

Marshmallow 소개

Marshmallow는 Python에서 데이터 직렬화 및 유효성 검사를 수행하는 라이브러리입니다. 데이터를 직렬화하면, JSON, XML, YAML 등과 같은 형식으로 데이터를 교환하거나 저장할 수 있습니다. Marshmallow는 데이터 직렬화를 간단하게 처리할 수 있는 많은 기능을 제공합니다.

Redis 소개

Redis는 인-메모리 데이터 구조 저장소로, 빠른 읽기 및 쓰기 작업을 지원합니다. Redis는 키-값 구조를 사용하여 데이터를 저장하며, 다양한 데이터 유형을 지원합니다. 캐시 저장소로 사용하기에 이상적인 선택입니다.

캐싱 기법

매번 데이터베이스로부터 데이터를 가져와야 하면, 성능이 저하될 수 있습니다. 이를 방지하기 위해 데이터를 캐싱하여 임시로 저장하고 사용합니다. 이를 통해 데이터를 더 빠르게 검색할 수 있으며, 데이터베이스 부하를 줄일 수 있습니다. Redis는 캐싱에 이상적인 선택이며, 데이터를 메모리에 저장하기 때문에 빠른 응답 시간을 제공합니다.

Marshmallow와 Redis를 통한 캐싱 구현

Marshmallow를 사용하여 데이터를 직렬화한 다음, Redis에 저장합니다. 이를 통해 이후에 동일한 데이터에 대한 요청이 들어올 때, 데이터베이스에서 다시 읽어오지 않고 Redis에서 데이터를 가져옵니다. 이를 통해 데이터베이스 부하를 줄이고 성능을 향상시킬 수 있습니다.

from marshmallow import Schema, fields
import redis

# Redis 연결 설정
r = redis.Redis(host='localhost', port=6379, db=0)

# Marshmallow 스키마
class UserSchema(Schema):
    id = fields.Int()
    name = fields.Str()

# 데이터베이스에서 데이터를 가져오는 함수
def get_user_data(user_id):
    # 데이터베이스에서 데이터를 가져오는 로직
    ...

# 데이터 캐싱 함수
def cache_user_data(user_id, data):
    # 데이터를 Marshmallow 스키마로 직렬화
    schema = UserSchema()
    serialized_data = schema.dump(data)

    # Redis에 데이터 저장
    r.set(f"user:{user_id}", serialized_data)

# 데이터 가져오기 함수
def get_cached_user_data(user_id):
    # Redis에서 데이터 가져오기
    data = r.get(f"user:{user_id}")

    if data:
        # Redis에서 데이터가 존재하면 Marshmallow 스키마로 역직렬화
        schema = UserSchema()
        deserialized_data = schema.load(data)

        return deserialized_data
    else:
        # Redis에 데이터가 없을 경우 데이터베이스에서 가져오기
        data = get_user_data(user_id)

        # 데이터 캐싱
        cache_user_data(user_id, data)

        return data

위의 코드는 Marshmallow로 User 데이터를 직렬화하고 Redis에 저장하는 예시입니다. get_cached_user_data 함수를 통해 데이터를 가져오면, 먼저 Redis에 해당하는 데이터가 있는지 확인하고 있으면 Marshmallow 스키마를 통해 데이터를 역직렬화하여 반환합니다. 그렇지 않은 경우, 데이터베이스에서 데이터를 가져와 캐싱한 다음 반환합니다.

결론

Marshmallow와 Redis를 조합하여 데이터 캐싱을 구현하면, 데이터베이스에서 데이터를 반복적으로 가져오는 성능 문제를 해결할 수 있습니다. 캐싱을 통해 데이터 검색 속도를 향상시키고 데이터베이스 부하를 줄일 수 있습니다. Marshmallow와 Redis는 개발자들에게 많은 이점을 제공하므로, 적극적으로 활용해보는 것을 추천합니다.

참고 자료