Tech Lab2 min read
솔리디티 코스#2: 컨트랙트 구조·구성요소, 예제 정리
컨트랙트 파일의 머리부터 바디까지, 꼭 알아야 할 구성요소를 예제와 표로 빠르게 익힙니다. 초보도 바로 배포·실습 가능한 최소 예제를 제공합니다.
#솔리디티#스마트#컨트랙트#구조#pragma#버전#상태#변수#생성자#함수
이 글을 통해 Solidity 컨트랙트의 파일 구조와 구성요소 관계를 한눈에 이해하고, 실전 예제로 바로 응용할 수 있습니다.

소스 파일의 큰 그림
- 컨트랙트는 “파일 헤더 → 선언부 → 본문(상태·함수)” 순으로 구성됩니다.
- 헤더의
SPDX와pragma는 컴파일·배포 호환성을 좌우합니다. - 본문은 상태(State) → 생성자(Constructor) → 함수(Functions) 흐름으로 읽으면 이해가 빠릅니다.
최소 예제로 구조 파악하기
아래는 가장 작은 형태의 학습용 예제입니다. 한 줄씩 읽으며 구조를 익혀 보세요.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract SimpleContract {
// 1) 상태 변수: 블록체인에 저장됨
string public message;
// 2) 생성자: 배포 시 1회 실행
constructor(string memory _message) {
message = _message;
}
// 3) 함수: 동작 정의
function setMessage(string memory _newMessage) public {
message = _newMessage;
}
function getMessage() public view returns (string memory) {
return message;
}
}
팁: public 상태 변수에는 자동 getter가 생성됩니다. 학습 단계에서는 getMessage()처럼 명시적 getter도 함께 두면 호출 흐름 이해에 도움이 됩니다.
주요 구성요소 한눈에 보기
컨트랙트 파일에서 자주 보게 될 요소들을 요약합니다.
| 구성 요소 | 설명 |
|---|---|
| 주석/라이선스 | // SPDX-License-Identifier: MIT : 오픈소스 라이선스 선언 |
| 프라그마 | pragma solidity ^0.8.20; : 컴파일러 버전 범위 지정 |
| 컨트랙트 선언 | contract Name {} : 코드의 루트 블록 |
| 상태 변수 | 체인에 영구 저장되는 데이터, 예: string public message; |
| 생성자 | 배포 시 1회 실행, 초기 상태 설정 |
| 함수 | 읽기(view), 쓰기(트랜잭션), 내부 로직 정의 |
주의:
pragma는 팀/프로젝트의 빌드 매트릭스에 맞춰 엄격히 고정하는 편이 안전합니다. 무분별한 범위 지정은 예기치 못한 컴파일러 변경을 초래할 수 있습니다.
디테일: 각 요소 깊이 파기
SPDX와 주석
- 파일 최상단에 위치하며, 라이선스 추적과 준수를 돕습니다.
- 공개 저장소에 올리는 코드라면 반드시 포함하세요.
pragma(컴파일러 버전)
^0.8.20은 0.8.20 이상 0.9.0 미만과 호환을 뜻합니다.- 라이브러리 의존성이 많다면 정확 버전 고정(
=0.8.20)도 고려합니다.
컨트랙트 선언과 네이밍
- 컨벤션: PascalCase 사용, 파일명과 일치하면 가독성↑.
- 한 파일에 여러 컨트랙트를 둘 수 있으나, 주요 컨트랙트 1개 원칙을 권장합니다.
상태 변수(State)
uint256 public count = 0;
- 저장 비용(가스)이 있으므로 필요 최소한만 유지하세요.
- 접근 지정자(
public,private)와 가시성 정책을 먼저 결정합니다.
생성자(Constructor)
constructor() {
owner = msg.sender;
}
- 초기 권한·파라미터를 설정합니다. 업그레이더블 패턴에서는 생성자 대신 초기화 함수를 사용합니다.
함수(Functions)
- 읽기 전용은
view/pure, 쓰기 함수는 트랜잭션이 필요합니다. - 가시성(
public,external,internal,private)을 명시해 인터페이스 표면을 최소화하세요.
안전한 구조를 위한 체크리스트
- 파일 상단:
SPDX와pragma를 프로젝트 표준에 맞게 고정한다. - 상태 설계: 저장 비용을 감안해 구조를 단순화한다.
- 권한: 배포자/관리자 주소 설정과 수정 경로를 점검한다.
- 함수 표면: 외부 공개 함수를 최소화하고 입력 검증을 추가한다.
- 테스트: 배포 전 단위/통합 테스트로 상태 전이와 이벤트를 확인한다.
핵심 전제: 컨트랙트 구조는 가독성과 보안의 토대입니다. 초기에 잡은 구조가 유지보수 비용을 좌우합니다.
