본문 바로가기
Data 엔지니어링/Airflow

[Airflow] @task 데코레이터

by imkus 2025. 1. 9.

1.파이썬 데코레이터

  • 데코레이터(Decorator):장식하다, 꾸미다
  • What: 함수를 장식하다
  • 원래의 함수를 감싸서 (Wrapping) 바깥에 추가 기능을 덧붙이는 방법

함수를 감싸는것

  • 파이썬은 함수 안에 함수를 선언하는 것이 가능하고
  • 함수의 인자로 함수를 전달하는 것이 가능하며
  • 함수 자체를 리턴하는 것이 가능하다

 

2.파이썬 데코레이터 예제

def outer_func(target_func):
	def inner_func():
    	# (1) 내부 함수 정의
    	print('target 함수 실행 전 입니다')
        target_func()
        print('target 함수 실행 후 입니다')
        
        # (2) 내부 함수 자체 리턴
        return inner_func
        
        
    
# 함수를 감싸는 방법 1
## 만약 get_data 이외에 다른 함수도 적용하려면 반복해서 모두 코드를 변경해야함
def get_data():
	print('함수를 시작합니다')
    
a = outer_func(get_data)
a()

"""
실행결과
target 함수 실행 전 입니다
함수를 시작합니다
함수 실행 후 입니다
"""



# 함수를 감싸는 방법 2
## 함수를 정의하기 전에 데코레이터를 사용하면 코드를 변경하지 않아도 됨
@outer_func
def get_data():
	print('함수를 시작합니다')
    
get_data()

"""
실행결과
target 함수 실행 전 입니다
함수를 시작합니다
함수 실행 후 입니다
"""

 

 

 

 

3. Task 데코레이터

  • 파이썬 함수 정의만으로 쉽게 Task 생성할 수 있음
  • 장점
    • 함수를 직접 수정하지 않고도 랩핑하는 함수를 만들어 함수의 변형을 최소화 할 수 있음
    • 함수를 호출하는 로직이 여러 군데 있을 경우 로직 부분을 일일이 찾아가서 모두 수정하지 않아도 기존에 호출하던 로직 그대로 사용할 수 있음
  • 이전에 Task를 어떻게 만들었는지 비교해보면 이해가 쉬움
"""
dags_python_task_decorator.py
"""

from airflow import DAG
import pendulum
from airflow.decorators import task

with DAG(
    dag_id="dags_pyton_task_decorator",
    schedule="0 2 * * 1",
    start_date=pendulum.datetime(2023, 3, 1, tz="Asia/Seoul"),
    catchup=False
) as dag:
    @task(task_id="python_task_1")
    def print_context(some_input):
        print(some_input)
        
    python_task_1 = print_context('task_decorator 실행')

 

실행 결과