Minwook’s portfolio

Incentive Community Project 회고 본문

Codestates 블록체인 부트캠프 6기

Incentive Community Project 회고

yiminwook 2022. 11. 9. 15:59

 

Incentive Community Project 회고

https://github.com/codestates-beb/BEB-06-SECOND-04

 

 저의 두 번째 프로젝트는 ERC20과 ERC721 컨트랙트를 같이 활용하여 유저들이 커뮤니티에 기여할 때 보상을 주는 것으로 더욱 적극적인 활동을 유도할 수 있는 웹서비스를 개발하는 것이 목표입니다.

 

 두번째 프로젝트는 팀원으로써 참가하였고, 제가 이번에 맡은 부분은 백엔드(server, smartcontract)였습니다. 이번 프로젝트에서는 서버에 많은 역할이 부여될 것이기 때문에 백엔드의 역할이 중요하였습니다. DB를 제대로 사용해보는 것도 처음이기 때문에 우선 Sequelize에 익숙해져서 여러 테이블로부터 원하는 데이터를 뽑아올 수 있도록 특히 노력하였습니다. 또한  첫 번째 프로젝트 때  git으로 협업하면서 특히 소통이 매우 중요하다는 것을 느꼈기 때문에 작업 들어가기 전에 정확히 오늘은 어느 부분을 개발할 건지, 작업 후에는 어떻게 개발했고, 에러가 나는 부분이나, 구현하지 못한 부분을 디스코드 방에서 많이 보고하여 공유했습니다.

 

 

 

Architecture

 

 이번 아키텍쳐는 프로젝트 1과는 달리 완성도를 높이기 위하여 팀원 모두가 익숙한 라이브러리가 아닌 다양한 라이브러리에 도전하여 완성도를 높이려고 하였습니다. 1과 가장 큰 차이점은 테스트 넷을 사용하지 않고 가나슈를 활용한 프라이빗 네트워크에서 작동하는 인센티브 기반 커뮤니티를 개발하는 것입니다. 따라서 클라이언트에서 지갑으로 트랜젝션을 보내는 것이 아닌 서버에서 트랜젝션을 보내고, IPFS 또한 서버에서 업로드할 수 있도록 개발하였습니다. 

 

 

WireFrame

more Information

https://github.com/codestates-beb/BEB-06-SECOND-04/blob/main/.github/wireFrame/wireFrame.md

 

 wireframe은 현재 서비스중인 SNS 애플리케이션들을 참고하면서 만들었습니다. 가볍게 오늘 있었던 일과 같은 일상 게시글을 올리고 다른 유저들은 댓글을 달거나, 좋아요를 눌러줄 수 있습니다. Mypage에서는 보유 중인 이더와 토큰 NFT현황들을 한 번에 볼 수 있습니다.

 

 

 

DB Schema

 

 스키마는 userts table id로 대부분 접근할 수 있도록 구성하였습니다. 본래 이미지도 테이블로 만들어서 DB에 저장하려고 하였지만 민팅을 하기위해 IPFS를 구성한 것 을 활용하여 이미지는 IPFS네트워크에 올리고 CID값을 받아 URL형태로 저장하였습니다. 그러나 이 방식은 매우 느리기 때문에 만약 실제 서비스를 한다면 민팅을 제외한 프로필 사진이나 게시글 이미지들은 따로 테이블을 만들어서 DB에 직접 저장하는 방식으로 수정해야 할 필요성을 느꼈습니다. 

 

 

API

more Information

https://github.com/codestates-beb/BEB-06-SECOND-04/wiki

 

 프로젝트1때는 opensea testnet API에 많이 의존했었습니다. 그렇기에 이번 프로젝트 때 개인적으로 가장 공을 들 인부분은  API입니다. Client와 DB, 블록체인 네트워크 사이를 어떻게 연결하여 Restful 한 요청과 응답을 보낼지 생각하면서 URL 정하고, 데이터는 body, params, query 중 어떻게 받을지 많은 고민을 했습니다. 처음에는 HTTP 프로토콜 메서드를 사용하여 GET/POST/PUT/DELETE와 같은 다양한 메서드를 사용하려고 하였지만 GET/POST 외의 메서드를 지원하지 않는 브라우저가 있는 것을 고려하여 GET/POST 두 가지 메서드로 한정하고 뒤에  list/write/edit/delete와 같은 PATH로 명시하였습니다.

 

 

느낀 점

 프로젝트2는 1보다 프로젝트 자체의 퀄리티를 높이고자 했습니다. 처음에는 프론트엔드를 희망하였지만, 프로트엔드를 희망하는 팀원이 있었기 때문에 양보하고 백앤드(서버, 스마트 컨트랙트) 역할을 맡게 되었습니다. 이번 프로젝트에서 제 자신이 가장 성장을 이룬 부분은 3가지입니다. 

 

1. Express
2. Sequlize
3. Web3

 

1. Express

 이번 프로젝트는 API가 이전보다 몇배나 늘게 되면서 라우팅만으로는 서버 코드 정리가 어려워지고 중복되거나 길어지는 상황이 많이 발생되었습니다. 따라서 라우팅 외에도 컨트롤러로 파일을 한번 더 나눌 필요가 생겼고 중복되는 코드는 미들웨어를 사용하였고, 기능적인 코드는 service라는 파일을 만들어서 따로 익명 함수로 import 하는 방식으로 변경하였습니다. 총 3번에 큰 공사가 있었고 코드를 나누거나 그로부터 발생한 에러를 해결하는 과정에서 Express 서버 구조에 대한 이해가 높아졌습니다. 

 

2. Sequlize

 저는 Mysql은 사용해 보았지만 sequlize를 사용하여 DB를 다루어본적이 없었습니다 저도 서버를 담당하는 팀원으로서 sequlize 다뤄내야한다고 생각했기 때문에 틈틈히공식문서를 찾아보고 DB를 담당하시는 팀원분의 코드를 분석하였습니다. 게시글, 댓글의 조회, 작성, 수정, 삭제와 같은 주요 기능을 이용자가 자연스럽게 경험할 수 있도록 sequlize를 사용하여 여러 테이블에서 필요한 데이터를 뽑아와 정렬하여 API를 개발하는 과정에서 다양한 함수를 사용해보고 DB flow를 잘 이해할 수 있었습니다.

 

3. Web3

 web3는 이전에는 모호하게 알고 있던 부분이 좀 더 명확하게 알게 되었습니다. contract Method를 불러오는 과정 중 gas 에러가 발생하여 해결하면서 gas Limit을 설정해줄 수 있는 것을 알게 되었고, 계정을 생성하여 unlockAccount를 해보기도 하였고 web3 역시 중복되는 코드를 익명 함수로 선언하여 코드 양을 확 줄여내었습니다. 프로젝트 1 때에는 DB가 없어서 시도하지 못한 web3와 DB를 함께 다루어내는 API를 구현해내었습니다. 

 

개선할 점

지난 9일간 정신없이 공부하고 개발을 하여 기능적으로 구현을 하였지만 자세히 들여다 본다면 아직 부족하다가 여겨지는 부분이 많습니다.

 

1. 여러 테이블로부터 include하여 데이터를 가져오면서 반환 값의 깊이가 매우 깊어진 것

2. sequlize fn기능(COUNT, SUM..)을 많이 사용해보지 못한 것

3. 테스트넷을 사용하여 web3를 다루는 게  더 경험해볼게 많지 않았을까 하는 아쉬움

4. 기존의 ERC20, ERC721을 그대로 활용한 점

5. 프로필, 게시글 이미지를 IPFS로 올려 URL로 받기에 업로드가 매우 느린것

 

 여러 아쉬운 점과 개선할 점이 보이지만 특히 이번 프로젝트에서 아쉬운 것은 인센티브 커뮤니티를 개발하는 게 이번 프로젝트의 목적인데 사용자 경험을 좋게 만들기 위한 기능 개발에 집중되고 말았던 점입니다. 좀 더 사용자가 어떤 행동을 했을 때 어떤 인센티브를 줄지 이더, 토큰, NFT 3가지를 잘 활용하여 크립토 이코노미를 구현하는데 더 고민하고 초점을 맞추었어야 했다고 생각이 듭니다.

 

 

Comments