[파이썬] mongoengine 타 서비스와의 데이터 연동 전략

Mongoengine은 Python에서 MongoDB와 상호 작용하기 위한 객체 문서 매핑 라이브러리입니다. 이러한 라이브러리를 사용하면 MongoDB 데이터베이스와 쉽게 상호 작용할 수 있으며, 타 서비스와의 데이터 연동에도 유용하게 활용할 수 있습니다.

여기서는 mongoengine을 사용하여 다른 서비스와의 데이터 연동 전략을 몇 가지 설명하고 예시 코드를 제시하겠습니다.

1. REST API를 통한 데이터 연동

대부분의 서비스는 RESTful API를 통해 데이터를 제공하고 소비합니다. 이러한 경우에는 mongoengine을 사용하여 MongoDB 데이터와 REST API의 데이터를 매핑하면 됩니다.

다음은 Flask와 mongoengine을 사용하여 RESTful API를 만들고 데이터를 가져오는 예시 코드입니다:

from flask import Flask
from flask_restful import Resource, Api
from mongoengine import connect, Document, StringField, IntField

app = Flask(__name__)
api = Api(app)

# MongoDB에 연결
connect('mydatabase')

# MongoDB의 도큐먼트 모델 정의
class User(Document):
    name = StringField(required=True)
    age = IntField()

# API 엔드포인트 정의
class UserAPI(Resource):
    def get(self):
        users = User.objects()
        return {
            'data': [{'name': user.name, 'age': user.age} for user in users]
        }

# API 경로 설정
api.add_resource(UserAPI, '/users')

if __name__ == '__main__':
    app.run()

이 코드는 사용자 정보를 저장하는 User 도큐먼트를 정의하고, ‘/users’ 엔드포인트를 통해 사용자 정보를 반환하는 RESTful API를 만듭니다.

2. 데이터 변환 및 형식 맞춤

때로는 다른 서비스에서 제공하는 데이터 형식과 MongoDB의 도큐먼트 형식이 다를 수 있습니다. 이럴 때는 mongoengine을 사용하여 데이터를 변환하거나 형식을 맞추어야 합니다.

예를 들어, 다른 서비스에서는 날짜를 “YYYY-MM-DD” 형식으로 제공하지만 MongoDB는 datetime 형식으로 저장한다고 가정해보겠습니다. 이 경우 다음과 같이 mongoengine을 사용하여 데이터를 변환할 수 있습니다:

from datetime import datetime
from mongoengine import DateTimeField

class Order(Document):
    order_date = DateTimeField()

    def to_external_format(self):
        return self.order_date.strftime('%Y-%m-%d')

# 다른 서비스에서 제공되는 데이터 가져오기
external_data = get_data_from_external_service()

# 데이터 변환
order = Order(order_date=datetime.strptime(external_data['order_date'], '%Y-%m-%d'))

# MongoDB에 저장
order.save()

이 예시는 Order 도큐먼트를 정의하고, 외부 서비스에서 제공되는 데이터를 가져와서 날짜를 변환한 후 MongoDB에 저장하는 과정을 보여줍니다.

3. 비동기 처리와 큐

일부 데이터는 실시간으로 업데이트되어야 하거나, 다른 서비스와의 연동에 시간이 오래 걸릴 수 있습니다. 이러한 경우에는 비동기 처리와 큐 시스템을 사용하여 데이터 연동을 수행하는 것이 좋습니다.

예를 들어, 다른 서비스에서 제공하는 주문 알림을 처리해야 한다고 가정해보겠습니다. 이 경우 다음과 같이 mongoengine과 Celery (비동기 작업 큐)를 함께 사용할 수 있습니다:

from mongoengine import StringField, BooleanField, connect
from celery import Celery

# MongoDB에 연결
connect('mydatabase')

# Celery 작업 큐 설정
app = Celery('myapp', broker='redis://localhost:6379/0')

# MongoDB의 주문 도큐먼트 모델 정의
class Order(Document):
    order_id = StringField(required=True)
    processed = BooleanField(default=False)

# Celery 작업 정의
@app.task
def process_order(order_id):
    order = Order.objects(order_id=order_id).first()
    if order:
        # 주문 처리 로직 작성
        order.processed = True
        order.save()

# 주문 알림을 받는 함수 (예시)
def receive_order_notification(order_id):
    Order(order_id=order_id).save()
    # 주문 처리 작업을 Celery 작업 큐에 추가
    process_order.apply_async((order_id,))

# 비동기 처리를 위해 Celery 작업자 실행
if __name__ == '__main__':
    app.worker_main()

이 예시는 Order 도큐먼트를 정의하고, 주문 알림을 받는 함수에서 주문을 MongoDB에 저장한 후, Celery 작업 큐에 주문 처리 작업을 추가합니다. 이렇게 하면 주문 처리 작업이 백그라운드에서 비동기적으로 처리됩니다.

위에서는 REST API와 데이터 변환, 비동기 처리와 큐라는 세 가지 데이터 연동 전략을 mongoengine과 함께 사용하는 예시를 제시했습니다. 이러한 방법들은 다른 서비스와의 데이터 연동을 보다 효율적으로 처리하고 유연하게 작업할 수 있는 방법입니다.