[파이썬] mongoengine 시그널(`Signals`) 활용하기

MongoEngine은 MongoDB와 상호작용하는 파이썬 객체 문서 매핑 라이브러리입니다. 이러한 라이브러리를 사용하면 MongoDB에 데이터를 저장, 조회, 수정, 삭제할 수 있습니다.

MongoEngine에서 제공하는 중요한 기능 중 하나는 시그널(Signals)입니다. 시그널은 MongoDB 문서를 만들거나 업데이트, 삭제할 때 특정 이벤트가 발생했을 때 실행되는 콜백 함수입니다. 이를 통해 데이터에 대한 추가적인 로직을 처리하거나, 데이터 일관성 유지 및 검증 등의 작업을 수행할 수 있습니다.

시그널 등록하기

먼저, 시그널을 등록하는 방법부터 알아보겠습니다. 시그널을 등록하기 위해서는 @mongoengine.signals 데코레이터를 사용하고 등록할 모델 클래스에서 해당 이벤트에 맞는 시그널 함수를 정의해야 합니다.

다음 예제는 Post 모델이 생성될 때 호출되는 pre_save 시그널을 등록하는 방법입니다.

import mongoengine
from mongoengine import signals

class Post(mongoengine.Document):
    title = mongoengine.StringField()
    content = mongoengine.StringField()

@signals.pre_save.connect
def add_slug_field(sender, document, **kwargs):
    document.slug = document.title.lower().replace(" ", "-")

위 예제에서 pre_save 시그널은 sender, document, kwargs 세 가지 인자를 받습니다. sender는 시그널을 발생시킨 모델 클래스 자체를 나타내며, document는 해당 객체를 나타냅니다. 이외의 추가적인 정보는 kwargs로서 전달됩니다.

시그널 함수에서는 document를 변경하거나 추가적인 로직을 수행할 수 있습니다. 위 예제에서는 slug 필드를 생성하여 title 값을 소문자로 변환하고 공백을 -로 대체하였습니다.

시그널 종류

MongoEngine은 다양한 이벤트에 대해 시그널을 제공합니다. 가장 일반적인 시그널 종류는 다음과 같습니다.

시그널 제거하기

시그널을 제거하려면 disconnect() 메서드를 사용합니다. 예를 들어, pre_save 시그널을 제거하는 방법은 다음과 같습니다.

signals.pre_save.disconnect(add_slug_field, sender=Post)

위 예제에서 add_slug_field 함수를 senderPostpre_save 시그널에서 제거하였습니다.

결론

MongoEngine의 시그널을 활용하면 MongoDB 데이터에 대한 추가적인 로직을 처리하거나 검증 작업을 수행할 수 있습니다. 따라서 시그널을 적절히 활용하면 MongoDB 데이터의 일관성과 유효성을 보장할 수 있습니다.