Prefect 실무 스터디 가이드

데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약

Orchestration Event-Driven Python Data Pipeline Workflow

작성일: 2026.03

1. Prefect란?

Prefect는 현대적인 데이터 워크플로 오케스트레이션 플랫폼입니다. 복잡한 데이터 파이프라인, 머신러닝 워크플로, ETL 작업을 쉽게 구축, 실행, 모니터링할 수 있도록 설계되었습니다.

1. 동적 워크플로

런타임에 조건부 로직, 반복, 매개변수화를 지원하는 Python-native 워크플로 정의. Airflow의 DAG 제한을 넘어선 유연성.

2. 관측 가능성

실시간 대시보드, 자동 로깅, 상세한 실행 추적을 통해 파이프라인의 모든 상태를 가시화.

3. 개발자 경험

로컬 개발, 테스트, 디버깅을 우선시하는 설계. 간단한 데코레이터(@flow)로 시작 가능.

2. 왜 써야 하는가?

기존 오케스트레이션 도구의 한계를 해결하며, 특히 데이터 팀의 실무 요구사항에 초점을 맞춥니다.

도구 장점 단점 / Prefect와의 차이
Apache Airflow 성숙한 생태계, 많은 커넥터 정적 DAG, 복잡한 설정, 개발자 경험 부족
Luigi 간단한 설계, Spotify에서 검증 기능 제한적, 모니터링 기능 부족
기본 Cron / 스크립트 설치 불필요, 즉시 사용 가능 오류 처리, 재시도, 모니터링, 의존성 관리 없음
Prefect 동적 워크플로, 뛰어난 관측 가능성, Python-native, 하이브리드 실행 -

핵심 차별점: 하이브리드 모델

Prefect는 제어 평면(Prefect Cloud/Server)과 실행 평면(사용자 인프라)을 분리합니다. 따라서 코드와 데이터는 자체 환경(로컬, Kubernetes, VM 등)에서 실행하면서 중앙에서 오케스트레이션과 모니터링을 받을 수 있습니다.

3. 핵심 개념

Prefect의 아키텍처는 명확한 책임 분리를 통해 유연성과 강력함을 제공합니다.

┌─────────────────────────────────────────────────────────────────────┐ │ Prefect Cloud / Server (제어 평면) │ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │ │ UI 대시 │ │ 오케스트 │ │ API │ │ 데이터 │ │ │ │ 보드 │ │ 레이션 │ │ 게이트 │ │ 베이스 │ │ │ │ │ │ 엔진 │ │ 웨이 │ │ │ │ │ └────────────┘ └────────────┘ └────────────┘ └────────────┘ │ └─────────────────────────────────┬──────────────────────────────────┘ │ │ (워크플로 정의, 상태 보고) ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 사용자 인프라 (실행 평면) │ │ ┌────────────┐ │ │ │ Prefect │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ │ │ Agent │ │ Flow │ │ Task │ │ Flow │ │ Task │ │ │ │ (로컬, │ │ Run 1 │ │ Run A │ │ Run 2 │ │ Run B │ │ │ │ K8s, 등) │ │ │ │ │ │ │ │ │ │ │ └────────────┘ └────────┘ └────────┘ └────────┘ └────────┘ │ │ │ │ │ │ │ │ └────────────────┼────────────┼────────────┘ │ │ ▼ ▼ │ │ ┌──────────────┐┌──────────────┐ │ │ │ 데이터소스 ││ ML 모델 │ │ │ │ (DB, S3 등) ││ 서빙 │ │ │ └──────────────┘└──────────────┘ │ └─────────────────────────────────────────────────────────────────────┘

Flow

워크플로의 컨테이너. @flow 데코레이터로 정의. 실행 단위.

Task

워크플로 내의 개별 작업 단위. @task 데코레이터로 정의. 재사용 가능.

Deployment

Flow를 예약, 트리거, 모니터링할 수 있는 형태로 패키징.

Agent

실행 환경(로컬, Kubernetes, Docker 등)에서 Flow 실행을 폴링하고 시작하는 프로세스.

4. 퀵스타트

5분 안에 첫 Prefect 워크플로를 실행해보세요.

단계 1: 설치

# pip를 사용한 설치
pip install -U prefect

# 추가 패키지 (선택)
pip install prefect-aws prefect-dask prefect-sqlalchemy

# 버전 확인
prefect version

단계 2: 로컬 서버 시작 (옵션)

# Prefect 서버를 로컬에서 실행 (UI 포함)
prefect server start

# 별도의 터미널에서 서버 상태 확인
prefect config view

💡 로컬 서버 없이도 Prefect Cloud(app.prefect.cloud)를 무료로 사용할 수 있습니다.

단계 3: 첫 번째 Flow 작성

first_flow.py 파일 생성:

from prefect import flow, task
from typing import List
import httpx

@task(retries=3, retry_delay_seconds=10)
def get_repo_info(repo_owner: str, repo_name: str):
    """GitHub에서 레포지토리 정보를 가져오는 태스크"""
    url = f"https://api.github.com/repos/{repo_owner}/{repo_name}"
    response = httpx.get(url)
    response.raise_for_status()
    return response.json()

@task
def extract_stars(repo_info: dict) -> int:
    """레포지토리 정보에서 스타 수 추출"""
    return repo_info.get("stargazers_count", 0)

@flow(name="github-stars-tracker", log_prints=True)
def track_stars(repos: List[dict]):
    """여러 GitHub 레포지토리의 스타 수를 추적하는 메인 플로우"""
    total_stars = 0
    
    for repo in repos:
        print(f"Processing {repo['owner']}/{repo['name']}...")
        info = get_repo_info(repo["owner"], repo["name"])
        stars = extract_stars(info)
        total_stars += stars
        print(f"  Stars: {stars}")
    
    print(f"✅ Total stars across all repos: {total_stars}")
    return total_stars

# 로컬 실행
if __name__ == "__main__":
    # 테스트할 레포지토리 목록
    repositories = [
        {"owner": "PrefectHQ", "name": "prefect"},
        {"owner": "apache", "name": "airflow"},
        {"owner": "dagster-io", "name": "dagster"}
    ]
    
    # 플로우 실행
    result = track_stars(repositories)
    print(f"Flow 실행 완료! 반환값: {result}")

단계 4: 실행 및 관찰

# Python 스크립트로 직접 실행
python first_flow.py

# Prefect CLI를 통해 실행 (추적 가능)
prefect flow run --name "github-stars-tracker"

# UI에서 실행 결과 확인 (서버 실행 시)
# http://localhost:4200

5. 핵심 설정 레퍼런스

자주 사용되는 Prefect 설정 옵션들입니다.

설정 기본값 설명 설정 방법 예시
PREFECT_API_URL http://localhost:4200/api Prefect 서버/Cloud API 엔드포인트 prefect config set PREFECT_API_URL="https://api.prefect.cloud/api/account/..."
PREFECT_LOGGING_LEVEL INFO 로그 상세도 (DEBUG, INFO, WARNING, ERROR) export PREFECT_LOGGING_LEVEL="DEBUG"
retries (task 데코레이터) 0 태스크 실패 시 재시도 횟수 @task(retries=3)
retry_delay_seconds 0 재시도 간 대기 시간(초) @task(retries=2, retry_delay_seconds=30)
timeout_seconds None (무제한) 태스크 실행 제한 시간 @task(timeout_seconds=300)
task_runner (flow 데코레이터) SequentialTaskRunner 태스크 실행 방식 (병렬 실행 시 ConcurrentTaskRunner) @flow(task_runner=ConcurrentTaskRunner())

6. 실무 팁 & 트러블슈팅

팁 1: 로컬 개발 워크플로

1. @flow 데코레이터만으로 시작 → 2. 로컬 실행 테스트 → 3. prefect deployment build로 배포 생성 → 4. 에이전트 등록 → 5. UI/API/스케줄러로 트리거

팁 2: 상태 핸들링

Prefect는 실패(Failed), 성공(Completed), 재시도(Retrying) 등 다양한 상태를 자동 관리합니다. flow(flow_run_name="custom-name")로 실행 이름을 커스터마이즈하여 로그에서 쉽게 식별하세요.

문제 1: Agent가 Flow 실행을 찾지 못함

증상: UI에서 실행을 시작했지만 Agent가 "No flow runs found" 로그만 출력.

해결:

  1. Agent와 서버/Cloud의 API URL이 동일한지 확인: prefect config view
  2. Deployment의 work queue 이름과 Agent가 폴링하는 queue 이름이 일치하는지 확인.
  3. prefect deployment run 'FlowName/DeploymentName'으로 직접 트리거 테스트.

문제 2: 태스크 타임아웃 발생

증상: 장시간 실행되는 태스크가 타임아웃으로 실패.

해결:

  • 태스크에 적절한 timeout_seconds 설정: @task(timeout_seconds=3600)
  • Flow 수준에서 타임아웃 설정: @flow(timeout_seconds=7200)
  • 태스크를 더 작은 단위로 분할(Chunking) 고려.

팁 3: 프로덕션 배포 체크리스트

  1. 모든 태스크에 적절한 재시도(retries) 설정
  2. 중요 태스크에는 타임아웃(timeout_seconds) 설정
  3. 의존성 패키지를 requirements.txt 또는 Docker 이미지로 고정
  4. 프로덕션 환경에 맞는 에이전트(Kubernetes, Docker, ECS 등) 설정
  5. 알림 통합(Slack, Teams, PagerDuty) 구성

7. 참고 자료

학습 경로 제안

1. 기본 개념(Flow, Task) → 2. 로컬에서 첫 워크플로 → 3. Deployment와 Agent 이해 → 4. Prefect Cloud/Server 설정 → 5. 블록(Blocks)으로 외부 리소스 연결 → 6. 워크 큐, 태스크 러너 등 고급 기능 탐색