본 로드맵은 디앱(Dapp)개발을 공부하기 위해 개인적으로 이것저것 찾아보며 정리한 내용을 토대로 만든 로드맵입니다. 개발 공부를 하는 방법이 여러 가지가 있겠지만 저는 무엇을 공부하기 전에 내가 공부하려는 분야 및 기술의 이해와 전체적으로 필요한 요소들을 정리해서 나열한 후 로드맵 형식으로 작성하는 것을 선호합니다.
로드맵을 만들면 좋은 점은 만약 내가 Dapp을 개발하기 위해 필요한 요소들이 무엇이고 어떤 것부터 준비해서 학습을 해야 할지 한눈에 볼 수 있어서 공부해야 할 요소들의 우선순위가 명확해지고 계획 달성 가능성이 더욱 높아지는 것 같습니다. 그래서 이번에도 Dapp 개발 전 당연히 관련 기술을 공부해야 하기 때문에 이렇게 필요한 기술 스택을 정리해서 로드맵으로 만들어봤습니다.
이걸 보면서 한 가지 참고해야 할 사항은, 저는 이분야(Dapp) 전문가도, 개발자도 아니며 이번에 처음 접해보는 기술이기 때문에 제가 작성한 로드맵이 정답은 아니라는 점입니다. 최대한 여러 매체를 통해 검증된 개발도구와 라이브러리 위주로 정리를 하려고 노력했다는 점만 알아주셨으면 좋겠습니다^^
디앱(Dapp, Decentralized Application) 이란?
이미지 출처 : https://coincode.kr/archives/9710
디앱은 Decentralized Application의 약자로 탈중앙화 분산 어플리케이션을 뜻합니다.
탈중앙화 분산 어플리케이션이라는 말은 최근 엄청 핫한 비트코인과 이더리움과 같은 암호화폐의 기반이 되는 기술인 블록체인 기술 위에서 돌아가는 어플리케이션이라는 뜻입니다.
하지만 비트코인은 비트코인 거래에서 발생하는 거래 및 장부 이외, 다른 일은 취급하지 못했습니다. 하지만 이더리움이라는 놈이 등장하고 새로운 개념의 블록체인 확장 기술 중 핵심이 되는 '스마트 컨트랙트'라는 기술을 세상에 선보이면서 암호화폐 거래에 국한되었던 기술을 다양한 산업에 적용할 수 있게 되었고 다양한 실험적인 시도와 도전이 이어지면서 컴퓨터, 인터넷, 모바일 시대의 뒤를 이을 새로운 혁신의 생태계를 만들어가고 있습니다. 저 또한 이러한 미래의 가능성을 보고 관련 시장과 기술을 공부하고 디앱을 직접 개발해보고 싶은 마음에 디앱 개발 도전기를 시작하려고 하는 것입니다.
참고로 블록체인과 이더리움 그리고 스마트 컨트랙트 관련 기술 설명은 너무 길어지기 때문에 생략하려고 합니다. 혹시 관련 기술의 배경지식이 궁금하신 분은 제가 얼마 전에 작성한 블록체인 관련 글을 참고해 보시길 바랍니다. 브런치 링크 - "[나도 처음이야-NFT편] ③ NFT의 토양 블록체인"
자 그러면 앞으로 도전할 디앱(Dapp) 개발 로드맵을 한번 살펴보도록 하겠습니다~!
나의 디앱(Dapp) 개발 로드맵
1. 사전 지식 습득
디앱(Dapp) 개발을 위해 관련 언어를 학습하고 개발환경을 구축하기 이전에, 개발하려는 기술(디앱)에 대한 기술적 이해가 제일 먼저 선행되어야 한다고 생각한다.
무작정 개발 언어의 문법과 개발 방법론을 주먹구구식으로 외우고 타이핑 치면서 공부하는 것도 한 가지 방법이긴 하지만 내가 생각했을 땐, 전혀 효과적이지 못한 방법일 것 같다. 왜냐하면 디앱은 블록체인이라는 새로운 개념의 네트워크(혹은 인터넷) 위에서 동작하는 어플리케이션이다.
기존 우리에게 익숙했던 중앙 집중화된 어플리케이션과는 전혀 반대의 개념이기 때문에 디앱을 개발하는 과정에서 많은 혼란을 야기시킬 수 있을 것이다.
만약 디앱에서 절대 빼놓을 수 없는 스마트 컨트랙트, 메인넷, 가스, 트렌젝션, 해시, 지갑 등을 처리하는 코드를 공부한다고 했을 때 이게 왜 필요한지? 그리고 어느 부분에서 필요한지 전혀 감을 못 잡은 상태에서 프로그래밍을 하게 될 것이다. 결국 시간이 해결해 주겠지만, 디앱과 관련 기술에 대한 이해도가 있는 상태에서 프로그래밍을 시작한다면 그냥 암기식으로 힘들게 할 필요 없이 이해하면서 빠르게 진도를 나아갈 수 있을 것이다. 그리고 탈중앙화 분산 어플리케이션의 경우, 자체적으로 구축된 블록체인 네트워크 안의 모든 사용자에게 데이터가 분산되어 동일하게 저장되는 특성이 있기 때문에 데이터 저장하는 방식부터 배포하는 모든 과정이 기존 우리가 개발해 왔던 어플리케이션 개발과 전혀 다른 방식으로 개발되어야 한다.
그래서 사전 지식 습득을 선행하지 않은 채로 무작정 개발 공부를 하게 될 때, 어쩌면 기존 방식으로 개발해오던 개발자들이 처음 개발을 접한 분들보다 더 큰 혼란과 더불어 디앱 개발을 이해하는데 더 많은 시간이 걸릴 수도 있겠다는 생각을 했다. 물론 개발의 기초문법은 모든 프로그래밍마다 공통점이 많이 존재하기 때문에 문법을 이해하는 것은 아마 빠를 것이다. (변수, 클래스, 함수, 반복문, 자료형 등등)
하지만 이러한 문법은 하다 보면 이해되고 사용할 수 있게 된다. 하지만 디앱이 동작되는 매커니즘 자체의 이해도가 없다면 좋은 앱을 만들기 어려울 것이고 개발 스킬을 함양하는 데 걸리는 시간도 길어질 것이다.
그러므로 나는 디앱(Dapp) 개발 공부 전에, [아래] 3가지에 관한 배경지식을 충분히 숙지한 뒤 개발에 도전하라고 추천해주고 싶다.
① 블록체인
② 이더리움 그리고 이더리움 EVM
③ 스마트 컨트랙트
2. 개발 도구
디앱 개발에 필요한 배경지식을 충분히 숙지했다면, 이제 개발을 하기 위해 필요한 요소들을 준비해야 한다.
집을 짓기 위해서는 먼저 집을 짓기 위해 필요한 재료, 도구 등을 준비해야 한다. 어플리케이션 개발이 집을 짓는 것으로 비유한다면 어플리케이션 개발을 위해 필요한 도구를 준비하는 것이 당연하다.
2-1. 개발 언어 선택 (솔리디티)
(이미지 출처) : https://velog.io/@truthgarnet/Solidity
■ 선택 언어 : 솔리디티(Solidity)
시장에 배포되는 거의 대부분의 디앱(Dapp)은 이더리움 블록체인 플랫폼에서 파생된 어플리케이션들이고 현재 이 시장에서 대적할자가 없을 만큼 이더리움이 지배적이다. 그러므로 이더리움에서 디앱 개발을 위해 만든 언어인 '솔리디티(Solidity)'를 선택한 것은 당연한 일이었다. 물론 솔리디티 뿐만 아니라 다른 언어로 개발은 가능하지만 디앱의 근본 언어인 솔리디티를 배우는 것이 좋아 보였다.
■ 솔리디티(Solidity) 특징 - ※ 해시넷과 위키백과 사이트 내용 참고함.
솔리디티(Solidity)는 이더리움 등 블록체인 플랫폼에서 스마트 계약 작성과 구현에 사용되는 계약 지향 프로그래밍 언어이다.
솔리디티는 스마트 계약을 작성하기 위한 언어로서 C++, 파이썬, 자바스크립트의 영향을 받은 고수준 언어이다.
솔리디티는 정적타입(statically-typed)의 프로그래밍 언어로 EVM상에서 작동하는 스마트계약을 개발하기 위해 설계되었다.
■ 그 밖에 디앱 개발에 알아두면 좋은 언어들 (일단 솔리디티만 해도 뭐..괜찮..)
파이썬(Python)
자바스크립트(JavaScript)
고랭(Golang)
2-2. 개발자 도구 선택 (트러플)
(이미지 출처) : https://www.blockchainexpert.uk/blog/features-of-truffle ■ 선택 도구 : 트러플(Truffle Framework) 프레임워크
어플리케이션 개발 과정은 생각보다 단순하지 않다. 특정 언어를 습득하고 습득한 언어를 기반으로 여러가지 필요한 기능을 코딩하는 것뿐만 아니라 컴파일, 배포, 관리, 테스트까지 수 없이 많은 작업이 필요하다. 이걸 일일이 개발자가 다 만든다면 많은 시간과 에너지가 소모된다.
트러플은 스마트 컨트랙트 개발, 컴파일, 배포, 테스팅 등 복잡한 과정을 쉽게 할 수 있도록 도와주는 프레임워크로, 적절한 비유일지 모르겠으나 집을 지을 때 삽으로 땅을 파는 것보다 포크레인으로 파는 게 훨씬 효율 적이듯이, 개발자가 어플리케이션 개발을 할 때 쉽고 빠르게 개발할 수 있도록 도와주는 개발자 도구라고 생각하면 된다.
■ 트러플(Truffle Framework) 특징 - ※ 해시넷 사이트 내용 참고함.
디앱(DApp) 추적 및 데이터 : 여러 프로젝트의 테스트 상태를 한눈에 볼 수 있다. 배지는 리포지토리 방문자에게 디앱의 계약이 소집자임을 보증한다.
제로 구성 연속 통합 : 구성이 필요하지 않은 경우 모든 커밋에서 테스트하여 솔리디티(Solidity) 코드를 최대한 신뢰할 수 있다. 트러플 팀은 지속적인 스마트 계약 테스트를 위한 통합환경을 제공함으로써 환경 불일치를 제거한다.
자동화된 배포 : Worflow에 Truffle Teams를 추가하는 것은 깃허브(GitHub)를 사용하는 것만큼 쉽다. 개발자 시간과 시스템 리소스를 확보하면서 테스트를 자동으로 실행한다.
스마트 계약 관리 : 배포된 스마트 계약의 트랜잭션, 상태 및 이벤트를 모니터링하고, 워크 플로우에서 빌드 히스토리 및 현재 상태를 본다.
2-3. 통합 개발 환경(IDE) 툴 선택 (비주얼 스튜디오)
(이미지 출처) : https://nage.wo.tc/33
■ 선택 개발 툴 : 비주얼 스튜디오(Visual Studio) 툴
여러분이 만약 대학교 과제나 회사 업무로 문서작업을 해야 한다고 가정해보자.
분명 한글, 워드, 파워포인트 등의 문서작성 프로그램을 써야 할 것이다. 아무래도 메모장에 작성하는 것보다는 문서 관리나 작성이 매우 편리하기 때문이다.
이와 마찬가지로 프로그래밍을 한다는 것은 특정 언어의 코드를 서술하는 문서를 작성하는 일이다. 하지만 프로그래밍은 조금 더 복잡성이 존재는데 코딩, 디버그, 컴파일, 배포, 텍스트 편집 등의 모든 작업을 하나의 프로그램 안에서 처리하는 것들을 하나로 묶어 대화형 인터페이스로 제공하는 프로그램 및 환경을 통합 개발 환경(Integrated Development Environment, IDE)이라고 부르고 솔리디티 프로그래밍이 가능하면서도 개발자들 사이 전 세계적으로 유명하고 자주 쓰이는 개발 툴 중 하나인 마이크로소프트사가 개발한 '비주얼 스튜디오'라는 개발 툴로 선택하였다.
■ 비주얼 스튜디오(Visual Studio) 특징
개발자들 사이에서는 모르는 사람이 없는 만큼 워낙 유명한 툴이라 따로 특징을 나열하지는 않겠지만 혹시 모르는 분들이나 궁금하신 분들은 인터넷에서 그냥 "비주얼 스튜디오"라고만 쳐도 어마어마한 정보를 얻을 수 있을 것이므로 특징에 대한 언급을 따로 하지 않겠다.
2-4. 클라이언트(지갑) 앱 선택 (메타마스크)
■ 선택 클라이언트 앱(지갑) : 메타마스크(메타마스크)
우리는 현재 사용하고 있는 컴퓨터, 스마트폰 어플리케이션을 통해 정보를 공유하고 특정 서비스를 이용한다. 이는 전 세계가 인터넷으로 연결되어 있기 때문이다. 블록체인의 경우 우리가 일반적으로 알고 있는 인터넷 네트워크와 전혀 다른 환경의 분산 네트워크 환경으로 인터넷과는 별개로 구성된 새로운 네트워크라고 생각하면 된다.
하지만 우리는 스마트폰이나 컴퓨터 인터넷과 특정 어플리케이션을 통해 블록체인 위에 존재하는 암호화폐(비트코인 등)를 사고파는 것이 가능한 것을 주위에서 종종 볼 수 있었다. 우리가 일반적으로 사용하는 인터넷 네트워크에서 독립적으로 운영되는 블록체인 네트워크의 정보를 접근할 수 있어야 암호화폐를 사고파는 행위가 가능한데, 인터넷 네트워크와 블록체인 네트워크 사이 연결시켜 주는 다리 역할을 하는 것이 바로 블록체인 지갑(Wallet)이다.
메타마스크(Metamask) 지갑은 이더리움을 보유하고 송금 및 관리할 수 있는 다양한 암호화폐 지갑 중 하나로, 구글 크롬 웹브라우저에서 플러그인 방식으로 사용하는 크롬 확장 프로그램이다.
메타마스크는 이더리움 블록체인과의 상호작용을 하는 다리 역할뿐만 아니라 본래 블록체인 지갑의 본질적인 역할인 공개키(publick key)와 개인키(private key) 저장하고 관리하는 역할을 한다.
공개키와 개인키는 암호화폐를 주고받을 때 필요한 어드레스로 은행으로 따지면 계좌번호 같은 역할을 한다고 생각하면 된다.
다양한 암호화폐 지갑중 메타마스크를 선택한 이유는 단순하다.
사람들이 많이 쓰는 것 같고 직관적인 UI에 사용하기 쉽다고 한다.
2-5. 테스트 네트워크 환경 선택 (가나슈)
(이미지 출처) : https://medium.com/@kacharlabhargav21/using-ganache-with-remix-and-metamask-446fe5748ccf
■ 선택 테스트 네트워크 환경 구축 : 가나슈(Ganache)
가나슈는 이더리움 블록체인 기반의 디앱(Dapp)을 개발할 때 사용하는 개인용 블록체인 네트워크를 뜻한다.
개인용 블록체인이기 때문에 메인 블록체인 네트워크와 연결할 필요 없이 로컬에서 작동시킬 수 있어, 개발 중인 스마트 컨트랙트 및 디앱을 손쉽게 배포 및 테스트해볼 수 있다.
만약 이더리움 블록체인 메인 네트워크에서 거래가 발생하게 되면 거래 정보는 블록체인 네트워크상에 저장되면서 블록체인 특성상 모든 네트워크 참여자에게 공유되고, 한번 블록에 저장되어 체인이 형성된 거래내역 및 데이터는 수정/삭제가 불가능한 구조를 가지고 있다.
이러한 특성이 있는 이유로 디앱을 개발할 때는 메인 네트워크와 동일한 환경의 개인 블록체인 네트워크에서 스마트 컨트랙트 및 디앱 테스트가 진행되어야 한다. 이렇게 디앱 개발용으로 사용할 개인용 블록체인 네트워크 환경을 만들어주는 게 바로 '가나슈(Ganache)'이다.
3. 그 밖에 디앱 개발에 필요한 API 및 라이브러리(추후에)
여러 개발 도구를 설치하고 개발환경을 구축해서 만약 간단한 디앱 개발을 완료했다고 가정해보자.
위에 언급했듯이 가나슈(Ganache)를 통해 개발 및 테스트용 간이 블록체인 네트워크를 통해 디앱 개발을 했다면 이제 남은건 개발 완료한 배포하는 일이 남았다. 디앱을 배포할 때는 블록체인 메인 네트워크에 배포가 된다는 의미이고 블록체인 메인 네트워크와의 상호작용이 가능한 무엇이 필요하다는 의미다.
3-1. 백엔드 API (인푸라)
■ 선택 : 인푸라(Infura)
인푸라(Infura) 는 전 세계로 퍼져 있는 이더리움 블록체인 네트워크에 접속하기 위한 게이트웨이(진입문)이라고 생각하면 된다. 아직은 개발을 시작하지 않아서 잘 모르겠으나, 분산형 데이터베이스 시스템 환경인 블록체인의 메인 네트워크에 서비스(디앱)을 배포하고 관리하는 과정이 쉽지 않을 거라고 생각한다.
이처럼 인푸라는 개발자가 디앱 개발 이후 이더리움 블록체인 메인 네트워크에 접속을 쉽고 간편하게 도와주는 역할 및 디앱 개발자 입장에서 복잡한 디앱 인프라(infra) 및 환경을 유지하지 않고도 자신의 애플리케이션을 이더리움에 배포할 수 있도록 도와주어 디앱 서비스 개발에 집중할 수 있도록 서비스를 제공한다고 한다.
3-2. 프론트엔드 자바스크립트 API (web3.js)
■ 선택 : web3.js
결국 대부분의 모든 서비스는 서비스와 사용자가 만나는 접점이 존재해야 하고, 이런 접점은 클라이언트에서 이뤄진다. 이 말은 아무리 블록체인 기반의 서비스의 효용성이 좋아도 디지털화된 서비스를 이용하는 일반 유저와의 접점이 필요하다는 말이고 모든 서비스의 접점은 컴퓨터의 인터넷 브라우저 화면 및 스마트폰 화면에서 이뤄진다.
생각해보라, 당신이 블록체인 서비스를 이용하는데 코드와 알 수 없는 문자형 식이 난무하는 서비스를 이용하고 싶겠는가.. 이더리움 블록체인 노드들은 JSON-RPC 라는 특정 규칙과 규약의 프로토콜을 통해 소통한다.
그리고 이런 형태의 정보를 일반 사람이 읽기 매우 불편한 구조로 되어있다.
이처럼 web3.js는 블록체인 내부(백엔드영역)의 복잡하고 골치아픈 JSON-RPC와 같은 백엔드 영역의 데이터 및 정보를 대신 상호작용하여 편리하게 읽을 수 있는 자바스크립트 인터페이스를 통해 손쉽게 상호작용 할 수 있게 해주는 API 이다.
개발 분야에서 우리가 스마트폰 앱과 컴퓨터 인터넷을 켜면 나타나는 화면을 개발하는 영역을 프론트엔드(front-end)라고 부른다.
자바스크립트라는 언어는 우리가 지금 이용하는 인터넷의 화면을 제어하고 처리하는 언어로 개발 분야에서는 엄청 유명하고 강력한 언어이다. 고로, 모든 개발자들에게 익숙한 언어이기도 하다.
그렇기 때문에 web3.js를 통해 일반 사용자들과의 접점이 되는 프론트엔드(화면) 개발을 원활하게 할 수 있도록 도와준다.
※ 사실 챕터 3 "그 밖에 디앱 개발에 필요한 API 및 라이브러리(추후에)" 파트에서 설명한 백엔드와 프론트 엔드 API는 지금 당장 필요한 부분이 아닌 것 같아서 많이 알아보지 않았을뿐더러, 몇 번 찾아보고 읽어봐도 이해가 잘 안 되는 부분이라 빼버릴까도 생각헀지만 어차피 추후에 이 기술을 적용해야 할 때가 올 것이라 생각 되어, 그냥 인터넷에서 찾아본 내용을 내가 이해한 범위 안에서 설명했다. 이 부분은 앞으로 천천히 디앱 개발을 시작하면서 이해될 것으로 생각하고 그냥 넘어가겠다.
4. 솔리디티(Solidity) 개발 공부 시작!!
디앱에 필요한 개발 도구 및 환경을 설치 및 구축한 후에 본격적으로 디앱 개발 언어인 솔리디티(Solidity) 개발 공부를 시작할 예정이다.아마 모든 프로그래밍 언어가 그렇듯, 각 언어가 지향하는 철학과 방법론이 달라서 조금 문법이 달라질 수는 있지만 기본적인 골격(자료형, 함수, 클래스, 반복문, 조건문, 변수 등등..) 은 비슷할 것으로 예상된다.그렇기 때문에 내일(2022년 02월 22일)부터 조금씩 개발 공부를 시작해서 늦어도 3월 말까지는 솔리디티 기본 문법 및 개념을 마스터할 예정이다.
솔리디티 기초 문법을 공부할 책은 이미 선정해서 주문해 놓은 상태이고 그 책을 보면서 기초는 마스터할 예정이다. 그리고 3월 이후에는 본격적으로 디앱을 기획하고 개발하는 사이트 프로젝트를 진행해볼까 한다.
디앱 개발을 위해 솔리디티 개발환경 구축부터~ 기초 문법을 공부한 내용까지 공부하고 실습한 내용을 정리해서 브런치에 꾸준히 올릴 예정이다.
디앱에 필요한 개발 도구 및 환경을 설치 및 구축한 후에 본격적으로 디앱 개발 언어인 솔리디티(Solidity) 개발 공부를 시작할 예정이다.
아마 모든 프로그래밍 언어가 그렇듯, 각 언어가 지향하는 철학과 방법론이 달라서 조금 문법이 달라질 수는 있지만 기본적인 골격(자료형, 함수, 클래스, 반복문, 조건문, 변수 등등..) 은 비슷할 것으로 예상된다.
그렇기 때문에 내일(2022년 02월 22일)부터 조금씩 개발 공부를 시작해서 늦어도 3월 말까지는 솔리디티 기본 문법 및 개념을 마스터할 예정이다.
솔리디티 기초 문법을 공부할 책은 이미 선정해서 주문해 놓은 상태이고 그 책을 보면서 기초는 마스터할 예정이다. 그리고 3월 이후에는 본격적으로 디앱을 기획하고 개발하는 사이트 프로젝트를 진행해볼까 한다.
디앱 개발을 위해 솔리디티 개발환경 구축부터~ 기초 문법을 공부한 내용까지 공부하고 실습한 내용을 정리해서 브런치에 꾸준히 올릴 예정이다.
5. 마무리
제가 아직 디앱 개발을 위한 도구 설치, 개발환경 구축, 솔리디티 언어 공부를 시작한 게 아니고 단순 책과 인터넷을 통해 학습한 내용을 토대로 로드맵을 작성하고 이 글을 통해 설명하게 되었는데 아마 직접 개발해보아야 제가 작성한 로드맵의 오류와 잘못된 점을 파악할 수 있을 것 같습니다.
혹시 이 글에서 잘못된 부분이 있으면 댓글로 알려주시면 감사드리겠습니다 ㅠㅠ
바로 수정하도록 하겠습니다.