AERGO JDBC를 활용한 게시판 DApp 만들기

AERGO JDBC

AERGO JDBC는 익숙하지 않은 블록체인 관련 언어를 통한 블록체인 앱 개발의 어려움을 해결하기 위해, 많은 개발자에게 친숙한 Java, SQL을 통해 블록체인 앱 개발의 편의성을 제공하는 기술입니다. 이 기술의 동작 방식은 SQLite를 기반으로 하는 AERGO SQL의 스마트 컨트랙트를 통해 AERGO에 하나의 데이터베이스를 구성하고, AERGO JDBC로 해당 데이터베이스에 접근하여 데이터들을 관리할 수 있도록 하는 것입니다. 이 글은 블록체인 앱 개발을 함에 있어 이렇게 편리한 매력을 가지고 있는 AERGO JDBC의 활용 방법을 소개하고자 합니다. 활용 방법을 소개하기 전에 앞서 AERGO JDBC 개발과 관련한 용어들을 설명하겠습니다.

JDBC

JDBC(Java DataBase Connectivity)는 Java를 통해 데이터베이스에 접속하고 데이터들을 데이터베이스에 CRUD(Create/Read/Update/Delete) 등을 할 수 있도록 지원하는 기술입니다.

AERGO JDBC는 Java를 통해 AERGO에 접속하여 배포된 스마트 컨트랙트 주소의 데이터베이스에 있는 데이터들을 관리하는 기술이라고 생각하시면 좋을 것 같습니다.

Spring Data JPA

Spring Data JPA는 Spring 프레임워크에서 제공하는 모듈 중 하나로 데이터 접근 계층의 개발을 빠르고 편리하게 할 수 있도록 하는 기술입니다.

이 기술은 데이터 접근 계층 개발에 있어 반복되었던 Connection, PreparedStatement, ResultSet 등을 인터페이스를 통해 간결하고 용이하게 데이터 접근 계층을 개발할 수 있도록 합니다. 이 글에서는 AERGO JDBC를 Spring Data JPA와 연동하여 빠르고 쉽게 블록체인 앱을 개발할 수 있는 방법 중 하나를 제시하고자 합니다.

게시판 프로젝트

게시판 프로젝트를 주제로 선정하게 된 이유는 데이터의 CRUD를 모두 보여줄 수 있는 가장 기본적인 프로젝트라고 생각했기 때문입니다.

그러면 지금부터 AERGO JDBC를 통해 구현한 게시판을 살펴보도록 하겠습니다.

개발 환경
OS macOS
Language Java(1.8 이상), Lua
IDE Eclipse Java EE IDE for Web Developers Oxygen.3a Release
AERGO Node AERGO 2.2.3
IDE Atom, Atom의 Athena IDE
Docker Docker Desktop Community 2.3.0.3
AERGO JDBC 1.2
DB Tool DBeaver 7.1.3
기능
회원가입 사용자는 이메일, 비밀번호, 이름으로 회원가입 할 수 있습니다.
로그인 / 로그아웃 사용자는 이메일, 비밀번호를 통해 로그인 할 수 있고,

로그아웃도 할 수 있습니다.

게시판 작성 로그인한 사용자는 제목, 내용, 파일 업로드를 포함한 게시판을 작성할 수 있습니다.
게시판 조회 로그인한 사용자는 게시판을 조회할 수 있으며, 조회 시 조회수가 증가하는 것을 확인할 수 있습니다. 게시판에 업로드된 파일은 다운로드 할 수 있습니다.
게시판 수정 로그인한 사용자는 게시판을 수정할 수 있습니다. 수정 후 게시판 상세 목록 이동 시 조회 수는 증가하지 않는 것을 확인할 수 있습니다. 작성자가 아닌 다른 사용자는 수정할 수 없습니다.
게시판 삭제 로그인한 사용자는 게시판을 삭제할 수 있습니다. 작성자가 아닌 다른 사용자는 게시판을 삭제할 수 없습니다.
AERGO 및 AERGO JDBC 설정

AERGO를 구성하기 위해 AERGO Tool을 다운로드합니다.

AERGO CLI의 다음 명령어를 통해 Genesis,  AERGO JDBC 지갑 키스토어를 생성합니다.
키스토어를 생성하면 해당 지갑의 주소를 확인할 수 있습니다.

다음 명령어를 통해 해당 지갑의 암호화된 개인키를 확인할 수 있습니다.

다음 명령어를 통해 구동할 AERGO의 키를 생성합니다.

AERGO 키가 있는 경로에서 Genesis 설정 파일인 genesis.json을 작성합니다.

AERGO 환경 설정 파일인 config.toml을 작성합니다.

AERGO 로그 설정 파일인 arglog.toml을 작성합니다.

AERGO JDBC Github에서 aergojdbc-1.2.0.jar, db-1.2.0.lua를 다운로드합니다.

다운로드한 aergojdbc-1.2.0.jar 파일을 다음과 같이 설정합니다.

위와 같은 과정을 거쳐 프로젝트에 AERGO 설정이 미리 되어있는 것을 확인하실 수 있습니다.

run.sh를 실행하여 AERGO를 구동합니다.

Atom Athena IDE 가이드를 참조하여 Atom과 Athena IDE를 설치합니다.
그리고 AERGO JDBC 스마트 컨트랙트를 배포하기 위해 Import 버튼을 클릭합니다.

Add file 버튼을 클릭하여 사전에 생성한 JDBC 키스토어 파일을 추가합니다.

JDBC 키스토어 파일의 비밀번호를 입력한 뒤 Import 버튼을 클릭하여 스마트 컨트랙트 배포 준비를 합니다.

Compile 버튼 클릭 이후 Deploy 버튼을 클릭하여 스마트 컨트랙트를 배포합니다. 정상적으로 배포가 되면 스마트 컨트랙트 주소를 확인할 수 있습니다.

DBeaver 설정

DBeaver는 데이터베이스 툴 중 하나로 배포된 스마트 컨트랙트 주소의 데이터베이스를 확인하기 위해 사용합니다.
우선 DBeaver를 설치한 뒤 다음과 같이 Connection 생성을 시작합니다.

sqlite를 검색한 뒤 SQLite를 선택하고 다음 버튼을 클릭합니다.

Connection 설정을 하기 위해 Edit Driver Settings를 클릭합니다.

Class Name에 org.aergojdbc.JDBC를 입력합니다.
그리고 URL Template에 application.yaml 파일에 있는 jdbc:aergo:${AERGO_ENDPOINT}@${CONTRACT_ADDRESS}를 입력합니다.
또한 User Properties에 user : ${JDBC_ENCRYPTED_PRIVATE_KEY}, password : ${JDBC_PASSWORD}를 입력합니다.

Libraries를 클릭한 뒤 Add File을 클릭하여 다운로드한 aergojdbc-1.2.0.jar을 추가합니다.

Find Class 버튼을 클릭한 뒤 확인 버튼을 클릭합니다.

완료 버튼을 클릭하여 배포된 스마트 컨트랙트 주소의 데이터베이스에 접속합니다.

프로젝트 설정

gradle.properties로 의존성 버전을 다음과 같이 관리합니다.

 

프로젝트는 다음과 같이 멀티 프로젝트로 구성했습니다. 자세한 설정은 코드를 참조하시기 바랍니다.

aergo-community AERGO 설정 파일
aergo-community-api Controller, Service를 담당하는 프로젝트입니다.
aergo-community-assembly 배포 파일 생성 프로젝트입니다. (현재 작업 X)
aergo-community-core Entity, Repository를 담당하는 프로젝트입니다.
aergo-community-front View를 담당하는 프로젝트입니다.

서버 설정 파일인 application.yaml은 다음과 같습니다.

Entity

테이블과 매핑되는 클래스로 SimpleUser, Board로 구성했습니다.
SimpleUser의 경우 user 테이블, Board의 경우 board 테이블과 매핑되며,
user 테이블과 board 테이블은 일대다 관계입니다.

Repository

각각의 Entity에 상응하는 저장소로 AERGO에 데이터를 생성/조회/수정/삭제할 수 있도록 해주는 일종의 DAO입니다.

Create

UserService의 회원가입 메서드입니다. 회원가입에 필요한 이메일, 비밀번호, 비밀번호 확인, 이름을 받아 save 메서드를 통해 회원가입을 합니다.

아래의 코드는 ID Generator로 Create 수행 시 ID를 자동으로 생성해주는 클래스입니다. 따라서 회원가입, 게시판 작성 시 사용자의 ID가 생성되어 데이터베이스에 저장되는 것을 확인할 수 있습니다.

TimeEntity는 @MappedSuperclass를 통해 생성일, 수정일의 공통 정보를 상속을 통해 SimpleUser, Board 객체에 매핑해주는 부모 객체입니다.

@PrePersist 어노테이션은 Entity가 영속성 컨텍스트에 관리되기 직전에 걸려있는 코드를 호출하는 역할을 합니다. @PreUpdate 어노테이션은 Entity를 데이터베이스에 수정하기 직전에 걸려있는 코드를 호출하는 역할을 합니다.

READ

BoardService의 게시판 조회 메서드입니다. 게시판 ID에 상응하는 게시판 데이터를 findById 메서드를 통해 조회합니다.

Update

BoardService의 게시판 수정 메서드입니다. save 메서드를 통해 게시판을 수정합니다.

Delete

BoardService의 게시판 삭제 메서드입니다. 게시판 ID에 상응하는 게시판 데이터를 deleteById 메서드를 통해 삭제합니다.

참고 자료

게시판 프로젝트 Github
Aergo 개발자 가이드
Aergo JDBC Github
Atom Athena IDE 가이드

왜 스마트 컨트랙트는 어렵게 개발해야 할까?
블록체인이란?

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다

필수 입력 사항입니다.
필수 입력 사항입니다.
유효한 이메일 주소를 입력해주세요.
You need to agree with the terms to proceed

메뉴