---
title: "ethers.js로 NFT 민팅하는 방법"
description: "ethers.js로 NFT를 민팅하는 단계별 가이드를 확인하세요. 나만의 디지털 자산을 손쉽게 만들고 블록체인 혁명에 동참하세요!"
---

# ethers.js로 NFT 민팅하는 방법

이 튜토리얼은 [ethers.js](https://www.alchemy.com/dapps/ethers-js) 라이브러리를 사용하는 Ethers와, Part I: How to Create an NFT에서 만든 스마트 컨트랙트를 이용해 Ethereum 블록체인에 NFT를 민팅하는 방법을 설명합니다. 또한 기본적인 테스트 설

_이 가이드를 완료하는 데 걸리는 예상 시간: 약 10분_

또한 저희 NFT 튜토리얼 시리즈의 나머지 글들도 꼭 확인해 보세요:

- 🌟  [Web3.js를 사용해 NFT를 민팅하는 방법](https://www.alchemy.com/blog/how-to-mint-an-nft-using-web3-js)
- 👛  [모바일 지갑에서 NFT를 확인하는 방법](https://www.alchemy.com/blog/how-to-view-your-nft-in-your-mobile-wallet)
- 💸  [NFT에 가격을 설정하는 방법](https://www.alchemy.com/blog/how-to-set-a-price-on-an-nft)
- 💻  [NFT 민터 튜토리얼: 풀스택 DApp을 만드는 방법](https://www.alchemy.com/blog/nft-minter-tutorial-how-to-create-a-full-stack-dapp)

[다른 튜토리얼](https://www.alchemy.com/docs/reference/nft-api-overview)에서는 Web3와 [OpenZeppelin 컨트랙트 라이브러리](https://docs.openzeppelin.com/contracts/erc721)를 사용해 NFT를 민팅하는 방법을 배웠습니다. 이번 실습에서는 [OpenZeppelin 라이브러리](https://docs.openzeppelin.com/contracts/4.x/erc721) 버전 4와, Web3 대신 [Ethers.js](https://docs.ethers.io/) Ethereum 라이브러리를 사용하는 대안적인 구현 방식을 단계별로 살펴보겠습니다.

또한 [Hardhat](https://www.alchemy.com/dapps/hardhat)과 [Waffle](https://www.alchemy.com/dapps/waffle)을 사용해 컨트랙트를 테스트하는 기본 방법도 다룹니다. 이 튜토리얼에서는 Yarn을 사용하지만, 원한다면 npm/npx를 사용해도 됩니다.

마지막으로 TypeScript를 사용합니다. 이 부분은 이미 잘 문서화되어 있으므로 여기서는 다루지 않습니다.

그 외의 모든 부분에서 이 튜토리얼은 Pinata와 IPFS 같은 도구를 포함해 Web3 버전과 동일하게 동작합니다.

## 간단한 참고 사항

참고로, "NFT를 민팅한다"는 것은 여러분의 ERC721 토큰의 고유한 인스턴스를 블록체인에 게시하는 행위를 말합니다. 이 튜토리얼은 NFT 튜토리얼 시리즈 [Part I에서 Ropsten 네트워크에 스마트 컨트랙트를 배포](https://www.alchemy.com//blog/how-to-create-an-nft)했고, 그 과정에서 Ethers를 설치했다는 것을 전제로 합니다.

## 1단계: Solidity 컨트랙트 작성하기

[OpenZeppelin](https://www.alchemy.com/dapps/openzeppelin)은 안전한 스마트 컨트랙트 개발을 위한 라이브러리입니다. [ERC20](https://www.alchemy.com/overviews/erc20-solidity)이나 ERC721 같은 널리 쓰이는 표준의 구현체를 상속받아, 필요에 맞게 동작을 확장하면 됩니다. 이 파일은 contracts/MyNFT.sol에 작성합니다.

## 2단계: 컨트랙트 배포와 NFT 민팅을 위한 Hardhat 태스크 만들기

다음 내용을 담은 tasks/nft.ts 파일을 만듭니다:

## 3단계: 헬퍼 만들기

앞서 만든 태스크에서 몇 가지 헬퍼를 가져온 것을 확인할 수 있습니다. 해당 헬퍼들은 다음과 같습니다.

`contract.ts`

`env.ts`

`provider.ts`

마지막의 getProvider\(\) 함수는 ropsten 네트워크를 사용한다는 점에 유의하세요. 이 인자는 선택 사항이며, 생략하면 기본값으로 "homestead"가 사용됩니다. 저희는 물론 Alchemy를 사용하지만, [지원되는 다른 대안들](https://docs.ethers.io/v5/api/providers/#providers-getDefaultProvider)도 있습니다.

`wallet.ts`

## 4단계: 테스트 작성하기

test 디렉터리 아래에 다음 파일들을 만듭니다. 이 테스트들은 포괄적이지 않다는 점에 유의하세요. OpenZeppelin 라이브러리가 제공하는 ERC721 기능 중 일부만 테스트하며, 더 견고한 테스트를 만들기 위한 기본 구성 요소를 제공하는 것이 목적입니다.

`test/MyNFT.spec.ts (unit tests)`

`tasks.spec.ts (integration specs)`

`test-helpers.ts` 여기에는 sinon, chai, sinon-chai를 비롯해 임포트된 NPM 라이브러리들이 필요하다는 점에 유의하세요. `sinon.restore()` 호출은 스터빙(stubbing)을 사용하기 때문에 필요합니다.

## 5단계: 설정

다음은 상당히 단순한 형태의 `hardhat.config.ts`입니다.

테스트를 실행 중이 아닐 때만 dotenv를 호출하는 조건문에 주목하세요. 프로덕션 환경에서는 이렇게 실행하고 싶지 않을 수 있지만, .env 파일이 없으면 dotenv가 이를 조용히 무시한다는 점은 안심해도 됩니다.

## 태스크 실행하기

이제 이 파일들을 모두 준비했으니, hardhat을 실행해 우리가 만든 태스크들을 확인할 수 있습니다 \(간결함을 위해 내장 태스크는 제외했습니다\).

태스크에 어떤 인자를 넘겨야 하는지 잊으셨나요? 걱정하지 마세요.

## 테스트 실행하기

테스트를 실행하려면 `hardhat test`를 실행합니다.

## 요약

이 튜토리얼에서는 [Solidity](https://www.alchemy.com/overviews/solidity)를 기반으로 잘 테스트된 NFT 인프라의 탄탄한 토대를 만들었습니다. **waffle.provider.getWallets\(\)**가 제공하는 지갑은 로컬 가짜 [Hardhat Network](https://hardhat.org/hardhat-network/) 계정에 연결되어 있으며, 이 계정에는 [편리하게도 eth 잔액이 미리 채워져 있어](https://hardhat.org/hardhat-network/reference/#initial-state) 테스트 트랜잭션에 필요한 자금으로 사용할 수 있습니다.
