[python] Marshmallow의 필터링, 검색 및 정렬을 통한 데이터 조회 방법

Marshmallow는 파이썬의 직렬화 및 역직렬화 라이브러리로, 데이터 조회를 위한 필터링, 검색 및 정렬 기능을 제공합니다. 이 기능들을 활용하여 효율적으로 원하는 데이터를 조회하는 방법에 대해 알아보겠습니다.

필터링

Marshmallow를 사용하여 데이터를 필터링하는 방법은 간단합니다. 먼저 필터링을 원하는 필드를 정의해야 합니다. 이를 위해 필드에 load_only 또는 dump_only 옵션을 사용할 수 있습니다.

예를 들어, 다음과 같은 사용자 데이터를 가진 User 클래스가 있다고 가정해 봅시다.

class User(Schema):
    id = fields.Int()
    name = fields.Str()
    email = fields.Email()
    password = fields.Str(load_only=True)

위의 예시 코드에서 password 필드에 load_only 옵션을 사용함으로써, 이 필드는 직렬화되지 않고 역직렬화만 가능하게 됩니다. 따라서 필터링을 위해 password 값을 사용할 수 없습니다.

이제 필터링을 적용하여 원하는 데이터를 조회해봅시다.

from marshmallow import Schema, fields

# User 데이터 생성
user_data = [
    {"id": 1, "name": "John", "email": "john@example.com", "password": "password1"},
    {"id": 2, "name": "Alice", "email": "alice@example.com", "password": "password2"},
]

# User 데이터를 User 스키마에 로드
user_schema = User(many=True)
users = user_schema.load(user_data)

# 이메일이 "example.com"으로 끝나는 사용자 필터링
filtered_users = [user for user in users if user['email'].endswith("example.com")]

# 필터링된 사용자 출력
for user in filtered_users:
    print(user)

위의 예제 코드에서 filtered_users는 이메일이 “example.com”으로 끝나는 사용자 데이터만 필터링한 결과입니다. 이렇게 필터링을 통해 원하는 조건에 맞는 데이터만 조회할 수 있습니다.

검색

Marshmallow는 필터링 외에도 데이터 검색을 지원합니다. 데이터 검색을 위해서는 데이터를 인덱싱하고 검색할 수 있는 구조를 만들어야 합니다.

예를 들어, 사용자 데이터를 이메일로 검색할 수 있는 인덱싱된 구조를 구현해보겠습니다.

from marshmallow import Schema, fields
from collections import defaultdict

class User(Schema):
    id = fields.Int()
    name = fields.Str()
    email = fields.Email()
    password = fields.Str(load_only=True)

# User 데이터 생성
user_data = [
    {"id": 1, "name": "John", "email": "john@example.com", "password": "password1"},
    {"id": 2, "name": "Alice", "email": "alice@example.com", "password": "password2"},
]

# User 데이터를 User 스키마에 로드
user_schema = User(many=True)
users = user_schema.load(user_data)

# 이메일을 키로 가지는 인덱스 생성
email_index = defaultdict(list)
for user in users:
    email_index[user['email']].append(user)

# 이메일로 사용자 검색
search_email = "john@example.com"
search_results = email_index.get(search_email, [])

# 검색 결과 출력
for user in search_results:
    print(user)

위의 예시 코드에서 email_index는 이메일을 키로 가지고 해당 이메일을 가진 사용자들을 값으로 가지는 인덱싱된 구조입니다. 따라서 email_index를 통해 이메일로 사용자를 검색할 수 있습니다.

정렬

Marshmallow를 사용하여 데이터를 정렬하는 방법은 간단합니다. 정렬을 원하는 필드에 ordered=True 옵션을 추가하기만 하면 됩니다.

다음은 사용자 데이터를 나이로 정렬하는 예시 코드입니다.

class User(Schema):
    id = fields.Int()
    name = fields.Str()
    email = fields.Email()
    age = fields.Int(ordered=True)

# User 데이터 생성
user_data = [
    {"id": 1, "name": "John", "email": "john@example.com", "age": 30},
    {"id": 2, "name": "Alice", "email": "alice@example.com", "age": 25},
    {"id": 3, "name": "Bob", "email": "bob@example.com", "age": 35},
]

# User 데이터를 User 스키마에 로드 및 나이로 정렬
user_schema = User(many=True)
users = user_schema.load(user_data, many=True)
sorted_users = sorted(users, key=lambda user: user['age'])

# 정렬된 사용자 출력
for user in sorted_users:
    print(user)

위의 예제 코드에서 age 필드에 ordered=True 옵션을 사용하여 나이로 정렬하였습니다. sorted 함수를 사용하여 필드를 기준으로 사용자 데이터를 정렬할 수 있습니다.

결론

Marshmallow는 필터링, 검색 및 정렬을 통해 데이터 조회를 편리하게 할 수 있는 기능을 제공합니다. 이를 활용하여 원하는 데이터를 효율적으로 조회하고 처리할 수 있습니다. 다양한 기능을 조합하여 필요한 데이터를 찾는 데 사용할 수 있으니, 적절하게 활용해보세요.