[python] Marshmallow에서 사용자 정의 필드를 만들고 활용하는 방법

Marshmallow는 파이썬에서 JSON 직렬화 및 역직렬화를 위한 강력한 라이브러리입니다. 기본 제공 필드 외에도 사용자 정의 필드를 만들어서 복잡한 데이터 유형을 직렬화하거나 역직렬화하는 것이 가능합니다. 이번 블로그 포스트에서는 Marshmallow에서 사용자 정의 필드를 만들고 활용하는 방법에 대해 알아보겠습니다.

사용자 정의 필드 만들기

사용자 정의 필드를 만들려면 Marshmallow의 fields.Field 클래스를 상속받아 새로운 필드를 정의해야 합니다. 다음은 간단한 예시입니다.

from marshmallow import fields

class CustomField(fields.Field):
    def _serialize(self, value, attr, obj, **kwargs):
        # 필드의 값을 직렬화하는 로직을 구현합니다.
        # value는 필드의 값, attr은 필드의 속성, obj는 직렬화할 객체를 나타냅니다.
        # 직렬화된 값을 반환합니다.
        pass

    def _deserialize(self, value, attr, data, **kwargs):
        # 필드의 값을 역직렬화하는 로직을 구현합니다.
        # value는 직렬화된 값, attr은 필드의 속성, data는 역직렬화할 데이터를 나타냅니다.
        # 역직렬화된 값을 반환합니다.
        pass

사용자 정의 필드에서는 _serialize 메서드와 _deserialize 메서드를 구현해야 합니다. _serialize 메서드는 필드의 값을 직렬화하고, _deserialize 메서드는 직렬화된 값을 역직렬화합니다.

사용자 정의 필드 활용하기

사용자 정의 필드를 활용하기 위해서는 해당 필드를 Marshmallow 스키마에 추가해야 합니다. 예를 들어, 다음과 같은 JSON 형태의 데이터를 직렬화하고 역직렬화하는 스키마를 만들어봅시다.

from marshmallow import Schema, fields

class MySchema(Schema):
    custom_field = CustomField()

data = {
    'custom_field': 'example'
}

# 직렬화
result = MySchema().dump(data)
print(result)  # {'custom_field': 'example'}

# 역직렬화
result = MySchema().load(result)
print(result)  # {'custom_field': 'example'}

위 예시에서는 MySchema 클래스에 custom_field라는 이름의 필드를 추가했습니다. 이 필드는 CustomField로 정의된 사용자 정의 필드입니다. 필드가 직렬화 및 역직렬화 과정에서 정상적으로 작동하게끔 앞서 구현한 _serialize_deserialize 메서드를 채워넣어야 합니다.

결론

Marshmallow를 사용하여 파이썬 객체를 JSON으로 직렬화하고 역직렬화하는 과정에서 사용자 정의 필드를 만들어 활용할 수 있습니다. 사용자 정의 필드를 만드는 방법과 해당 필드를 스키마에 추가하여 사용하는 방법을 알아보았습니다. Marshmallow의 강력한 기능을 활용하여 다양한 데이터 유형을 다룰 수 있습니다.

참고 자료