-
[Python] 초보자를 위한 데코레이터(Decorator) 사용법코딩/파이썬 2023. 7. 29. 17:09반응형
Decorator가 뭐지? 장식인가.
몇몇은 함수 위에 '@' 로 시작하는 이상한 문법을 본적이 있을 것입니다. 이것이 바로 decorator라는 python 문법인데요. 초보자에게는 다소 어려울 수 있지만, 한 번만 이해한다면 코드의 효율을 높일 수 있습니다. 이번에는 python decorator에 대해서 최대한 쉽게~ 설명해 보도록 하겠습니다.
목차
1. Python Decorator이란?
Python에서 Decorator는 기존 함수를 수정하지 않고 그 기능을 확장하는 방법을 제공합니다. 즉, 기존 함수 위에 '장식'을 추가하는 것이라 생각하면 됩니다. Decorator는 '@' 기호를 사용하여 정의되며, 함수나 메소드 앞에 위치합니다.
한 가지 사례를 들어볼까요?
# decorator를 정의하는 함수. 인자로 함수를 받습니다. def my_decorator(func): def wrapper(): print("함수 실행 전 무언가를 합니다..") func() # 인자로 받은 함수를 실행합니다. print("함수 실행 후 무언가를 합니다.") return wrapper # @ + decorator 함수명을 앞에 쓰는 사용할 수 있습니다. @my_decorator def say_hello(): print("Hello!") say_hello()
위 예제에서, my_decorator는 decorator이며 say_hello 함수 앞에 '@' 기호와 함께 위치하고 있습니다. 이를 통해 say_hello 함수는 my_decorator에 인자로 넘겨되며, 함수가 호출 전후에 decorator 내에 정의된 추가 기능이 실행됩니다. 위에서는 func 전후에 print를 실행하겠군요.
위 코드를 한 번 실행해 보겠습니다.
2. Decorator 사용 시 장단점
- 코드의 재사용성을 높일 수 있다.
Decorator의 가장 큰 장점은 코드의 재사용성을 높이는 것입니다. 특정 로직을 공통적으로 사용해야 하는 여러 함수에 대해, 이 로직을 decorator로 구현하면 각 함수에 '@' 기호와 함께 decorator를 추가하기만 하면 됩니다. 중복 코드를 최소화하고 코드의 가독성을 높일 수 있습니다. - 무분별한 Decorator의 사용은 코드의 복잡도를 높일 수 있다.
Decorator를 사용할 때는 주의해야 할 점도 있습니다. 무분별한 Decorator의 사용은 코드의 복잡도를 높일 수 있습니다. 특히, 다수의 Decorator가 중첩되어 사용될 경우 코드 해석이 어려워지며, 이는 버그 발생의 원인이 될 수 있습니다. 따라서, Decorator는 필요한 경우에만 적절히 사용하는 것이 좋습니다.
3. Decorator 사용 사례
Decorator는 다양한 케이스에 사용됩니다. 아래는 실제 사례를 모아보았습니다.
Flask 웹 프레임워크 라우팅
Python에서는 다양한 Decorator가 제공되며, 이들은 실제 코드에서 널리 사용됩니다. 예를 들어, Flask 웹 프레임워크에서는 라우팅을 위한 '@app.route'라는 Decorator를 제공합니다.
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello, World!"
위 코드에서 '@app.route'는 URL 경로를 함수에 연결하는 역할을 합니다. 이를 통해 Flask 애플리케이션은 특정 URL 요청이 들어올 때, 해당 URL에 연결된 함수를 실행할 수 있습니다.
로깅(Logging)이 필요할 때
Decorator를 사용하여 함수의 호출과 실행 시간을 로깅하는 것이 일반적인 사례입니다. 이를 통해 프로그램의 실행 흐름을 추적하거나 성능 문제를 진단하는 데 도움이 될 수 있습니다.
import time import logging # 실행 시간을 로깅하는 decorator def log_decorator(func): def wrapper(*args, **kwargs): start_time = time.time() result = func(*args, **kwargs) end_time = time.time() logging.info(f'{func.__name__} 실행 시간: {end_time - start_time} 초') # logging 코드 추가 return result return wrapper @log_decorator def my_function(): time.sleep(2) my_function()
사용자 인증할 때 (Authentication)
웹 애플리케이션에서는 사용자가 특정 기능에 접근하기 전에 인증을 받는 경우가 많습니다. 이때 Decorator를 사용하면 코드의 중복을 줄이고 가독성을 높일 수 있습니다.
def auth_decorator(func): def wrapper(user): if user.is_authenticated: return func(user) else: raise PermissionError("로그인이 필요한 기능입니다.") return wrapper @auth_decorator def view_profile(user): # 프로필 조회 로직 pass
위 코드에서 auth_decorator는 view_profile 함수에 접근하기 전에 사용자가 인증되었는지 확인합니다. 만약 사용자가 인증되지 않았다면, PermissionError를 발생시키고 함수의 실행을 중지합니다. 이렇게 하면 각 함수에서 사용자 인증 로직을 반복적으로 구현할 필요 없이, 간단하게 '@' 기호와 함께 auth_decorator를 추가하기만 하면 됩니다.
이상 Python Decorator에 대한 포스팅이었습니다.
Python 관련 포스팅
https://smart-worker.tistory.com/47
https://smart-worker.tistory.com/28
반응형'코딩 > 파이썬' 카테고리의 다른 글
[Python]람다(lambda) 함수 이해하기 (0) 2023.07.29 [Python] 리스트와 튜플(tuple)의 차이점 이해하기 (0) 2023.07.29 [Python]List Comprehension을 활용한 코드 최적화 (0) 2023.07.29 chatGPT로 Text 요약하기 (0) 2023.04.16 Python으로 chatGPT API 사용하기 (2) 2023.04.16 - 코드의 재사용성을 높일 수 있다.