이글은 8월 29일 Amazon Web Services가 주최하는 해커톤 행사에 참여하면서 느낀점을 정리해 보는 글입니다. 글의 목적상 편하게 반말로(?) 당시 생각했던 내용대로 글을 작성해 보겠습니다.
우선 해커톤에 참여하게 된 계기는 우연하게 새벽에 페이스북을 하다가 해커톤을 한다는 광고(?)를 보게 되었고 클릭했던것이 계기가 되었다. 이미 신청 시간은 마감되어있었지만 아직도 페북 광고를 하고 있다니 AWS담당자가 생각이 없거나 돈이 많거나 일부러(참가자가 부족?) 그랬겠구나 싶어서 일단 신청을 해봤더니 정말 되었음.
다음날 AWS에서 연락이 왔고 늦게 신청해도 괜찮다며 팀이 몇명이냐고 하길래 (팀같은거 깊이 생각안해봤지만) 덜컥 4명이라고 대답해 버림.그리고 후배 노바에게 연락해서 해커톤 참여하자고 말했고 다른 참여자를 모색해 봤지만 사람이 구해지지 않아서 결국 2명이서 나가기로.
이 해커톤의 목표는 AWS를 적재적소에 잘 활용한 게임을 개발하는것으로 게임의 퀄리티보다는 AWS의 활용도를 평가의 척도로 평가하겠다는 자리였음. 그래서 노바랑 이야기 해본 결과 우리가 짬짬이 취미로 만들고 있던 스타몬탭에 AWS를 붙이는 작업을 해보자고 이야기 했음.
노바는 클라이언트를 담당하고 나는 서버 구성을 담당하면 될 일이었고 AWS에서 교육세션까지 준비해주었다. 지금까지 몇번의 해커톤을 나가보았지만 당일 최선을 다하면 입상할 수 있다는 생각으로 나갔다가 항상 예선도 통과를 못하지 않았던가. 그래서 최대한 미리미리 준비해가기로 하였다.
적어도 게임에 붙일 기능들에 대해서는 미리 공부를 해가기로 생각했다. 처음에 생각했을때는 Cognito + Facebook을 사용하여 인증을 구현하고 S3에 유저들의 프로필 이미지들을 업로드하고 게임정보중에 코인정보는 CognitoSync를 사용하여 데이타셋에 저장하고 몬스터의 수집정보는 API Gateway + Lambda를 활용하여 DynamoDB에 저장하면 된다고 생각했다. ElastiCache(Redis)를 이용해서 실시간 랭킹을 구현하고 친구들의 몬스터와 인터렉션을 하게끔 업데이트를 해야겠다고 생각했다.
더 나아가 MobileAnalytics를 붙이면 적어도 2등정도는 할 수 있지 않을까 생각했고 무엇보다 2등 상품이 갖고 싶었다.
2등 상품은 바로 이것! 하지만 노바와 이야기 하며 해커톤에 나가면 항상 괴물들이 많아서 죽도 밥도 안될 가능성이 크니 욕심은 가지지 않되 좋은 경험이 될 수 있으니 한번 해보자고 하였고 나름 해커톤이 있는 주는 매일 우리집에 모여서 밤샘을 하다시피 했다. (라고 말하고 싶지만 졸려서 12시면 잠들었었던 듯…)
같이 앉아서 유니티 동영상 강의를 보기도 하고 밤새 AWS의 영어로 된 문서를 읽는것도 나름 고역이었다. 뭔가 Cognito는 모바일에서 무언가를 하기에 핵심적인 기능임에도 불구하고 한정적인 리전에서만 사용 가능했고 문서나 예제도 이해하기가 어려웠다.
특히 이 Cognito의 예제 프로젝트는 전형적으로 “나 개발잘해”를 뽐내고 싶은 개발자가 만든 예제. 나는 개발자들에게 배포되는 예제 프로젝트는 단순하고 바보같아야 한다고 생각한다. 개발자가 예제프로젝트를 분석해야 하는순간 그건 예제가 아니게 되는게 아닌가 생각한다.
AWS가 배포하는 Cognito 예제들은 하나같이 이해하기 어려웠고 살이 많이 붙어있는 형태였다. 왜 토큰들을 키체인에 안전하게 저장하는 방법이 예제에 구현이 되어있어야 하는지 모르겠다. 오히려 Cognito 토큰을 어느 시점에 발급받고 Credential Provider는 언제 초기화 되어야 하며 토큰이 만료되었을때 어떻게 해야 하는지 갑자기 써드파티 서비스들에 로그인하여 인증토큰을 받았을때 그걸 어떻게 적용할것인지 그런 플로우가 이해가 될 수 있었다면 좋았겠지만 예제 프로젝트로는 이해하지 못했다.
일일이 구현해 가며 삽질하다 깨달았던거 같다. 이제와서는 왜 그렇게 되어있는지 이해가 잘 되지만 아마 Cognito를 처음접하는 사람들은 나처럼 어려움을 겪으리라.
IAM에 미리 엑세스 권한을 잘 세팅만 해놓으면 Cognito로그인을 통해서 각종 서비스들을 바로바로 사용할 수 있게 된다. 제일 처음 시도한게 Lambda 함수 호출. API Gateway없이 Lambda를 바로 호출할 수 있다. 이편이 Cognito의 Credential을 이용하기에 보안상 더 안전한 느낌이 있다.
Cognito도 짜증났지만 이 Lambda는 신규 기능이라서인지 문서나 예제가 정말 없다. 문서를 아무리 봐도 이해하기가 어려웠다. 다행이 Javascript는 꾸준히 해왔고 Node 스터디를 했었던지라 로그를 찍어가며 삽질의 끝에 결국 성공.
이후에 MobileAnalytics를 붙이는데 이건 어렵지 않고 쉽게 붙을꺼라 생각했는데 왠걸 붙이기만 하면 프로젝트가 빌드가 안된다. Required Only App-Extension-Safe API를 No로 바꿔야 한다. AWS SDK가 쓰지 말아야 할 API를 호출하고 있다. (그럼 문서에 가이드라도 해주던지ㅠㅠ)
딱 여기까지 4일밤을 사용했다. 밤샘한건 아니니깐 총 투자한 시간이 8~9시간정도인것 같은데 이때쯤 되니깐 공부안해서 해커톤 참여한 팀이 있다면 Cognito나 간신히 붙일 수 있겠구나라는 생각이 들었다. 원래 목표에서 ElastiCache를 사용한 실시간 랭킹 구현은 목표에서 빼기로 했다. 해커톤 당일에는 API Gateway, DynamoDB연동이나 하고 지금 대충 붙여놓은 AWS SDK를 좀 더 완벽하게 붙이기로.
해커톤 당일 개발자들이 다들 지각할꺼라 생각하고 우리도 여유있게 출발했지만 우리가 도착하니 바로 행사를 시작하는 무안함을 겪었다. (미안합니다ㅠㅠ) 이런 다양한 먹거리가 준비되어있었고 하루종일 먹고, 먹은 기억밖에 나질 않는다.
우선 도착하자마자 Lambda를 다이렉트 호출하고 있는 부분을 API Gateway를 사용하기로 생각했는데 API Gateway도 이해가 잘 안되어 2시간을 삽질. 나중에 Channy님이 오셔서 설명을 해주셨는데 정말 딱 한번에 이해가 되었다. 역시 지식이라는건 모르는 사람에게는 한없이 어렵고 아는 사람에게는 쉬운것이 아닐까 생각되었다.
하지만 API Gateway도 이상한 부분이 있는데 Method Request에 Model을 매핑할때 Content-Type에 기본값인 application/json을 그대로 놔두고 추가를 하면 Invalid patch path /requestModels/ 라는 오류가 뜬다. 이 에러에서 또 1시간가까이 시간을 허비한것 같다. 하지만 솔루션 아키텍트분들께 여쭤보니 바로 해결. 허허허
이후에는 무리없이 진행이 되어 원하는 느낌으로 개발을 계속해서 진행할 수 있었다. 다른팀중에 정말 개발을 잘할것 같은 포스를 풍기는 대학생팀이 있었는데 중간에 포기하고 집에 가버렸다. 나는 개발을 끝내서 놀러 나가는줄 알았다.
해커톤의 진행중의 전경이다. 뭔가 조촐한감이 없잖아 있다. 나름 유쾌하게 진행되었던거 같은데 이렇게 사진으로 보니 대학교 시험보는데 교수님과 조교분들이 돌아다니는 느낌같아 보이기도 한다.
저 뒤로 우리팀도 보인다. 뭔가 집중하고 있지 않은것 같아 보이지만 나름 열심히 하고 있었다. 6시까지 개발을 끝내고 발표 문서 작업을 하겠다는 목표를 가지고 있었기에 6시즈음 되었을때 개발을 중단했다. 최종적으로 Cognito, S3, MobileAnalytics, SNS, API Gateway, Lambda, DynamoDB, CloudWatch를 사용하였다.
우리팀의 프로젝트에서 발표시에 증명하고 싶었던 것(?)은 다음과 같다.
- 현재의 AWS는 중소규모 게임 개발사가 사용하기에는 너무 비싸다.
- 작은 캐쥬얼 게임은 서버 기능이 많이 필요하지 않으며 단순한 서버작업만을 요구할 수 있다.
- 기존의 ELB + EC2 조합은 소규모 게임들의 경우에는 비용부터 운용까지 부담이 크다.
- 우리의 프로젝트는 단순한 캐쥬얼 게임을 대변하고 AWS를 통해 필요한 기능을 사용자들의 수에 비례하게 저렴하게 사용할 수 있다.
- 사용자가 예상치 않게 급격하게 늘어나더라도 대부분의 대응이 자동화 된다.
- 소규모 게임들에도 AWS를 쓰는것은 합리적인 선택이다.
실제로 이번에 해커톤을 통해서 AWS의 다양한 서비스들을 활용해볼 기회가 있었는데 매우 합리적인 방법으로 서버 API를 구성하는것이 가능하겠다는 가능성을 보았다고 생각한다. 나도 좀 더 연구해봐야겠지만 왠지 엄청나게 좋은 방법들이 있을듯 (가령 SNS안쓰고 Lambda만으로 메시지 발송을 한다던지, 단일 발송건에 한해, 대용량 발송은 SNS추천)
미리 열심히 공부해간 덕분인지 운이 좋게 1등상을 받을 수 있었다. 1등이 총 2팀이었는데 솔직히 다른팀인 Game Indie팀이 더 잘 만들었다고 생각한다. 다양한 기능들을 매우 창의적으로 활용한 게임이었다고 생각한다. 그래도 이런 상을 받을 수 있고 많이 공부할 수 있었고 자극을 받을 수 있었던 시간이라 좋았다고 생각한다.
마지막으로 해커톤 당일 발표자료를 공유하며 글을 마친다.