modifier란?
modifier(제어자)는 함수 실행 전후에 공통 조건이나 로직을 끼워 넣는 재사용 가능한 코드 블록입니다.
같은 검사 코드를 여러 함수에 복사하지 않고, modifier 하나로 묶어 깔끔하게 적용할 수 있습니다.
"권한 검사", "상태 확인", "재진입 방지" 같은 반복되는 가드(guard) 로직을 한 곳에 모으는 도구입니다.
_; 의 의미
modifier 안의 _;(언더스코어 세미콜론)는 "여기서 원래 함수의 본문이 실행된다" 는 자리표시자입니다.
_; 앞의 코드는 함수 실행 전에, 뒤의 코드는 함수 실행 후에 동작합니다.
_; 를 빼먹으면 함수 본문이 아예 실행되지 않으니 반드시 넣어야 합니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Counter {
address public owner;
uint256 public count;
constructor() {
owner = msg.sender;
}
// owner만 통과시키는 modifier
modifier onlyOwner() {
require(msg.sender == owner, "owner only");
_; // 검사를 통과하면 함수 본문 실행
}
function increment() public onlyOwner {
count += 1;
}
}전·후 처리와 다중 적용
_; 뒤에 코드를 두면 함수가 끝난 뒤 후처리를 할 수 있습니다. 예를 들어 재진입 방지 패턴은
_; 앞에서 잠금을 걸고 _; 뒤에서 잠금을 풉니다.
하나의 함수에 여러 modifier 를 붙일 수도 있습니다. function f() public onlyOwner whenActive { ... }
처럼 나열하면 왼쪽에서 오른쪽 순서로 차례차례 적용됩니다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Guarded {
bool private locked;
modifier noReentrant() {
require(!locked, "reentrant call");
locked = true; // _; 앞: 함수 실행 전 잠금
_;
locked = false; // _; 뒤: 함수 실행 후 잠금 해제
}
function safeAction() public noReentrant {
// 보호된 로직
}
}modifier 는 가독성과 보안을 동시에 높입니다. onlyOwner 라는 이름만 봐도 "이 함수는 소유자
전용"이라는 의도가 한눈에 드러나기 때문입니다.
modifier 는 접근 제어(onlyOwner), 상태 검사, 재진입 방지 등 다양한 곳에 쓰이는 핵심 도구입니다.