본문 바로가기
개발 💻/Blockchain

[Ethereum] Remix 대신 Hardhat 사용해 보기

by 감사로봇 2025. 4. 8.

[출처] Hardhat 공식 홈페이지의 소개 문구

 

스마트 컨트랙트를 개발할 때, 많은 사람들이 처음 접하게 되는 툴이 바로 Remix 입니다.

 

[Ethereum] Remix를 이용하여 스마트 컨트랙트 배포하기

Remix 만약 이더리움 블록체인에 대해서도 잘 알지도 못하는데 스마트 컨트랙트를 구현해서 배포해야 하는 상황이 왔다면 적잖이 당황할 것입니다. 제가 그랬습니다. 인터넷에서 자료를 검색하

ts01.tistory.com

웹 기반 IDE로써, 별도의 설치 없이 브라우저에서 바로 Solidity 코드를 작성하고 배포할 수 있어 진입 장벽이 낮습니다. 하지만 프로젝트가 조금 커지고, 다음과 같은 필요성들이 생기면 고민이 생깁니다:

  • 배포를 반복하다보니 자동화하고 싶다.
  • 테스트 코드를 작성하고 싶다.
  • 가스비, 디버깅, 모듈화 등을 정교하게 다루고 싶다.
  • 로컬에서 전체 개발 워크플로우를 통제하고 싶다.

이럴 때 사용하면 좋은 도구가 바로 Hardhat 입니다.

이 글에서는 Remix 에 익숙한 개발자들을 위해 Hardhat 을 소개하고, 실제로 어떻게 시작하고 배포하는지, 그리고 Hardhat 의 장점이 될만한 기능들을 소개합니다.

 

Remix vs. Hardhat

Key Remix Hardhat
환경 웹 브라우저 기반 IDE 로컬 개발 환경 구축 필요
대상 입문자 및 실습 중심 실전 프로젝트 및 개발자
설치 필요 여부 없음 있음 (NPM, YARN 등 패키지 매니저 기반)
사용 난이도 매우 쉬운 편 (클릭 딸깍) 조금 더 복잡한 편 (설치, 실행 명령어 등)
배포 방식 Injected Web3 (MetaMask 연계 등) 스크립트 명령어 기반 (자동화 가능)
테스트 ❌ 간단한 UI 상의 실행 Mocha/Chai 등 자동 테스트 작성 가능
업그레이드/Proxy 지원 ❌ 제한적임 지원함
확장성  어려움  매우 유리함
디버깅 콘솔 중심의 제한적인 결과 console.log, Stack Trace, Coverage 가능

위의 비교표에서 보이다시피, Remix 와 Hardhat 은 편리함과 강력함 사이를 저울질하는 것과 같습니다. 좀더 쉽고 간편하게 접근할 수 있는 Remix 인 반면, 코드 관리나 좀더 강력한 도구들과 함께 사용할 수 있는 것이 바로 Hardhat 입니다.

 

Hardhat 시작하기

Hardhat 은 Node.js 기반에서 패키지 매니저를 통해 설치하고 실행할 수 있습니다. 즉, Node.js 와 YARN(또는 NPM) 패키지의 설치가 완료되어 있는지 확인하시기 바랍니다.

✅ 설치


        
mkdir hardhat-example && cd hardhat-example
yarn init -y
yarn add --dev hardhat

작업할 디렉토리를 하나 만들어준 다음, 패키지 매니저를 사용하여 hardhat 패키지를 설치합니다.
이 글에서는 YARN 패키지 매니저를 중심으로 설명하겠습니다.

만약 NPM 패키지 매니저를 사용한다면, 아래 명령어를 이용합니다.


        
npm init -y
npm install --save-dev hardhat

 

✅ Hardhat 초기화

아래 명령어를 통해, 기본 hardhat 초기화를 시작합니다. 명령어 결과로써, 기본 프로젝트 구조가 생성됩니다.


        
yarn hardhat

 

실행 내에서, TypeScript 또는 JavaScript 중 하나를 선택할 수 있습니다. 웬만하면 TypeScript 로 선택하시는 것을 추천드립니다. 

 

✅ Hardhat 폴더 구조 예시


        
hardhat-example/
├── contracts/ # Solidity 코드 위치
│ └── MyContract.sol
├── scripts/ # 배포 스크립트
│ └── deploy.ts
├── test/ # 테스트 코드
├── hardhat.config.ts # 설정 파일
└── package.json
  • 만약 Remix 에서 이미 작업해둔 Solidity 영역이 있다면, 해당 Solidity 파일들을 contracts/ 경로 하위로 옮기도록 합니다.
  • 배포를 위해, scripts/deploy.ts 파일을 생성하고, 그 안에 코드를 작성하도록 합니다.
  • 만약 테스트 코드를 작성하고 싶다면, tests/ 영역에서 코드를 작성하도록 합니다.
  • Hardhat 과 관련된 설정은 hardhat.config.ts 에서 수행할 수 있습니다.
  • 명령어를 간편하게 만들기 위해 package.json 에서 정의할 수 있습니다.

 

Hardhat 배포하기

예시로 컨트랙트를 작성하고, Base 테스트넷인 Base Sepolia 에 배포를 수행해보도록 하겠습니다.
이전 글에서 Remix 를 통해 배포했던 것과 비교해보시면 다른 점들을 확인할 수 있습니다.

 

[Ethereum] Base Sepolia (Superchain) 컨트랙트 배포하기

Base Sepolia (Superchain) 컨트랙트 배포하기이 글에서는 Remix 를 사용해 Solidity 로 작성한 스마트 컨트랙트를 Base Sepolia 테스트넷에 배포하는 방법을 소개합니다.글을 따라하면, 아래와 같은 것들을

ts01.tistory.com

 

✏️ 예시 Solidity 컨트랙트

만약 작성해둔 Solidity 컨트랙트 코드가 있다면, 해당 코드를 contracts/ 경로 내에 옮기도록 합니다.


        
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Counter {
uint256 public count;
function increment() public {
count += 1;
}
}

 

 

✏️ 예시 배포 스크립트

scripts/deploy.ts 파일을 생성하여, 아래와 같이 작성합니다. 배포를 수행한 다음, 트랜잭션을 출력하고, 배포된 Contract Address 값을 출력하고 있습니다.


        
import { ethers } from "hardhat";
async function main() {
const contractName = "Counter";
const contractFactory = await ethers.getContractFactory(contractName);
const contract = await contractFactory.deploy();
const deploymentTx = contract.deploymentTransaction();
console.log(
`Deployment transaction: ${JSON.stringify(deploymentTx, null, 4)}`
);
console.log(`Contract deployed to: ${await contract.getAddress()}`);
}
main();

 

⚒️ hardhat config 설정

hardhat.config.ts 파일에서 배포할 대상이 되는 체인과 계정 정보를 설정할 수 있습니다. 먼저, 환경변수를 쉽게 읽어오기 위해 dotenv 패키지를 설치합니다.


        
yarn add dotenv

 

그리고 환경변수 파일 .env 를 생성하여 배포 대상 계정의 개인키를 작성하도록 합니다.


        
PRIVATE_KEY=?

필요하다면, 배포 대상 체인의 Chain ID 나 RPC 엔드포인트 등을 작성하여 관리합니다.

 

이제 hardhat.config.ts 를 아래와 같이 작성합니다. 해당 내용에 Base Sepolia 에 대한 정보가 삽입되어 있습니다.


        
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import dotenv from "dotenv";
dotenv.config();
const config: HardhatUserConfig = {
solidity: "0.8.28",
networks: {
baseSepolia: {
url: "https://sepolia.base.org",
chainId: 84532,
accounts: [process.env.PRIVATE_KEY || ""],
},
},
};
export default config;

 

 

🚀 배포하기

다음 명령어를 이용하여, 작성된 컨트랙트를 컴파일하고 배포할 수 있습니다.


        
yarn hardhat compile
yarn hardhat run scripts/deploy.ts --network baseSepolia

 

만약 컴파일 과정에서 오류가 난다면 Solidiy 코드를 수정하면 되고, 배포가 실패한다면 그 결과를 스크립트 결과로써 확인할 수 있습니다.

 

Hardhat 추가적인 장점들

✅ 테스트 지원

Mocha/Chai 패키지 등을 설치하고, 테스트 코드를 작성하면 디버깅하면서 실질적인 컨트랙트 시나리오 테스트를 수행할 수 있습니다.


        
yarn hardhat test

 

✅ 손쉬운 네트워크 설정 및 전환

주로 사용하는 네트워크들을 미리 설정해두고, 명령어를 통해 배포 네트워크를 변경할 수 있습니다.


        
networks: {
baseSepolia: {
url: "https://sepolia.base.org",
chainId: 84532,
accounts: [process.env.PRIVATE_KEY]
},
fuji: {
url: "https://api.avax.network/ext/bc/C/rpc",
chainId: 43113,
accounts: [process.env.PRIVATE_KEY]
}
}

배포하는 명령어에서 --network 옵션을 통해 조절합니다.

 

✅ OpenZeppelin 플러그인 등의 설치와 관리

업그레이드 가능한 Proxy 패턴, UUPS, 권한 관리 등 실무급 기능들을 쉽게 구현할 수 있습니다.


        
yarn add @openzeppelin/contracts-upgradeable @openzeppelin/hardhat-upgrades

 

정리하며

Remix 는 Solidity 를 배우는 데 정말 좋은 도구이지만, 자신의 관리 아래에서 컨트랙트를 개발하려면 Hardhat 의 사용이 필요하게 될 수 있습니다. Hardhat 은 다음과 같은 사람들에게 정말 필요할 수 있습니다:

  • 여러 번 반복 배포하면서 자동화 하고 싶은 사람
  • 테스트 코드로 작성한 스마트 컨트랙트를 검증하고 싶은 사람
  • 메타트랜잭션, Proxy 같은 복잡한 구조를 다루는 사람
  • Github Actions, CI/CD 등을 연동하고 싶은 사람

특히, 저는 Github 형상관리 측면에서도, Remix 는 매번 LocalFileSystem 을 연결해야 하는 불편함을 해소하고 직접 환경을 관리/고도화할 수 있다는 측면에서 Hardhat 의 사용이 매우 유리하다고 생각합니다.

모두에게 즐거운 작업이 되었으면 좋겠습니다. 감사합니다.