데코레이터란?

2024. 3. 20. 14:10·프로그래밍 언어/파이썬

뭐지?

파이썬의 데코레이터는 함수나 메소드의 변환을 위해 사용되는 함수입니다. 데코레이터를 사용하면 기존의 코드를 수정하지 않고도

함수의 기능을 확장하거나 변경할 수 있습니다. 이는 코드의 재사용성을 높이고, 가독성을 향상시키며, 유지보수를 용이하게 합니다.

데코레이터는 @(골뱅이) 기호를 함수 위에 적용하게 됩니다. 데코레이터는 실행시간에 함수를 감싸서(wrap)

실행 전후에 추가적인 코드를 실행할 수 있게 해주며, 이를 통해 함수의 행동을 수정합니다.

기본구조

def my_decorator(func):
    def wrapper():
        # 여기에 함수 호출 전 실행할 코드를 작성합니다. 
        print("함수 호출 전")
        func()
        # 여기에 함수 호출 후 실행할 코드를 작성합니다. 
        print("함수 호출 후")
     return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()

위 예제에서 my_decorator는 데코레이터 함수이며, say_hello함수 위에 적용되어 있습니다.
say_hello 함수를 호출하면 실제로는 wrapper 함수가 호출됩니다. wrapper 함수 안에서는 say_hello함수 호출 전후에 추가적인
코드를 실행할 수 있습니다.

매개변수가 있는 함수 데코레이팅

함수가 매개변수를 받는 경우, wrapper 함수 내에서 *args와 **kwargs를 사용하여 모든 종류의 매개변수를 받을 수 있게 할 수 있습니다.

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("함수 호출 전")
        result = func(*args, **kwargs) # 원래 함수에 매개변수를 전달합니다.
        print("함수 호출 후")
        return result
    return wrapper

@my_decorator
def say_message(message):
    print(message)

say_hello()

데코레이터 사용 사례

데코레이터는 로깅, 접근제어, 측정 및 성능 테스트, 트랜잭션처리 등 다양한 상황에서 유용하게 사용됩니다.
예를들어, 함수의 실행 시간을 측정하는 데코레이터는 다음과 같이 작성 할 수 있습니다.

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"func.__name__} 실행 시간 : {end_time - start_time}초")
        return result
    return wrapper

@time_decorator
def long_runninig_function():
    for _ in range(1000000):
        pass

long_runninig_function()

이러한 방식으로 데코레이터를 사용하면 기존 코드의 변경 없이도 추가 기능을 쉽게 적용할 수 있습니다.

데코레이터는 파이썬에서 함수 또는 메서드의 기능을 변경하거나 확장할 때 매우 유용한 도구입니다. 하지만 그 사용에는 장점과 단점이 모두 존재합니다. 또한, 특정 상황에서는 데코레이터 대신 다른 방법을 사용하는 것이 더 적합할 수 있습니다.

데코레이터의 장점:

  • 코드 재사용성: 데코레이터를 사용하면 비슷한 기능을 여러 함수에 적용할 때 중복 코드를 줄일 수 있습니다. 이는 코드의 재사용성을 높여줍니다.
  • 코드 분리 및 관심사의 분리: 데코레이터를 사용하면 기능 확장이나 변경을 위한 코드를 별도로 분리할 수 있습니다. 이는 함수의 주요 로직과 부가적인 기능 사이의 관심사를 분리하는 데 도움을 줍니다.
  • 가독성 및 유지 보수: 데코레이터를 사용하면 함수의 기능 변경이나 확장이 필요할 때 기존 코드를 수정하지 않아도 됩니다. 이는 코드의 가독성을 향상시키고 유지 보수를 용이하게 합니다.

데코레이터의 단점:

  • 디버깅의 어려움: 데코레이터를 사용하면 스택 트레이스가 복잡해져서 디버깅이 어려울 수 있습니다. 데코레이터 내부의 오류는 추적하기가 더 복잡해질 수 있습니다.
  • 가독성 저하: 때때로 데코레이터 사용이 코드의 가독성을 저하시킬 수 있습니다. 특히 데코레이터를 과도하게 사용하거나 복잡한 데코레이터를 사용하는 경우에 해당합니다.
  • 학습 곡선: 파이썬 초보자에게는 데코레이터의 개념이 다소 어려울 수 있으며, 효과적으로 사용하기 위해서는 추가적인 학습이 필요합니다.

데코레이터의 대안:

고차 함수(Higher-order functions): 데코레이터와 유사하게 함수를 인자로 받거나 함수를 반환하는 함수를 사용하여 기능을 확장할 수 있습니다.

  • 클래스 기반 데코레이터: 함수 기반 데코레이터 대신 클래스를 사용하여 데코레이터를 구현할 수 있습니다. 클래스 기반 데코레이터는 상태 관리가 필요할 때 유용합니다.
  • 미들웨어: 특히 웹 프레임워크에서 요청 처리 파이프라인에 기능을 추가하기 위해 사용됩니다. 미들웨어는 데코레이터와 유사한 역할을 할 수 있지만, 애플리케이션의 전체 흐름에 적용됩니다.
  • 디자인 패턴: 특정 상황에서는 옵서버 패턴, 전략 패턴, 커맨드 패턴과 같은 디자인 패턴을 사용하여 데코레이터와 비슷한 결과를 달성할 수 있습니다. 디자인 패턴은 더 큰 설계 문제를 해결하는 데 도움을 줄 수 있습니다.

데코레이터의 사용 여부는 프로젝트의 요구 사항, 코드의 복잡성, 팀의 선호도 및 경험 등 여러 요소를 고려하여 결정해야 합니다.

저작자표시 (새창열림)

'프로그래밍 언어 > 파이썬' 카테고리의 다른 글

MRO(Method Resolution Order)  (0) 2024.03.20
GIL(Global Interpreter Lock)  (1) 2024.03.20
코루틴이란?  (0) 2024.03.20
List와 Tuple의 차이  (0) 2024.03.20
FastAPI를 이용한 TDD 개발 - 7  (0) 2024.03.19
'프로그래밍 언어/파이썬' 카테고리의 다른 글
  • MRO(Method Resolution Order)
  • GIL(Global Interpreter Lock)
  • 코루틴이란?
  • List와 Tuple의 차이
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (284)
      • 여러가지 (108)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (2)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 운영체제 (0)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (5)
        • 암호화폐 (5)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    mybatis
    OOP
    Spring WebFlux
    spring
    celery
    항해99
    백준
    DP
    java
    Docker-compose
    WebFlux
    AWS
    완전탐색
    파이썬
    취업리부트
    그리디
    ecs
    Redis
    RDS
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    docker
    FastAPI
    EC2
    SAA
    프로그래머스
    Python
    자바
    Spring Boot
    시험
    reactor
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
데코레이터란?
상단으로

티스토리툴바