먼저 decorator라는 단어의 뜻부터 확인해보겠습니다. Decorator는 장식 혹은 장식하는 사람이라는 뜻이 있습니다. 즉, 뭔가 장식에 관련된거라는것을 알수 있습니다. 근데 갑자기 파이썬에 왠 장식일까요? 차근 차근 알아가 보겠습니다.

먼저, 대박 주식 정보를 리턴하는 함수가 있다고 가정하겠습니다. 그 함수는 다음과 같습니다:

def jackpot_stock_information():
    return "계시가 내려졌습니다. 삼성전자를 사세요!"

자 그러나 이 대박 주식 정보는 유료 회원만 받을 수 있습니다. 그래서 이 함수가 호출 되기 전에 해당 유저가 유료 회원인지를 확인해야 합니다. 그리고 해당 유저가 유료 회원인지 확인 해주는 함수는 다음과 같습니다. 설명의 단순화를 위해 모든 유저가 유료 회원이라고 가정하겠습니다.

def is_paid_user():
    return True

자 그럼 jackpot_stock_information 함수를 호출하기 전에 항상 is_paid_user 함수가 먼저 호출 되어야 할것입니다. 다음 처럼 말이죠:

if is_paid_user():
    jackpot_stock_information()

지금까지는 아무 문제 없어보입니다. 하지만 문제는 jackpot_stock_information 함수가 여러 곳에서 자주 사용될때 생깁니다. jackpot_stock_information 함수가 호출 될때 is_paid_user가 무조건 먼저 호출 되어야 하는데, 이 연결고리를 잊어먹을 확률이 있다는 것입니다. 즉 jackpot_stock_information 함수가 is_paid_user 함수가 먼저 호출되지 않은 채로 호출 될 수 있다는 거죠. 개발자도 사람이니 충분히 실수 할 수 있는 것입니다.

그럼 jackpot_stock_information 함수를 호출할때 알아서 자동으로 is_paid_user 함수가 강제적으로 먼저 호출되게 할 수 있는 방법은 없을까요?

네, 바로 여기서 decorator가 사용 됩니다. Decorator를 적용하면 다음과 같이 됩니다.

@is_paid_user
def jackpot_stock_information():
    return "계시가 내려졌습니다. 삼성전자를 사세요!"

jackpot_stock_information 함수 정의 위에 is_paid_user 함수가 골뱅이 마크 (@) 와 함께 달려있는것을 볼 수 있습니다. 네, 그래서 장식, 즉 decorator 라고 하는것입니다. 함수위에 다른 함수를 골뱅이마크를 사용해서 장식처럼 달아놓는것입니다.

저렇게 decorator로 달아놓으면 해당 함수가 호출 되기 전에 장식으로 달린 함수가 먼저 호출이 되고 난 후에 본 함수가 호출이 됩니다.

Decorator 함수 구현 방법

자 그럼 아무 함수나 다 decorator로 장식 할 수 있을까요?

아닙니다. Decorator로 장식할 수 있는 함수는 중첩 함수(nested function)을 리턴하는 함수만 decorator 함수로 사용될 수 있습니다.

그 이유는 간단합니다. 왜 그런지 혹시 이미 아셨나요?

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/a1eb1c42-ef3c-40bb-a230-ef7417d6ca46/Untitled.png