Tech Lab2 min read
솔리디티 코스 #1: Solidity 동작 방식 한눈에 이해하기
이 글은 Solidity 코드의 실행 순서와 트랜잭션 동작 원리를 중심으로 이벤트 로그, 오류 처리, 주석, 표현식 개념을 단계적으로 설명합니다.
#Solidity#기초#스마트컨트랙트#입문#이더리움#개발#Solidity#실행흐름#Solidity#에러처리
독자는 이 글을 통해 Solidity 코드가 실행되는 기본 흐름과 트랜잭션 기반 동작 원리를 이해하고, 이후 스마트 컨트랙트 설계 시 발생하는 오류를 예방할 수 있습니다.

Solidity 코드 실행 흐름
Solidity 코드 역시 위에서 아래로 순차 실행되는 구조를 가집니다. 다만, 블록체인 환경에서는 모든 실행이 트랜잭션을 기준으로 동작한다는 점이 중요합니다.
코드 실행 순서
- 상태 변수 선언 및 초기화
- 함수 호출
- 트랜잭션 처리 및 상태 변경
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleContract {
string public message = "Hello, Solidity!";
function setMessage(string memory _newMessage) public {
message = _newMessage;
}
}
실행 흐름 설명
- 컨트랙트 배포 시
message변수가 먼저 선언되고 초기값이 저장됩니다. setMessage함수가 호출되면 새로운 트랜잭션이 발생하며message값이 변경됩니다.
주의: 선언되지 않은 변수를 먼저 사용하면 컴파일 단계에서 오류가 발생합니다.
Solidity 콘솔 출력: 이벤트 로그
JavaScript의 console.log()와 달리 Solidity는 이벤트(event) 를 사용해 블록체인 로그를 남깁니다.
이 로그는 트랜잭션 영수증(Transaction Receipt)에 기록됩니다.
이벤트 사용 예제
contract Logger {
event Log(string message);
function logMessage(string memory _message) public {
emit Log(_message);
}
}
- emit 키워드를 통해 이벤트를 발생시킵니다.
- 프런트엔드나 테스트 도구에서 이벤트를 구독하여 상태 변화를 추적할 수 있습니다.
팁: 이벤트는 상태를 변경하지 않기 때문에 가스 비용이 비교적 저렴합니다.
Solidity 코드의 오류 처리
Solidity 실행 중 오류가 발생하면 전체 트랜잭션이 롤백되며, 이전 상태로 되돌아갑니다.
오류 발생 예제
contract ErrorHandling {
function fail() public pure {
require(false, "This function always fails");
}
}
위 함수는 항상 실패하며, 호출 시 트랜잭션은 즉시 중단됩니다.
Solidity의 오류 처리 방식
| 함수 | 설명 |
|---|---|
require(condition, message) | 조건 불만족 시 오류 발생, 입력 검증에 사용 |
assert(condition) | 내부 로직 검증용, 실패 시 치명적 오류 |
revert(message) | 조건 없이 강제 롤백 |
주의:
assert실패는 가스를 모두 소모할 수 있으므로 신중히 사용해야 합니다.
Solidity에서 주석 사용
주석(Comment)은 코드의 의도를 설명하고 가독성을 높이는 데 필수적입니다.
주석 작성 방법
// 한 줄 주석
/* 여러 줄 주석 */
예제 코드
contract CommentsExample {
// 이 함수는 문자열을 반환합니다.
function getMessage() public pure returns (string memory) {
return "Hello, Solidity!"; // 문자열 반환
}
}
팁: 공개 라이브러리나 협업 프로젝트에서는 주석 품질이 코드 품질만큼 중요합니다.
Solidity의 값과 표현식
Solidity는 다양한 값(value) 과 표현식(expression) 을 지원하며, 연산은 즉시 평가됩니다.
값과 표현식 예제
contract Expressions {
uint256 public number = 10 * 2; // 결과: 20
function add(uint256 a, uint256 b) public pure returns (uint256) {
return a + b;
}
}
연산자 예제
contract Operators {
function calculate() public pure returns (uint256) {
return (10 + 5) * 2; // 결과: 30
}
}
- 산술 연산은 컴파일 시점 또는 실행 시점에 평가됩니다.
- 복잡한 표현식은 가독성을 위해 괄호 사용을 권장합니다.