creative joo


Project: comoto

https://apps.apple.com/kr/app/id1560559054




인트로


약 한 달 전, 저는 어느 때처럼 평범하게 출근하고-일하고-퇴근하는 굴레에 있었습니다. 평소와 다른 점이 있다면 에어팟을 회사에 놓고 와서, 즐거운 음악 없이 지하철을 탔다는 정도였죠. 에어팟의 중요성을 깨닫고 있을 즈음, 제 주위에 있던 사람들의 대화 주제가 같다는 걸 눈치챘습니다. 바로 "암호화폐"었습니다. 특히 코인으로 돈 번 얘기를 하는 사람들의 눈은 그들이 꿈꾸는 한강뷰만큼이나 반짝였습니다. 하지만 대학생 시절, -60%의 수익률을 기록한 전적이 있는 저는 그들의 대화가 멀게 느껴졌습니다. 그러다 집에 거의 도착할 즈음, 저는 한 가지 생각을 합니다. '코인에 관심은 있지만 돈은 잃기 싫은데, 코인 모의 투자 앱이나 만들어볼까?'


▲ 대학생 시절의 흑(흑)역사.


퇴근 후 하루 3시간, 일주일 만에 앱 출시하기


앱을 만들어야겠다는 생각을 한 순간부터, 앱을 어떻게 만들어야 할지 막막했습니다. 코인 관련된 데이터는 어디서 가져오지? 서버는 어떻게 하지? 사용자 인증은? NoSQL을 한 번 써볼까? 차트는 어떻게 그린담? 디자인은? 등 많은 고민을 했죠. 제일 중요한 코인의 시세 정보는 각 거래소에서 지원하는 Public API가 있어서 금방 고민 해결을 할 수 있었습니다. 서버의 경우는 정석이라고 할 수 있는 AWS를 사용할까 했지만... 고민 끝에 firebase를 택했습니다! 서버뿐만 아니고 다른 고민들도 해결해 주거든요.


▲ 구글의 개발 플랫폼인 Firebase로 사용자 인증, NoSQL 데이터베이스, 스케줄러 등을 간편하게 구현할 수 있다.


사실 저는 Firebase를 별로 안 좋아했습니다. 왜냐면.. 안 써봤거든요! 다행히도 구글에서 한글화로 잘 문서화를 해놔서, 금방 익숙해질 수 있었습니다. Firebase에서 프로젝트를 만들고, CocoaPod으로 설정까지 마친 저는 한 가지 더 고민을 합니다. 바로 UIKit과 SwiftUI, 둘 중 하나를 선택해야 하는 고민을요.


솔직히 말씀드리면, 저는 SwiftUI를 매우 좋아합니다. 저는 iOS 개발을 직업으로 삼고 있지 않다 보니 UIKit이랑 친해질 기회가 적었지만, SwiftUI는 예전에 베타리딩을 한 적이 있어서 조금 더 친하거든요. 또, 제약 조건을 신경써야 하는 Autolayout보다 SwiftUI의 Stack이 더 마음에 듭니다. 단지 작년에 SwiftUI 초기 버전으로 앱을 출시했다가, SwiftUI 2.0이 릴리즈되고 기존 코드가 작동이 안 되던 경험이 있어서... 걱정이 되긴 했지만 설마 또 그렇게 많이 바뀌겠어! 하며 결국 SwiftUI를 선택하게 됩니다.


SwiftUI + Firebase를 선택한 저는, 우선 코인의 시세 정보를 Firebase의 데이터베이스에 넣는 작업부터 했습니다. 사용자가 실시간으로 API를 조회하면 좋겠지만, Public API는 호출 제한이 있기도 하고 거래소 입장에서 반갑지 않을 테니 5분마다 스케줄러에서 Firebase 데이터베이스에 시세 정보를 저장하도록 설정했어요. 그러는 동안 저는 퇴근 후 하루 3시간씩(+주말), 열심히 View를 설계했습니다.


▲ 데이터와 상관없이, View만 약 1주 동안 개발&테스트..


차트의 경우는 Charts라는 라이브러리를, 대부분의 디자인은 SwiftUI의 기본 디자인(InsetGroupedListStyle)을 최대한 활용하였습니다. 저는 디자인 전공이지만, 제가 아무리 멋지게 만들어도 애플의 기본 디자인보다 더 나을 것이란 확신이 없었거든요. 그리고 기본 디자인을 활용하면 다크 모드도 알아서 지원해 주니 제 입장에서는 안 쓸 이유가 없었습니다.


▲ SwiftUI로 후다닥 완성시킨 View


View는 얼추 되었고, 이제 차곡차곡 쌓은 데이터를 연동하는 일만 남았습니다. 올바른 방법인지는 모르겠지만, DataCenter라는 클래스를 만들어서 Firebase에서 데이터를 가져오고, @Published 변수에 저장을 했습니다. 이 클래스는 EnvironmentObject로 지정해서 모든 뷰에서 바로 데이터를 가져올 수 있도록 말이죠. (SwiftUI 만세!)


데이터베이스의 저장되는 컬렉션은 각 코인의 시세 정보, 유저의 정보(코인 구매 로그, Uid, 즐겨찾기 목록 등), 랭킹 등으로 나누어서 분리를 했습니다.

제가 간단하게 말하긴 했지만, 이 부분만 거의 1주는 걸렸습니다. 그리고 다음 난관은..


▲ 수익률 계산..


수익률 계산하는 게 생각보다 머리 아팠습니다. 샀던 시점의 시세를 현재 시세와 비교를 하면 되긴 하는데, 중간에 일부를 팔거나 살 때 어떤 데이터가 필요한지..전체 평균을 어떻게 낼지.. 내가 수학을 잘했다면 금방 끝났을 텐데, 하는 아쉬움이 있었습니다. 어쨌든 무사히 수익률 계산도 마친 뒤엔, 코인 로고 에셋을 저장하는 등의 단순 반복 업무가 남았는데.. 이 부분은 노가다를 할까 하다가 Python으로 에셋 폴더를 만드는 것으로 금방 끝냈습니다. 단순 반복 업무는 분명 자동화의 여지가 있을 테니까요. 아마도?


▲ Python으로 만든 Images Asset JSON 생성 코드


이제 남은 건 심사뿐입니다. 배포하니 애플에서 앱에 대해 자세히 설명하라고 하더군요.. 아무래도 암호화폐 관련된 앱은 조금 심사 조건이 까다로운 모양입니다. 번역기를 활용해서 열심히 앱에 대한 설명을 하고, 심사를 통과하여 앱을 릴리즈 했습니다!



▲ 완성된 앱의 작동 화면 일부


▲ 참고로 한국과 미국은 문화의 차이로 색의 의미가 다릅니다. 한국은 빨강이 올랐을 때의 색으로 쓰이지만, 미국은 빨강이 안 좋은 의미를 가져서 내려가는 색으로 사용되거든요. 당장의 애플 주식 앱만 해도 그렇습니다.


▲ 다크모드에서의 앱 화면


3주 동안의 퇴근 후 시간과 주말을 희생해서 만든 앱은 많은 것을 배우게 해줬습니다. 조금 정리해보면..
1. 기존에 나와있는 개발 플랫폼, API를 활용하자
2. 기본 디자인을 최대한 활용하자
3. 단순 반복 업무는 자동화를 고려해보자
정도가 될 것 같습니다. 물론 대단한 거대 프로젝트가 아니라 개인 프로젝트에 한해서요.
더 좋은 글을 쓰고 싶었는데 내일 출근을 위해 이만 글을 마쳐야겠네요. 읽어주셔서 감사합니다 :)


2021년 5월 24일