---
title: "Solidity에서 modifier란 무엇인가?"
description: "Solidity modifier의 기능, 동작 방식, 사용 시점"
---

# Solidity에서 modifier란 무엇인가?

[Solidity](https://www.alchemy.com/overviews/solidity)는 스마트 컨트랙트를 구현하기 위한 객체 지향의 고수준 언어입니다. [Solidity를 배우는 과정](https://ethereum.stackexchange.com/questions/55048/modify-struct-on-upgradeable-smart-contracts?rq=1)에서 다른 함수의 동작을 수정하는 특별한 유형의 함수인 modifier를 접하게 될 것입니다.

이 글에서는 Solidity modifier가 무엇을 하는지 설명하고, modifier의 유형을 소개하며, 사용 방법을 보여드립니다. 이 글을 다 읽고 나면 Solidity modifier를 인식하고 사용 방법을 이해할 수 있게 될 것입니다.

## **Solidity modifier는 무엇을 하는가?**

**modifier는 다른 함수의 동작을 수정하는 데 사용되는 특별한 [Solidity 함수 유형](https://www.alchemy.com/overviews/solidity-functions)입니다.** 예를 들어, 개발자는 함수 실행을 허용하기 전에 특정 조건이 충족되는지 확인하기 위해 modifier를 사용할 수 있습니다.

modifier는 인자를 받을 수 있고 반환 타입을 가질 수 있다는 점에서 함수와 유사합니다. modifier는 또한 서로 연결될 수 있는데, 이는 하나의 함수에 여러 개의 modifier를 사용할 수 있다는 의미입니다.

하지만 modifier는 컨트랙트 로직만 수정할 수 있으며, struct를 포함한 [컨트랙트의 storage는 수정할 수 없습니다](https://ethereum.stackexchange.com/questions/55048/modify-struct-on-upgradeable-smart-contracts?rq=1). modifier는 개발자가 작성해야 하는 보일러플레이트 코드의 양을 줄여주고, Solidity 코드의 가독성을 높여줄 수 있습니다.

### **Solidity 함수에 여러 개의 modifier를 사용할 수 있는가?**

**예, 개발자는 하나의 Solidity 함수에 여러 개의 modifier를 사용할 수 있습니다.** 여러 개의 modifier는 쉼표로 구분됩니다. 여러 modifier를 사용할 때 한 가지 중요하게 유의할 점은 modifier의 순서가 중요하다는 것입니다. 목록에서 첫 번째 modifier가 먼저 실행되고, 두 번째 modifier가 그다음에 적용되는 식입니다.

예를 들어, 사용자가 인증되었는지 확인하는 modifier와 사용자가 특정 리소스를 볼 권한이 있는지 확인하는 또 다른 modifier가 있다면, 이 modifier들이 적용되는 순서에 따라 사용자가 해당 리소스를 볼 수 있는지 여부가 결정됩니다.

## **Solidity modifier의 유형에는 어떤 것들이 있는가?**

**Solidity modifier에는 gate check, prerequisite, filter, 재진입 공격 방지의 네 가지 큰 범주가 있습니다.**

### **1. Gate check**

"gate check"는 함수 실행을 허용하기 전에 특정 조건이 참인지 확인하는 modifier입니다.

예를 들어, 사용자가 자신의 계좌에서 돈을 인출할 수 있게 해주는 함수가 있다고 할 때, 함수가 실행되기 전에 개발자는 사용자의 계좌에 인출할 만큼 충분한 돈이 있는지 확인하고 싶을 수 있습니다. 이 확인 작업이 gate check modifier로 간주됩니다.

gate check의 또 다른 예로는 사용자가 특정 리소스를 볼 수 있도록 허용하기 전에 사용자가 인증되었는지 확인하는 함수가 있습니다.

### **2. Prerequisite**

"prerequisite"는 특정 조건이 참인지 확인하는 대신, 함수가 실행될 환경을 설정하는 modifier입니다.

예를 들어, Solidity 개발자는 함수를 실행하기 위해 일정량의 Ether가 함께 전송되어야 하는 함수를 사용할 수 있습니다. 이 경우, prerequisite는 Ether 잔액을 설정하는 함수가 됩니다.

### **3. Filter**

"filter"는 특정 조건이 참인지 확인하고, 참이면 함수 실행을 허용하는 modifier입니다. 조건이 참이 아니면 함수는 실행되지 않습니다.

조건이 참이더라도 함수 실행을 자동으로 허용하지 않는 gate check와 달리, filter는 조건이 참이면 함수 실행을 허용합니다.

### **4. 재진입 공격 방지**

**[재진입 공격](https://www.alchemy.com/overviews/reentrancy-attack-solidity)은 악의적인 행위자가 재귀 호출을 통해 함수를 여러 번 실행하여 이를 악용하려는 유형의 공격입니다.**

예를 들어, 사용자가 자신의 계좌에서 돈을 인출할 수 있게 해주는 함수가 있다고 상상해 보세요. 재진입 공격자는 실제로 계좌에 있는 것보다 더 많은 돈을 인출하기 위해 이 함수를 여러 번 호출하려고 시도할 수 있습니다.

재진입 공격을 방지하려면, 함수가 재귀적으로 호출되고 있는지 확인하는 modifier를 사용할 수 있습니다. 만약 그렇다면, 함수는 실행되지 않습니다.

## **require와 Solidity modifier의 관계는 무엇인가?**

**require는 modifier와 종종 상호 교환적으로 사용되는데, 둘 다 함수 실행을 허용하기 전에 [특정 조건이 참인지 확인](https://www.alchemy.com/university/courses/solidity?a=313ac76819)할 수 있게 해주기 때문입니다.** 지정된 조건이 참이 아니면, 컴파일러가 오류를 발생시킵니다.

예를 들어, 다음 문장은 오직 owner만 함수와 상호작용할 수 있도록 require 키워드를 사용합니다:

require와 Solidity modifier 사이에는 몇 가지 중요한 차이점이 있습니다:

1. modifier는 함수가 실행될 환경을 설정하는 데 사용될 수 있습니다 (prerequisite의 경우처럼)
1. _require_는 특정 조건이 참인지 확인하는 데만 사용될 수 있습니다
1. modifier는 오버라이드될 수 있습니다
1. _require_는 오버라이드될 수 없습니다

## **Solidity는 Vyper와 비교하여 modifier를 어떻게 처리하는가?**

Vyper는 Ethereum 스마트 컨트랙트 개발을 위한 파이썬 스타일 언어로, 보안을 강화하기 위해 [modifier를 사용하지 않는 것](https://www.alchemy.com/overviews/solidity-vs-vyper)을 포함해 몇 가지 트레이드오프를 취합니다. 대신, 개발자는 함수 내에서 인라인 체크와 assert를 사용하도록 되어 있으며, 스마트 컨트랙트를 수정할 때도 함수의 일부로 명시적으로 변경을 가하도록 되어 있습니다.

modifier를 사용할 수 없게 만든 Vyper의 선택은 스마트 컨트랙트의 감사 용이성을 높이는데, 이는 읽는 사람이 함수가 무엇을 할지 알기 위해 modifier를 함수 주위에 두고 머릿속으로 그려볼 필요가 없기 때문입니다.

### **modifier 오버라이딩이란 무엇인가?**

"virtual" 키워드는 파생 컨트랙트에서 modifier가 오버라이드될 수 있음을 나타내는 데 사용될 수 있습니다. 예를 들어, "myModifier"라는 modifier를 가진 "Base Contract"라는 컨트랙트가 있다고 상상해 보세요. 그리고 "Base Contract"를 상속하는 "Derived Contract"라는 컨트랙트도 있습니다.

"Base Contract"가 "virtual"로 표시되어 있다면, 파생 컨트랙트에서 오버라이드될 수 있습니다. 이는 컨트랙트가 커스터마이징을 허용하는 라이브러리의 맥락에서 자주 사용됩니다.

### **modifier는 상속과 어떻게 작동하는가?**

**상속은 컨트랙트의 속성과 프로퍼티를 확장할 수 있게 해주며, modifier의 맥락에서 상속은 새로운 modifier를 추가하거나 기존 modifier를 오버라이드할 수 있게 해줍니다.** 이는 앞 섹션에서 다룬 _virtual_ 키워드로 수행할 수 있습니다.

아래의 간단한 구현은 상속과 modifier가 함께 작동하는 방식을 보여줍니다:

이 예시에서 contract B는 contract A를 상속합니다. 두 컨트랙트 모두 "X"라는 modifier를 가지고 있습니다. 하지만 contract B에서는 이 modifier가 "override"로 표시되어 있으며, 이는 contract A의 modifier를 오버라이드한다는 것을 나타냅니다.

## **Solidity에서 modifier를 사용하는 방법**

modifier를 사용하려면 먼저 컨트랙트에서 modifier 함수를 정의해야 합니다. modifier는 "\_;"라는 특별한 기호를 사용하는데, modifier의 조건이 충족될 때만 함수 본문이 삽입됩니다.

**아래 컨트랙트는 modifier를 사용하는 방법을 보여줍니다:**

위 예시에서 이 컨트랙트는 "onlyOwner"와 "costs"라는 두 개의 modifier를 가지고 있습니다.

첫 번째 modifier는 _msg.sender_가 컨트랙트의 owner인지 확인하고, 두 번째 modifier는 _msg.value_가 특정 가격 이상인지 확인합니다.

이 두 modifier 모두 컨트랙트의 어떤 함수에도 사용할 수 있습니다.

## **Solidity modifier에 대해 계속 배우기**

modifier는 다른 함수의 동작을 수정하는 데 사용되는 함수입니다. modifier를 사용하면 작성해야 하는 보일러플레이트 코드의 양을 줄일 수 있고, Solidity 코드의 가독성을 높일 수 있습니다.

[Solidity modifier에 대해 계속 배우고](https://www.alchemy.com/overviews/learn-solidity) Solidity 개발자가 되는 방법을 알아보려면, Alchemy University의 7주 과정 Ethereum Developer Bootcamp에 자리를 확보하세요. 원래 ChainShot 팀이 만든 이 무료 [Solidity 크래시 코스](https://www.alchemy.com/university/courses/solidity?a=313ac76819)는 Solidity를 배우는 가장 좋은 방법입니다. 개발이 전반적으로 처음인 개발자라면, Alchemy University의 **3주 과정 JavaScript 크래시 코스**가 Ethereum 부트캠프를 시작하기 전 훌륭한 사전 준비 과정이 될 것입니다.
