두 번째 프로젝트 기간 - 4월 19일 화요일 ~ 4월 29일 금요일 (주말 제외 9일)
이번 주제는 인센티브 기반 커뮤니티 만들기였다.
로그인, 글 작성, 댓글 달기 등 특정 커뮤니티 활동을 했을 때 토큰을 인센티브로 지급해주는 것이다. 이번 프로젝트에서는 서버를 아예 빼버리고 진행했던 지난 프로젝트와는 다르게 서버가 필요했다.
우선 팀원들과의 회의를 통해 전체적인 틀을 잡으며 구조화시켜보았다.
큰 흐름은 다음과 같다.
구현은 프론트는 ReactJS와 mui, 백은 NodeJS, ExpressJS를 사용하기로 하였고, 데이터베이스는 팀원들이 모두 사용해보지 않은 MongoDB를 사용해보기로 하였다. 컨트랙트 부분은 Solidity와 EthersJS가 사용되었다.
4명의 팀원을 프론트 1명, 서버 2명, 컨트랙트 1명으로 나누었고 나는 서버를 맡게 되었다. 그 중에서도 내가 구현한 api는 게시물 작성 및 수정, 댓글 작성 및 삭제, 좋아요 기능, 메인 페이지(전체 게시물 표시)였다.
이 부분들은 처음 구현할 때는 컨트랙트와는 바로 연관이 있지는 않아서 큰 어려움 없이 구현할 수 있었다. 다른 팀원분이 회원가입, 로그인, 로그아웃, 프로필 및 수정 등 api를 구현하고 전반적인 구현이 완료되었을 때 프론트를 맡은 분과 함께 테스트해보며 오류를 발견하고 수정하는 과정을 거쳤다.
지난 프로젝트 때도 팀원들과 꾸준히 소통하며 구현을 해서 큰 문제 없이 잘 진행됐었는데 이번에는 더 소통이 잘 되었다. 모두가 열심히 해서 거의 하루 종일 줌에서 모여 끊임 없이 소통하며 기능들을 구현하였고 그래서 속도도 빨랐고 안정적으로 잘 진행된 것 같다.
일반적인 기능들이 완성되고서는 컨트랙트와 연결해 댓글 5개, 좋아요 5개마다 토큰을 지급할 수 있도록하는 기능도 구현하며 우리 팀의 1차 목표에 점점 다가갔다. 주말을 제외하고 9일이 주어졌는데 우리는 6일만에 1차 목표를 달성하고 프로젝트를 더 업그레이드해보기로 하였다.
남은 시간은 3일. 바꿔보고자 했던 내용은 게시물을 nft화 해서 추가로 저장하는 것과 토큰을 일정 비율 또는 일정 개수 이상 보유하게 되면 관리자 권한을 부여해 투표 안건을 올리거나 투표에 참여할 수 있도록 하는 기능이었다.
모두 정리하면 위 사진과 같다. 팀원들이 작업하며 참고하기 위해 점차 채워져간 마인드맵이다.
여기부터는 팀장님이 화면을 공유해놓고 모두 함께 클라이언트, 서버, 컨트랙트를 골고루 공부하며 집단 지성을 발휘하면서 구현해나갔다. 이때가 특히 더 재미있었다. 잘 몰랐거나 애매하게 알고있던 부분들을 다른 팀원분들이 해결해나가는 모습을 보며 알게 되기도 하고 내가 찾은 자료가 도움이 되어 문제를 해결하기도 하면서 2차 목표도 시간 안에 달성할 수 있었다. 아마 혼자 구현하려 했다면 몇날며칠이 걸렸을지 상상도 안된다.
정리해보면,
이번 프로젝트는 이것저것 공부가 많이 된 것 같다. 클라이언트와 서버, 데이터베이스, 컨트랙트를 각각 어떤 상황에서 사용하고 서로 어떻게 연결하며, 소통해야할지 조금 더 선명해진 느낌이다. ERC20과 ERC721을 동시에 한 프로젝트에 적용하는 것도 경험해보았고 마냥 어렵게만 느껴졌던 스마트 컨트랙트도 아주 조금은 익숙해진 기분이다. 특히 많이 고생했던 버전관리 부분에서 생각이 많아졌다. 무턱대고 인스톨한다고 될게 아니라 호환성도 신경써야하고 배포할 때의 상황까지 고려해서 신중하게 결정해야할 것 같다.
최근에 타입스크립트를 공부해야겠다는 생각이 들어 이어지는 마지막 프로젝트까지 완료되면 앞서 진행했던 프로젝트를 포함해 타입스크립트로 리팩토링해볼까 고민 중이다. 물론 웬만해서는 할 예정이고 새프로젝트도 해볼 계획이다. 의욕 넘치는 5월이 될 것 같다.