https://blogfiles.pstatic.net/MjAyNDAyMDlfMTIz/MDAxNzA3NDgyMDkzMzE3.ULWlFn9mO7oWKD-ILPo5bhis1gJWldg8O1nV-sY50iog.7WEXOwLYIOleZ3H2nYgOnzi2ztHLP0nI1sdqlRRzU8Yg.PNG.sinsin63/bf3a4a38-ac7b-4b6f-a4fa-5bc06b9c36c3-image.png

본 프로젝트에서는 Smart Contract를 응용하여 Serverless Architecture DataBase를 구현해보았습니다.

개요

고전적인 Server-Client구조에서 발생하는 게임 내 재화 문제의 원인 중 하나는 Server와 Client사이의 동기화 시점에 의한 문제였습니다.

https://blogfiles.pstatic.net/MjAyNDAyMDlfMjMx/MDAxNzA3NDgyMDkzNTQz.WkSrACV06-lfGjlhcvXBQ7PRsZ7IK--qpO0cwNhj7ycg.okh0XCMRDWR5OxoRvydBGOCCwxlg1wtKpKBmTPgOngMg.PNG.sinsin63/ff4429ab-eb8a-48bb-8d69-c358bf551f9e-image.png

플레이어의 모든 순간을 매번 Server에 동기화할 순 없기 때문에 이를 해결하기 위해선 개발자의 섬세한 동기화 시점 선택을 요구했습니다.

https://blogfiles.pstatic.net/MjAyNDAyMDlfOTQg/MDAxNzA3NDgyMDkzMjk3.zhv-EeYBj9uJ64CKgXssWqgr_JIidpPrlN3GOKLR8bkg.ZUGZTQ0fpuW-vW8WBVWGti5zkYiUmokqyUlfIoIyIqAg.PNG.sinsin63/b8713fa9-3f26-4da6-a06e-6c1d33d07c9f-image.png

이러한 부분에 있어서, ’공개 장부’라는 블록체인의 특성과, ’프로그래밍 가능’이라는 Smart Contract의 특성을 이용한다면 동기화 시점에 대한 고려가 필요없는 DataBase Server의 역할을 구현할 수 있지 않을까라는 궁금증을 가지고 개발을 시도해봤습니다.

프로젝트 진행 과정에서 전반적인 설계와 Server-Client간의 통신을 주로 구현했는데, Rest 방식을 이용하여 통신을 구현한 것이 인상적이었습니다.

또한, 처음으로 프로그래밍 가능한 동료들과의 협업이었기 때문에, 세심하게 상하위 설계를 마치고 실개발에 들어간 것이 흥미로운 경험이었습니다.

UseCase

https://blogfiles.pstatic.net/MjAyNDAyMDlfMTQz/MDAxNzA3NDgyMDkyNzYz.EpTNlHIlKEPxz4gi3lDl9lr13w-957xrOLnG2ictK8gg.BsbXnph_F5zL23Wge-lrq5GahEv9Rv_OERSPAuhnGC0g.PNG.sinsin63/0e284908-5bed-44bf-b5c8-9fbbb2e064be-image.png

https://blogfiles.pstatic.net/MjAyNDAyMDlfMjkz/MDAxNzA3NDgyMDkyNzky.lKdRWIUOY46B-QyfwdwLQcmV3QfdtJjXT79pnD5DdJcg.8rv2zfxCbWOJd4cApl2SAUdJv3cIzvi3zF53YNnfrtsg.PNG.sinsin63/766cb1ba-6e33-4519-86ea-46d080bf18c2-image.png

https://blogfiles.pstatic.net/MjAyNDAyMDlfNDAg/MDAxNzA3NDgyMDkyNzkz.WuBB1k8GFvapMd1aqq4EE7r9W1R_EuAnWuiIpGUr4AAg.CZRySiEItbBNifd0LU_6WNXbXhLVMrRdIzeb2PyttkAg.PNG.sinsin63/63d19925-c8ca-4e73-87ec-94ea31677102-image.png

게임 자체의 완성도가 중요한 것은 아니었으므로, 간단하게 아이템 구매, 선물, 게임 기록 업데이트 3가지 상황만 가정하여 구현했습니다.

설계

https://blogfiles.pstatic.net/MjAyNDAyMDlfMSAg/MDAxNzA3NDgyMDkzMzM1.Nfr2nZ1l2dhAInU3ngq8oXUAovtophHZTKf1AnumjCwg.wdWKDugeeWVdt1KkYyEcDx2ChYlw_9SOklYox_C9iDYg.PNG.sinsin63/dac8d467-bb6b-406f-93fa-8714bfcdc46d-image.png

https://blogfiles.pstatic.net/MjAyNDAyMDlfOTQg/MDAxNzA3NDgyMDkzMzE3.0o-9YNxnrHGDJnIh9HFeTq50MDlSFC41uF6YlVw78Ukg.RLKOrpQxmPc2ow1ZRpH6sdt7rgWDcc6Nz7Al9XtMuekg.PNG.sinsin63/d5f5a1dd-7c7a-4fbd-866c-e18e03d1768b-image.png

상위 설계의 경우, 다른 프로젝트나, 개인적인 개발 중에도 여러번 진행해봤지만, 각 객체의 기능과 Interface를 미리 설계하는 것은 생각보다 어려운 작업이었습니다.

코드