Tech Lab2 min read

솔리디티 코스#2: 컨트랙트 구조·구성요소, 예제 정리

컨트랙트 파일의 머리부터 바디까지, 꼭 알아야 할 구성요소를 예제와 표로 빠르게 익힙니다. 초보도 바로 배포·실습 가능한 최소 예제를 제공합니다.

#솔리디티#스마트#컨트랙트#구조#pragma#버전#상태#변수#생성자#함수

이 글을 통해 Solidity 컨트랙트의 파일 구조와 구성요소 관계를 한눈에 이해하고, 실전 예제로 바로 응용할 수 있습니다.

솔리디티 흐름

소스 파일의 큰 그림

  • 컨트랙트는 “파일 헤더 → 선언부 → 본문(상태·함수)” 순으로 구성됩니다.
  • 헤더의 SPDXpragma컴파일·배포 호환성을 좌우합니다.
  • 본문은 상태(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.200.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)을 명시해 인터페이스 표면을 최소화하세요.

안전한 구조를 위한 체크리스트

  1. 파일 상단: SPDXpragma를 프로젝트 표준에 맞게 고정한다.
  2. 상태 설계: 저장 비용을 감안해 구조를 단순화한다.
  3. 권한: 배포자/관리자 주소 설정과 수정 경로를 점검한다.
  4. 함수 표면: 외부 공개 함수를 최소화하고 입력 검증을 추가한다.
  5. 테스트: 배포 전 단위/통합 테스트로 상태 전이와 이벤트를 확인한다.

핵심 전제: 컨트랙트 구조는 가독성과 보안의 토대입니다. 초기에 잡은 구조가 유지보수 비용을 좌우합니다.

변수 흐름

다음으로 읽어볼 글