쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

안녕하세요!!!고객님이 상상하시는 작업물 그 이상을 작업해 드리려 노력합니다.저는 작업물을 완성하여 고객님에게 보내드리는 것으로 거래 완료...

 >>>서비스 설명<<<저렴한 가격, 합리적인 가격, 최적의 공수로윈도우 프로그램을 제작해 드립니다고객이 원하는 프로그램...

개인용도의 프로그램이나 소규모 프로그램을 합리적인 가격으로 제작해드립니다.개발 아이디어가 있으시다면 부담 갖지 마시고 문의해주세요. ...

프로그래밍 15년이상 개발자입니다.(이학사, 공학 석사) ※ 판매자와 상담 후에 구매해주세요. 학습을 위한 코드, 게임, 엑셀 자동화, 업...

이더리움 DApp (분산 애플리케이션) 개발 실습

2024-09-09 05:53:11

재능넷
조회수 527 댓글수 0

이더리움 DApp (분산 애플리케이션) 개발 실습 🚀

 

 

블록체인 기술의 발전과 함께 분산 애플리케이션(DApp)의 중요성이 날로 커지고 있습니다. 특히 이더리움 플랫폼은 스마트 컨트랙트를 통해 다양한 DApp 개발을 가능하게 하며, 개발자들에게 무한한 가능성을 제공하고 있죠. 이 글에서는 이더리움 DApp 개발에 대해 상세히 알아보고, 실제 개발 과정을 단계별로 살펴보겠습니다. 🌟

현재 블록체인 기술은 금융, 공급망 관리, 디지털 신원 확인 등 다양한 산업 분야에서 혁신을 일으키고 있습니다. 이러한 트렌드 속에서 DApp 개발 능력은 프로그래머에게 매우 중요한 스킬이 되었습니다. 재능넷과 같은 재능 공유 플랫폼에서도 블록체인 관련 서비스 개발 요청이 증가하고 있어, 이 분야의 전문성을 갖추는 것이 큰 경쟁력이 될 수 있습니다.

 

이제 본격적으로 이더리움 DApp 개발에 대해 알아보겠습니다. 우리는 기본 개념부터 시작해 실제 개발 환경 설정, 스마트 컨트랙트 작성, 프론트엔드 개발, 그리고 배포까지의 전 과정을 다룰 예정입니다. 각 단계마다 실용적이고 구체적인 예제를 통해 여러분의 이해를 돕겠습니다. 자, 그럼 흥미진진한 DApp 개발의 세계로 함께 떠나볼까요? 💻✨

1. 이더리움과 DApp의 기본 개념 이해하기 🧠

이더리움 DApp 개발을 시작하기 전에, 먼저 기본적인 개념들을 확실히 이해해야 합니다. 이는 마치 집을 짓기 전 단단한 기초를 다지는 것과 같습니다.

1.1 이더리움이란? 🌐

이더리움은 비탈릭 부테린에 의해 제안된 분산형 오픈소스 블록체인 플랫폼입니다. 비트코인이 단순히 디지털 화폐의 거래에 중점을 둔 것과 달리, 이더리움은 스마트 컨트랙트라는 개념을 도입하여 더 복잡하고 다양한 애플리케이션의 개발을 가능하게 했습니다.

 

이더리움의 주요 특징은 다음과 같습니다:

  • 스마트 컨트랙트: 프로그래밍 가능한 계약으로, 특정 조건이 충족되면 자동으로 실행됩니다.
  • 이더(ETH): 이더리움 네트워크의 기본 암호화폐로, 거래 수수료(가스)로 사용됩니다.
  • 탈중앙화: 중앙 서버 없이 분산된 노드들이 네트워크를 유지합니다.
  • 확장성: 다양한 DApp 개발이 가능한 플랫폼을 제공합니다.

1.2 DApp(분산 애플리케이션)이란? 📱

DApp은 Decentralized Application의 약자로, 중앙화된 서버 대신 블록체인 네트워크 위에서 동작하는 애플리케이션을 말합니다. 전통적인 앱과 DApp의 주요 차이점은 다음과 같습니다:

전통적인 앱 vs DApp

  • 데이터 저장: 중앙 서버 vs 블록체인
  • 제어: 중앙화된 주체 vs 분산화된 네트워크
  • 투명성: 제한적 vs 완전 공개 (대부분의 경우)
  • 수정 가능성: 쉬움 vs 어려움 (불변성)

DApp의 구조는 크게 세 부분으로 나눌 수 있습니다:

  1. 스마트 컨트랙트: 블록체인 상에 배포되는 비즈니스 로직
  2. 프론트엔드: 사용자 인터페이스
  3. Web3 라이브러리: 프론트엔드와 스마트 컨트랙트를 연결하는 브릿지

1.3 스마트 컨트랙트의 이해 📜

스마트 컨트랙트는 이더리움 DApp의 핵심입니다. 이는 특정 조건이 충족되면 자동으로 실행되는 프로그램으로, 블록체인 상에 저장되고 실행됩니다.

 

스마트 컨트랙트의 주요 특징:

  • 자동 실행: 조건이 충족되면 중개자 없이 자동으로 실행됩니다.
  • 불변성: 한번 배포되면 수정이 불가능합니다. (업그레이드 패턴을 사용하지 않는 한)
  • 투명성: 모든 거래와 코드가 공개됩니다.
  • 신뢰성: 중앙화된 주체 없이 신뢰할 수 있는 실행을 보장합니다.
스마트 컨트랙트 작동 원리 조건 충족 자동 실행 결과 기록

이제 이더리움과 DApp, 그리고 스마트 컨트랙트에 대한 기본적인 이해를 갖추셨을 것입니다. 이러한 개념들은 실제 DApp 개발 과정에서 계속해서 만나게 될 테니, 잘 기억해 두시기 바랍니다. 다음 섹션에서는 실제 개발 환경을 설정하는 방법에 대해 알아보겠습니다. 🛠️

2. 개발 환경 설정하기 🛠️

이더리움 DApp 개발을 시작하기 위해서는 적절한 개발 환경을 구축해야 합니다. 이 과정은 마치 요리를 시작하기 전 주방을 정리하고 필요한 도구들을 준비하는 것과 같습니다. 여기서는 DApp 개발에 필요한 주요 도구들과 그 설치 방법에 대해 알아보겠습니다.

2.1 Node.js 및 npm 설치 🟢

Node.js는 JavaScript 런타임 환경으로, 서버 사이드 애플리케이션 개발에 사용됩니다. npm(Node Package Manager)은 Node.js 패키지 관리 도구로, 다양한 JavaScript 라이브러리를 쉽게 설치하고 관리할 수 있게 해줍니다.

 

설치 방법:

  1. Node.js 공식 웹사이트(https://nodejs.org)에 접속합니다.
  2. LTS(Long Term Support) 버전을 다운로드하고 설치합니다.
  3. 설치가 완료되면 터미널(맥OS) 또는 명령 프롬프트(윈도우)에서 다음 명령어를 실행하여 설치를 확인합니다:
node --version
npm --version

2.2 Truffle 프레임워크 설치 🍫

Truffle은 이더리움 DApp 개발을 위한 강력한 개발 프레임워크입니다. 스마트 컨트랙트 컴파일, 배포, 테스트 등 다양한 기능을 제공합니다.

 

설치 방법:

npm install -g truffle

설치가 완료되면 다음 명령어로 버전을 확인할 수 있습니다:

truffle version

2.3 Ganache 설치 🏠

Ganache는 로컬 이더리움 네트워크를 시뮬레이션하는 도구입니다. 개발 및 테스트 목적으로 사용되며, 실제 이더리움 메인넷에 배포하기 전 DApp을 안전하게 테스트할 수 있게 해줍니다.

 

설치 방법:

  1. Ganache 공식 웹사이트(https://www.trufflesuite.com/ganache)에 접속합니다.
  2. 운영 체제에 맞는 버전을 다운로드하고 설치합니다.

2.4 MetaMask 설치 🦊

MetaMask는 브라우저 확장 프로그램으로, 이더리움 월렛 기능을 제공합니다. DApp과 상호작용할 때 필요한 도구입니다.

 

설치 방법:

  1. 브라우저의 확장 프로그램 스토어에서 "MetaMask"를 검색합니다.
  2. "MetaMask" 확장 프로그램을 설치합니다.
  3. 설치 후 브라우저 상단에 여우 아이콘이 나타납니다.

2.5 코드 에디터 설치 📝

효율적인 개발을 위해 적절한 코드 에디터가 필요합니다. Visual Studio Code(VS Code)는 많은 개발자들이 선호하는 무료 코드 에디터입니다.

 

설치 방법:

  1. VS Code 공식 웹사이트(https://code.visualstudio.com)에 접속합니다.
  2. 운영 체제에 맞는 버전을 다운로드하고 설치합니다.

VS Code에 Solidity 확장 프로그램을 설치하면 스마트 컨트랙트 개발이 더욱 편리해집니다.

2.6 개발 환경 테스트하기 🧪

모든 도구를 설치했다면, 간단한 프로젝트를 생성하여 개발 환경을 테스트해 봅시다.

  1. 새로운 디렉토리를 생성하고 그 디렉토리로 이동합니다:
mkdir my-dapp
cd my-dapp
  1. Truffle 프로젝트를 초기화합니다:
truffle init
  1. 프로젝트가 성공적으로 생성되었는지 확인합니다:
ls

contracts, migrations, test 디렉토리와 truffle-config.js 파일이 보인다면 성공적으로 환경 설정이 완료된 것입니다.

이더리움 DApp 개발 환경 Node.js & npm Truffle Ganache MetaMask VS Code

이제 이더리움 DApp 개발을 위한 기본적인 환경 설정이 완료되었습니다. 이 환경을 바탕으로 다음 섹션에서는 실제 스마트 컨트랙트를 작성하고 배포하는 방법에 대해 알아보겠습니다. 개발 과정에서 문제가 발생하면 각 도구의 공식 문서를 참조하거나, 재능넷과 같은 플랫폼에서 전문가의 도움을 받는 것도 좋은 방법입니다. 그럼 이제 본격적인 DApp 개발을 시작해볼까요? 💪🚀

3. 스마트 컨트랙트 개발하기 📝

이제 개발 환경이 준비되었으니, 실제 스마트 컨트랙트를 개발해 보겠습니다. 스마트 컨트랙트는 이더리움 DApp의 핵심 구성 요소로, 블록체인 상에서 실행되는 비즈니스 로직을 담고 있습니다.

3.1 Solidity 언어 소개 🔤

Solidity는 이더리움 스마트 컨트랙트 개발을 위해 특별히 설계된 프로그래밍 언어입니다. JavaScript와 유사한 문법을 가지고 있어 웹 개발자들이 쉽게 배울 수 있습니다.

 

Solidity의 주요 특징:

  • 정적 타입 언어: 변수의 타입을 명시적으로 선언해야 합니다.
  • 객체 지향: 상속, 라이브러리 등의 개념을 지원합니다.
  • 스마트 컨트랙트 중심: 컨트랙트라는 개념을 기본 단위로 사용합니다.
  • 가스 최적화: 효율적인 코드 실행을 위한 최적화 기능을 제공합니다.

3.2 간단한 스마트 컨트랙트 작성하기 ✍️

이제 실제로 간단한 스마트 컨트랙트를 작성해 보겠습니다. 우리가 만들 컨트랙트는 간단한 투표 시스템입니다.

 

먼저, contracts 디렉토리에 Voting.sol 파일을 생성하고 다음 코드를 작성합니다:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract Voting {
    mapping(string => uint256) public votes;
    string[] public candidates;

    constructor(string[] memory _candidates) {
        candidates = _candidates;
    }

    function vote(string memory candidate) public {
        require(isValidCandidate(candidate), "Not a valid candidate");
        votes[candidate] += 1;
    }

    function getVotes(string memory candidate) public view returns (uint256) {
        return votes[candidate];
    }

    function isValidCandidate(string memory candidate) private view returns (bool) {
        for (uint i = 0; i < candidates.length; i++) {
            if (keccak256(abi.encodePacked(candidates[i])) == keccak256(abi.encodePacked(candidate))) {
                return true;
            }
        }
        return false;
    }
}

이 컨트랙트의 주요 기능을 살펴보겠습니다:

  • constructor: 컨트랙트 배포 시 후보자 목록을 초기화합니다.
  • vote: 특정 후보에게 투표합니다.
  • getVotes: 특정 후보의 득표 수를 조회합니다.
  • isValidCandidate: 입력된 후보가 유효한지 확인합니다.

3.3 스마트 컨트랙트 컴파일하기 🔨

작성한 스마트 컨트랙트를 컴파일하여 바이트코드로 변환해야 합니다. Truffle을 사용하면 이 과정을 쉽게 수행할 수 있습니다.

 

터미널에서 다음 명령어를 실행합니다:

truffle compile

컴파일이 성공적으로 완료되면 build/contracts 디렉토리에 Voting.json 파일이 생성됩니다. 이 파일에는 컴파일된 바이트코드와 ABI(Application Binary Interface)가 포함되어 있습니다.

3.4 스마트 컨트랙트 배포 준비하기 🚀

컴파일된 스마트 컨트랙트를 배포하기 위해 마이그레이션 스크립트를 작성해야 합니다. migrations 디렉토리에 2_deploy_contracts.js 파일을 생성하고 다음 코드를 작성합니다:

const Voting = artifacts.require("Voting");

module.exports = function(deployer) {
  const candidates = ["Candidate 1", "Candidate 2", "Candidate 3"];
  deployer.deploy(Voting, candidates);
};

이 스크립트는 Voting 컨트랙트를 배포하고, 초기 후보자 목록을 설정합니다.

3.5 Ganache로 로컬 블록체인 네트워크 실행하기 🏠

실제 이더리움 메인넷에 배포하기 전에 로컬 환경에서 테스트하는 것이 좋습니다. Ganache를 실행하여 로컬 이더리움 네트워크를 시작합니다.

  1. Ganache 애플리케이션을 실행합니다.
  2. "New Workspace" 버튼을 클릭하고 워크스페이스 이름을 입력합니다.
  3. "Save Workspace" 버튼을 클릭하여 로컬 블록체인을 시작합니다.

3.6 스마트 컨트랙트 배포하기 🚢

이제 Ganache 로컬 네트워크에 스마트 컨트랙트를 배포해 보겠습니다.

 

먼저 truffle-config.js 파일을 수정하여 Ganache 네트워크 정보를 추가합니다:

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    }
  },
  compilers: {
    solc: {
      version: "0.8.0"
    }
  }
};

그리고 터미널에서 다음 명령어를 실행하여 컨트랙트를 배포합니다:

truffle migrate

배포가 성공적으로 완료되면 터미널에 트랜잭션 해시, 컨트랙트 주소 등의 정보가 표시됩니다.

스마트 컨트랙트 개발 및 배포 과정 Solidity 코드 작성 컴파일 마이그레이션 스크립트 배포 Ganache (로컬 이더리움 네트워크)

축하합니다! 🎉 이제 첫 번째 스마트 컨트랙트를 성공적으로 개발하고 로컬 네트워크에 배포했습니다. 이 과정에서 Solidity 언어의 기본 문법, 컴파일 과정, 그리고 배포 방법에 대해 학습했습니다. 다음 섹션에서는 이 스마트 컨트랙트와 상호작용할 수 있는 프론트엔드를 개발하는 방법에 대해 알아보겠습니다. 🚀

4. 프론트엔드 개발하기 🖥️

스마트 컨트랙트를 배포했으니, 이제 사용자가 이 컨트랙트와 상호작용할 수 있는 웹 인터페이스를 만들어 보겠습니다. 이 과정에서 우리는 React.js를 사용하여 프론트엔드를 구축하고, Web3.js를 통해 블록체인과 통신할 것입니다.

4.1 React 프로젝트 설정 ⚛️

먼저 새로운 React 프로젝트를 생성합니다. 터미널에서 다음 명령어를 실행합니다:

npx create-react-app voting-dapp-frontend
cd voting-dapp-frontend

그리고 필요한 dependencies를 설치합니다:

npm install web3 @truffle/contract

4.2 Web3 설정 🌐

Web3.js를 사용하여 이더리움 네트워크와 연결하고 스마트 컨트랙트와 상호작용할 수 있습니다. src 디렉토리에 web3.js 파일을 생성하고 다음 코드를 작성합니다:

import Web3 from 'web3';

let web3;

if (typeof window !== 'undefined' && typeof window.ethereum !== 'undefined') {
  // We are in the browser and metamask is running
  window.ethereum.request({ method: 'eth_requestAccounts' });
  web3 = new Web3(window.ethereum);
} else {
  // We are on the server *OR* the user is not running metamask
  const provider = new Web3.providers.HttpProvider(
    'http://localhost:7545'
  );
  web3 = new Web3(provider);
}

export default web3;

4.3 컨트랙트 ABI 가져오기 📄

스마트 컨트랙트와 상호작용하기 위해서는 컨트랙트의 ABI(Application Binary Interface)가 필요합니다. 이전에 컴파일한 Voting.json 파일에서 ABI를 가져와 사용합니다.

src 디렉토리에 Voting.json 파일을 복사하고, contract.js 파일을 생성하여 다음 코드를 작성합니다:

import web3 from './web3';
import VotingArtifact from './Voting.json';

const address = '여기에_배포된_컨트랙트_주소를_입력하세요';
const abi = VotingArtifact.abi;

const instance = new web3.eth.Contract(abi, address);

export default instance;

4.4 React 컴포넌트 작성하기 🧩

이제 실제로 사용자가 상호작용할 수 있는 React 컴포넌트를 만들어 보겠습니다. src/App.js 파일을 다음과 같이 수정합니다:

import React, { useState, useEffect } from 'react';
import './App.css';
import web3 from './web3';
import votingContract from './contract';

function App() {
  const [candidates, setCandidates] = useState([]);
  const [votes, setVotes] = useState({});
  const [account, setAccount] = useState('');

  useEffect(() => {
    const init = async () => {
      const accounts = await web3.eth.getAccounts();
      setAccount(accounts[0]);

      const candidateCount = await votingContract.methods.getCandidateCount().call();
      const candidateList = [];
      for (let i = 0; i < candidateCount; i++) {
        const candidate = await votingContract.methods.candidates(i).call();
        candidateList.push(candidate);
      }
      setCandidates(candidateList);

      updateVotes(candidateList);
    };

    init();
  }, []);

  const updateVotes = async (candidateList) => {
    const voteCounts = {};
    for (let candidate of candidateList) {
      const voteCount = await votingContract.methods.getVotes(candidate).call();
      voteCounts[candidate] = voteCount;
    }
    setVotes(voteCounts);
  };

  const handleVote = async (candidate) => {
    await votingContract.methods.vote(candidate).send({ from: account });
    updateVotes(candidates);
  };

  return (
    <div classname="App">
      <h1>Voting DApp</h1>
      <p>Your account: {account}</p>
      <h2>Candidates</h2>
      <ul>
        {candidates.map((candidate, index) => (
          <li key="{index}">
            {candidate}: {votes[candidate]} votes
            <button onclick="{()"> handleVote(candidate)}>Vote</button>
          </li>
        ))}
      </ul>
    </div>
  );
}

export default App;

4.5 스타일링 추가하기 🎨

기본적인 스타일을 추가하여 UI를 개선해 보겠습니다. src/App.css 파일을 다음과 같이 수정합니다:

.App {
  text-align: center;
  font-family: Arial, sans-serif;
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}

h1 {
  color: #333;
}

ul {
  list-style-type: none;
  padding: 0;
}

li {
  background-color: #f0f0f0;
  margin: 10px 0;
  padding: 15px;
  border-radius: 5px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

button {
  background-color: #4CAF50;
  border: none;
  color: white;
  padding: 10px 20px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 16px;
  margin: 4px 2px;
  cursor: pointer;
  border-radius: 5px;
}

button:hover {
  background-color: #45a049;
}

4.6 DApp 실행하기 🏃‍♂️

모든 준비가 완료되었습니다! 이제 DApp을 실행해 봅시다. 터미널에서 다음 명령어를 실행합니다:

npm start

브라우저에서 http://localhost:3000에 접속하면 투표 DApp을 사용할 수 있습니다.

투표 DApp 구조 React Frontend Web3.js Smart Contract Ethereum Network

축하합니다! 🎉 이제 완전한 이더리움 DApp을 개발했습니다. 이 DApp은 스마트 컨트랙트의 기능을 활용하여 투표를 진행하고, 결과를 실시간으로 보여줍니다. 사용자는 MetaMask를 통해 자신의 이더리움 계정으로 투표에 참여할 수 있습니다.

이 과정에서 우리는 다음과 같은 중요한 개념들을 학습했습니다:

  • React를 사용한 프론트엔드 개발
  • Web3.js를 통한 이더리움 네트워크 연결
  • 스마트 컨트랙트와의 상호작용
  • MetaMask를 이용한 사용자 인증

이제 여러분은 기본적인 DApp 개발 능력을 갖추게 되었습니다. 이를 바탕으로 더 복잡하고 실용적인 DApp을 개발할 수 있을 것입니다. 블록체인 기술의 발전과 함께 DApp 개발자의 수요도 계속해서 증가하고 있으니, 이 분야에서의 지속적인 학습과 경험 축적을 추천드립니다. 화이팅! 💪😊

5. 테스트 및 배포 🧪🚀

DApp 개발의 마지막 단계는 철저한 테스트와 실제 이더리움 네트워크에 배포하는 것입니다. 이 과정을 통해 우리의 DApp이 안전하고 효율적으로 동작하는지 확인할 수 있습니다.

5.1 스마트 컨트랙트 테스트 작성하기 ✅

Truffle은 Mocha 테스트 프레임워크와 Chai 어설션 라이브러리를 사용하여 스마트 컨트랙트를 테스트할 수 있는 환경을 제공합니다. test 디렉토리에 voting_test.js 파일을 생성하고 다음과 같이 테스트 코드를 작성합니다:

const Voting = artifacts.require("Voting");

contract("Voting", (accounts) => {
  let voting;
  const candidates = ["Candidate 1", "Candidate 2", "Candidate 3"];

  before(async () => {
    voting = await Voting.new(candidates);
  });

  it("initializes with three candidates", async () => {
    const candidateCount = await voting.getCandidateCount();
    assert.equal(candidateCount, 3, "Incorrect number of candidates");
  });

  it("allows a voter to cast a vote", async () => {
    await voting.vote(candidates[1], { from: accounts[0] });
    const voteCount = await voting.getVotes(candidates[1]);
    assert.equal(voteCount, 1, "Error: Candidate 1 did not receive a vote");
  });

  it("throws an exception for invalid candidates", async () => {
    try {
      await voting.vote("Invalid Candidate", { from: accounts[0] });
      assert.fail("Expected an error to be thrown");
    } catch (error) {
      assert.include(error.message, "revert", "Expected 'revert' in error message");
    }
  });
});

이제 다음 명령어로 테스트를 실행할 수 있습니다:

truffle test

5.2 프론트엔드 테스트 작성하기 🖥️

React 컴포넌트에 대한 단위 테스트도 작성해야 합니다. create-react-app에 포함된 Jest를 사용하여 테스트를 작성할 수 있습니다. src 디렉토리에 App.test.js 파일을 다음과 같이 수정합니다:

import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import App from './App';

// Web3와 contract 모듈을 모킹합니다.
jest.mock('./web3', () => ({
  eth: {
    getAccounts: jest.fn().mockResolvedValue(['0x0000']),
  },
}));

jest.mock('./contract', () => ({
  methods: {
    getCandidateCount: jest.fn().mockReturnValue({ call: jest.fn().mockResolvedValue('3') }),
    candidates: jest.fn().mockReturnValue({ call: jest.fn().mockResolvedValue('Candidate 1') }),
    getVotes: jest.fn().mockReturnValue({ call: jest.fn().mockResolvedValue('5') }),
    vote: jest.fn().mockReturnValue({ send: jest.fn().mockResolvedValue() }),
  },
}));

test('renders voting app', async () => {
  render(<app></app>);
  const headerElement = await screen.findByText(/Voting DApp/i);
  expect(headerElement).toBeInTheDocument();
});

test('displays candidates and allows voting', async () => {
  render(<app></app>);
  const candidateElement = await screen.findByText(/Candidate 1: 5 votes/i);
  expect(candidateElement).toBeInTheDocument();

  const voteButton = screen.getByText('Vote');
  fireEvent.click(voteButton);

  // 여기서는 vote 함수가 호출되었는지만 확인합니다.
  // 실제 상태 변화는 컴포넌트 리렌더링 로직에 따라 다를 수 있습니다.
  expect(jest.mocked(votingContract.methods.vote().send)).toHaveBeenCalled();
});

다음 명령어로 프론트엔드 테스트를 실행할 수 있습니다:

npm test

5.3 테스트넷에 배포하기 🌐

실제 이더리움 메인넷에 배포하기 전에 테스트넷에 배포하여 실제와 유사한 환경에서 DApp을 테스트하는 것이 좋습니다. 여기서는 Goerli 테스트넷을 사용해 보겠습니다.

먼저 truffle-config.js 파일에 Goerli 네트워크 설정을 추가합니다:

const HDWalletProvider = require('@truffle/hdwallet-provider');
const mnemonic = 'YOUR MNEMONIC HERE'; // MetaMask의 시드 구문

module.exports = {
  networks: {
    development: {
      host: "127.0.0.1",
      port: 7545,
      network_id: "*"
    },
    goerli: {
      provider: () => new HDWalletProvider(mnemonic, `https://goerli.infura.io/v3/YOUR-PROJECT-ID`),
      network_id: 5,
      gas: 5500000,
      confirmations: 2,
      timeoutBlocks: 200,
      skipDryRun: true
    },
  },
  compilers: {
    solc: {
      version: "0.8.0"
    }
  }
};

그리고 다음 명령어로 Goerli 테스트넷에 배포합니다:

truffle migrate --network goerli

5.4 메인넷 배포 준비 🚀

테스트넷에서 충분히 테스트를 마쳤다면, 이제 메인넷 배포를 준비할 수 있습니다. 메인넷 배포는 실제 ETH를 사용하므로 신중하게 진행해야 합니다.

  1. 스마트 컨트랙트 코드를 최적화하여 가스 비용을 줄입니다.
  2. 보안 감사를 수행하여 취약점이 없는지 확인합니다.
  3. 충분한 ETH를 준비하여 배포 비용을 충당합니다.
  4. truffle-config.js에 메인넷 설정을 추가합니다.

메인넷 배포는 다음 명령어로 실행할 수 있습니다:

truffle migrate --network mainnet

5.5 지속적인 통합 및 배포 (CI/CD) 구축 🔄

프로젝트의 규모가 커지면 CI/CD 파이프라인을 구축하여 개발 프로세스를 자동화하는 것이 좋습니다. GitHub Actions를 사용하여 간단한 CI/CD 파이프라인을 구축해 보겠습니다.

.github/workflows 디렉토리에 ci-cd.yml 파일을 생성하고 다음 내용을 추가합니다:

name: CI/CD

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Use Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '14.x'
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
    - uses: actions/checkout@v2
    - name: Deploy to Goerli
      env:
        MNEMONIC: ${{ secrets.MNEMONIC }}
        INFURA_PROJECT_ID: ${{ secrets.INFURA_PROJECT_ID }}
      run: |
        npm install -g truffle
        truffle migrate --network goerli

이 워크플로우는 모든 테스트를 실행하고, 메인 브랜치에 푸시될 때마다 Goerli 테스트넷에 자동으로 배포합니다.

DApp 테스트 및 배포 프로세스 로컬 테스트 테스트넷 배포 보안 감사 메인넷 배포 지속적 통합 및 배포 (CI/CD)

이것으로 이더리움 DApp 개발의 전체 과정을 마무리했습니다. 우리는 스마트 컨트랙트 작성부터 프론트엔드 개발, 테스트, 그리고 배포까지 모든 단계를 살펴보았습니다. 이 과정에서 배운 기술과 개념들은 더 복잡하고 실용적인 DApp을 개발하는 데 큰 도움이 될 것입니다.

블록체인 기술과 DApp 생태계는 계속해서 발전하고 있으므로, 지속적인 학습과 실험이 중요합니다. 새로운 도구와 프레임워크, 보안 best practices 등을 항상 주시하며 개발 능력을 향상시켜 나가시기 바랍니다.

마지막으로, 개발한 DApp의 사용성과 접근성을 높이는 것도 잊지 마세요. 사용자 경험(UX)을 개선하고, 가스 비용을 최적화하며, 직관적인 UI를 제공하는 것이 성공적인 DApp의 핵심입니다. 여러분의 창의적인 아이디어로 블록체인의 미래를 만들어 나가시기 바랍니다. 화이팅! 🚀🌟

관련 키워드

  • 이더리움
  • DApp
  • 스마트 컨트랙트
  • Solidity
  • Web3.js
  • React
  • Truffle
  • Ganache
  • MetaMask
  • 블록체인

지식의 가치와 지적 재산권 보호

자유 결제 서비스

'지식인의 숲'은 "이용자 자유 결제 서비스"를 통해 지식의 가치를 공유합니다. 콘텐츠를 경험하신 후, 아래 안내에 따라 자유롭게 결제해 주세요.

자유 결제 : 국민은행 420401-04-167940 (주)재능넷
결제금액: 귀하가 받은 가치만큼 자유롭게 결정해 주세요
결제기간: 기한 없이 언제든 편한 시기에 결제 가능합니다

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

30년간 직장 생활을 하고 정년 퇴직을 하였습니다.퇴직 후 재능넷 수행 내용은 쇼핑몰/학원/판매점 등 관리 프로그램 및 데이터 ...

AS규정기본적으로 A/S 는 평생 가능합니다. *. 구매자의 요청으로 수정 및 보완이 필요한 경우 일정 금액의 수고비를 상호 협의하에 요청 할수 있...

* 프로그램에 대한 분석과 설계 구현.(OA,FA 등)* 업무 프로세스에 의한 구현.(C/C++, C#​) * 기존의 C/C++, C#, MFC, VB로 이루어진 프로그...

📚 생성된 총 지식 9,244 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창