[Python] 함수를 꾸며주는 데코레이터에 대해 알아보자

[Ted's Log] 테드로그·2021년 8월 31일
2

Python Study-note

목록 보기
5/5
post-thumbnail

👋   Python Decorator

  Python으로 작성된 오픈소스 코드들을 보다 보면, @로 시작하는 구문들이 있는 것을 볼 수 있다. 처음 @로 함수 위에 적혀있는 것들을 봤을 때, 낯선 모습에 당황했던 기억이 난다. 이번 포스팅에서는 데코레이터가 하는 역할과 백엔드 영역에서 어떻게 쓰일 수 있는지에 대해서 작성해보려고 한다.

💡   Decorator는 어떤 경우에 쓰일까?

  파이썬으로 함수를 구현하다 보면, 해당 함수의 주요 기능은 아니지만 다른 기능과 결합하여 함수를 구현하고 싶은 경우가 발생한다. 예를 들어 함수에 구현된 로직이 얼마나 효과적인지 판단하기 위해서 코드의 실행 시간을 측정하는 함수를 작성한다고 가정해보자.
  위의 코드는 함수에 인자로 주어진 리스트의 첫 번째 요소부터 마지막 요소까지의 반복문 실행 시간을 측정한 것이다. 소요 시간을 확인하기 위해 함수의 처음과 마지막의 시간을 측정해서 뺀 값을 반환하는 로직이고, 크게 복잡해보이진 않는다. 하지만 리스트 뿐만이 아니라 다른 iterable한 데이터 형식의 반복문 실행시간을 측정하는 함수를 구현할 때는 어떨까?
  같은 로직이 반복해서 사용되다 보니 코드의 재사용적인 측면과 가독성에서 효율이 떨어지는 것을 쉽게 확인할 수 있다. 이처럼 여러 함수들에서 반복적으로 사용될 수 있는 로직은 데코레이터로 만들어서 사용하게 되면 위와 같은 단점을 보완할 수 있다. 아래 코드는 데코레이터를 통해서 같은 로직을 구현한 것이다.


🔍   함수형 Decorator

  위에서 작성한 timer_decorator가 함수형식으로 데코레이터를 구현한 것이다. 데코레이터 역할을 하는 함수를 정의할 때, 해당 데코레이터가 적용될 함수를 인자로 받아야 한다. 또한 함수 내부에서는 실질적인 데코레이터 역할을 하는 nested function을 선언하여, 여러 함수에서 처리하고자 하는 로직을 처리하면 된다. 마지막에 nested function을 반환해주면 데코레이터가 정상적으로 작동하게 된다. 매개변수가 주어지는 함수를 decorating 할 수 있으려면 *args**kwargs를 처리해주어야 한다는 점도 기억하자.


📦   클래스형 Decorator

  데코레이터를 클래스 형식으로 작성할 수도 있다. 클래스 선언 후 _init_() 함수를 작성할 때, 꾸며줄 함수를 내부 필드로 받아오면 된다. 그리고 난 후, _call_() 함수에서 데코레이팅 처리를 해주면 된다. 아래 코드는 클래스형 데코레이터를 통해서 인자로 주어진 텍스트를 태그로 감싸진 형태의 텍스트를 반환하게 된다.

✈️   Decorator in Backend

  REST API를 작성할 때 데코레이터를 활용해야 할 순간이 온다. HTTP 통신은 Stateless의 속성을 가지고 있기 때문에 로그인 상태를 확인해야 하는 API를 작성할 때 데코레이터의 장점을 활용할 수 있다. 각기 다른 API를 작성할 때마다 로그인 상태를 확인하기 보다는 하나의 데코레이터를 만들어놓고, 필요한 API에 붙여서 사용하는 방식을 사용할 수 있다.

profile
성장하는 개발자가 되기 위한 발자취 🧑🏻‍💻

0개의 댓글