web3.js와 ethers.js는 둘 다 Ethereum과 상호작용할 수 있게 해주는 대표적인 JavaScript/TypeScript 라이브러리입니다.
하지만 내부 설계, API 스타일, 기능 지원, 타입 안전성 등에서 꽤 큰 차이가 있어요.
⸻
🔍 web3.js vs ethers.js v6 비교분석
| 항목 | web3.js | ethers.js v6 |
|---|---|---|
| 🧠 설계 철학 | API 친숙함 & 전통적인 JS 스타일 | 경량화 + 함수형 + 타입 안정성 |
| 🧾 최신 버전 | v1.10.x (2024 기준) | ✅ v6.x (대폭 리팩토링됨) |
| 🔧 모듈화 | 대부분 하나의 번들로 제공 | ✅ 모듈별 tree-shaking 지원 |
| 📦 번들 크기 | 크고 무겁다 (~800KB) | ✅ 작고 가볍다 (~100KB) |
| 🔤 타입스크립트 지원 | 제한적 (@types/web3) | ✅ 완전 지원, 타입 안전성 강력 |
| 📡 Provider 체계 | 단순한 연결 모델 | ✅ 정교한 Provider 구조 (JsonRpcProvider, WebSocketProvider, etc) |
| 🧮 단위 변환 | .toWei(), .fromWei() 등 util 중심 | ✅ parseEther(), formatUnits() 등 직관적 함수형 API |
| 🛠 ABI 사용 | 복잡하거나 manual한 처리 필요 | ✅ Contract 생성이 깔끔하고 직관적 |
| 🔐 Wallet/Signer | 불편하고 외부 패키지 필요 | ✅ Wallet, Signer 내장 |
| 🧩 플러그인 구조 | 없음 | ✅ 커스터마이징 가능한 Plugin 설계 지원 |
| 🧪 테스트 환경 호환 | Hardhat, Ganache 등과 호환 | ✅ 완벽한 Hardhat 연동 (ethers.provider) |
| 🗃 상태관리 (call/send) | .methods.foo().call() | ✅ 함수처럼 contract.foo() |
⸻
🧪 코드 비교 예시
- 잔액 조회
🔷 web3.js
const Web3 = require("web3");
const web3 = new Web3("https://mainnet.infura.io/v3/KEY");
const balanceWei = await web3.eth.getBalance("0x...");
const balanceEth = web3.utils.fromWei(balanceWei, "ether");🔶 ethers v6
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider("https://mainnet.infura.io/v3/KEY");
const balance = await provider.getBalance("0x...");
console.log(ethers.formatEther(balance));⸻
- Contract 호출
🔷 web3.js
const contract = new web3.eth.Contract(abi, address);
const name = await contract.methods.name().call();🔶 ethers v6
const contract = new ethers.Contract(address, abi, provider);
const name = await contract.name();✅ ethers는 .methods.call() 패턴 없이 자연스럽게 동작합니다.
⸻
✅ 장단점 요약
🔷 web3.js
✅ 장점
• 문서 많고 사용자가 많음
• Ethereum 초창기부터 사용된 안정된 라이브러리
• 간단한 기능은 배우기 쉽다
❌ 단점
• 타입스크립트 지원 부족
• 모듈 크고 무거움
• .methods().call() 등 불편한 호출 방식
• 비동기 체계와 예외 처리 어려움
⸻
🔶 ethers.js v6
✅ 장점
• 완전한 TypeScript 지원 (타입 추론 정확)
• 더 깔끔하고 모던한 API
• 가볍고 빠른 빌드 타임
• Hardhat과 궁합 좋음 (기본 내장)
• Wallet, Signer, Provider, Interface 등이 모두 잘 구조화됨
❌ 단점
• v6은 v5와 호환 안 되므로 일부 사용법 변경 필요
• 최신 기능 학습이 조금 필요
⸻
🧭 선택 가이드
| 상황 | 추천 |
|---|---|
| TypeScript 프로젝트 | ✅ ethers.js v6 |
| Hardhat 기반 테스트 | ✅ ethers.js |
| 오래된 코드/문서 기반 유지 | web3.js (v1.x) |
| 속도/용량 최적화 필요 | ✅ ethers.js |
| 단순한 학습용/시작용 | web3.js 가능하지만 오래된 구조 |
⸻
✅ 결론
실전 프로젝트, 특히 TypeScript 기반이라면
🔥 ethers.js v6가 사실상 표준이며 최선의 선택입니다.
⸻
'이더리움' 카테고리의 다른 글
| [DEX] UniSwap 기본개념 (0) | 2025.04.15 |
|---|---|
| EVM 의 스토리지 구조에 따른 array vs. mapping (0) | 2025.03.26 |
| 스마트 컨트랙트 개발도구: JavaScript vs. TypeScript (0) | 2025.03.25 |
| EIP-1559 와 가스요금 계산 (0) | 2025.03.25 |
| ERC-721 의 transferFrom vs. safeTransferFrom (0) | 2025.03.25 |