Celery를 활용한 비동기 PDF 변환

PDF 변환은 대부분의 웹 애플리케이션에서 중요한 작업입니다. 하지만 크고 복잡한 PDF 파일을 변환하는 과정은 시간이 오래 걸리기 때문에 사용자는 오랜 시간 동안 기다려야 합니다. 이러한 문제를 해결하기 위해 Celery를 활용한 비동기 PDF 변환을 적용해보는 것은 좋은 방법입니다.

Celery란?

Celery는 Python으로 작성된 분산 작업 큐라이브러리입니다. 애플리케이션에서 비동기적으로 수행해야 하는 작업을 메시지 큐를 통해 처리할 수 있게 해줍니다. Celery는 작업을 처리하는 워커(worker)와 작업을 전달하는 브로커(broker)로 구성됩니다. 워커는 큐에서 작업을 가져와 결과를 처리하고, 브로커는 작업 메시지를 저장하고 워커에게 전달합니다.

Celery 설정

Celery를 사용하기 위해선 먼저 Celery와 브로커를 설치해야 합니다. 가장 일반적으로 사용되는 브로커로는 RabbitMQ, Redis, SQS 등이 있습니다. 이 예제에서는 RabbitMQ를 사용하도록 하겠습니다.

# requirements.txt
celery==4.4.7
amqp==2.5.2

Celery를 초기화하고 브로커와 연결하기 위해 다음과 같이 celery.py 파일을 작성합니다.

# celery.py
from celery import Celery

app = Celery('pdf-conversion', broker='amqp://guest:guest@localhost:5672//')

@app.task
def convert_to_pdf(file_path):
    # PDF 변환 작업 수행
    ...
    return pdf_file_path

Celery 작업 정의

PDF를 변환하기 위해 Celery 작업을 정의합니다. 이 작업은 convert_to_pdf 함수를 호출하고 결과로 생성된 PDF 파일의 경로를 반환합니다.

# tasks.py
from .celery import app

@app.task
def convert_to_pdf_task(file_path):
    result = convert_to_pdf(file_path)
    return result

Celery 작업 실행

Celery 작업을 실행하기 위해 다음과 같이 코드를 작성합니다.

from .tasks import convert_to_pdf_task

def convert_to_pdf_async(file_path):
    task = convert_to_pdf_task.delay(file_path)
    return task.id

위의 코드는 비동기적으로 PDF 변환 작업을 실행하고 해당 작업의 ID를 반환합니다. 사용자는 이 작업 ID를 통해 작업의 상태를 추적할 수 있습니다.

작업 상태 추적

작업의 상태를 추적하기 위해서는 Celery 작업의 ID를 사용하여 상태를 조회하는 API를 구현해야 합니다.

# tasks.py
from .celery import app

@app.task
def get_task_status(task_id):
    task = app.AsyncResult(task_id)
    return task.status

위의 코드는 특정 작업 ID에 대한 상태를 반환하는 함수입니다. 상태는 PENDING, SUCCESS, FAILURE, RETRY 등의 값으로 나타낼 수 있습니다.

결론

Celery를 활용한 비동기 PDF 변환은 사용자 경험을 향상시키고, 애플리케이션의 응답 속도를 개선하는 좋은 방법입니다. Celery를 사용하여 작업을 분산시키고 비동기적으로 처리함으로써 시간이 오래 걸리는 작업을 효율적으로 다룰 수 있습니다.

#Celery #PDF변환