iOS 개발자의 첫 SwiftUI 앱 개발기

2022/01/14에 작성됨 · 읽는데 약 11분 소요

내가 지난 1월 1일부터 1월 8일까지 개발하여 1월 10일에 출시한 초록잔디 앱에 대해 얘기를 풀어보고자 한다.

개발하는 과정, 개발하면서 있었던 일 등에 대해 이야기를 풀고,

개발에 있어 많은 어려움이 있었던 것은 아니지만, API 정책 등으로 인해 막혔던 부분들도 있어, 그런 부분도 얘기하고자 한다.

아직 내가 이런 글을 남겨도 되는 존재인지는 잘 모르겠지만.. 좀 잘 만든 앱인 것 같아서 글로 남겨보고자 하여 작성했다.

동기

앱이 출시되기 몇일 전, 아는 후배의 2022년 목표를 봤고, 그 후배도 나에게 목표를 말해줬다.

1일 1커밋은 물론, 나보다 커밋을 많이 하고 싶다고 했다.

하지만 과연 자기가 까먹거나 빼먹는 날 없이 1일 1커밋을 달성할 수 있을지가 걱정이라고 했다.

그래서 나는 “그럼 1일 1커밋을 알려주는 앱 개발해볼까”라는 생각이 들었고, 그래서 곧장 개발 프로세스에 들어갔다.

설문조사

이 앱이 다른 사람들에게도 필요할지, 얼마나 많은 사람들이 다운받아줄지를 알아보기 위해 나는 먼저 설문조사를 했다.

거창한 구글 폼 설문조사같은 것은 아니고, 페이스북과 인스타그램의 스토리 기능을 통한 설문조사였다.

결과는 두 플랫폼의 설문을 모두 합치니 찬성 26표, 반대 7표였다.

본격적인 개발을 시작한다.

언어선택

먼저 개발에 들어가기에 앞서 어떤 언어로 개발할지 고민했다.

Swift + Storyboard도 있고, SwiftUI도 있고, Flutter도 있어서 뭘로 개발할지 고민했는데, 결국은 SwiftUI로 개발하기로 결정했다.

그 이유는

  1. 요즘 연습하고 있는 언어이고,
  2. UI 개발이 합쳐져 있는 형태라서 가장 빠른 개발이 가능하며,
  3. 요즘 iOS 개발 트랜드에 가장 올바른(?) 언어이기 때문에

SwiftUI를 선택했다.

3번 이유에서 Flutter도 고민해보았는데, Flutter로 만든 다른 앱들을 보니깐 안정적이지도 않고 개발 스타일도 Swift 대비 너무 복잡해서 바로 내 고민거리에서 폐기했다 ㅎㅎ

개발

언어는 위에서 말했듯이 내가 평소에 연습하고 있었던 SwiftUI로 개발했다.

그나마 나은 언어로 고른 것이긴 하지만, 연습한지 얼마 되지 않아서 오래걸릴까 걱정이 되기도 했다.

하지만 개발을 하다보니 너무 쉽고, 인간 맞춤형 언어(?)라서 빠르게 개발되었다.

많은 기능 구현이 필요한 것은 아니라서 빠르게 개발된 것 같다는 생각도 없지않아 있다.

그리고 꿀 사이트 하나 공유하자면.. 앱 아이콘을 사이즈에 맞추어서 앱 아이콘 파일은 물론, 앱 아이콘 정보를 담은 json 파일까지 만들어서 폴더로 만들어주는 좋은 사이트가 있어서 공유한다.

appicon.co 라는 사이트인데, 나만 그럴진 모르겠지만 너무 편리하다.

아, 혹시 광고라고 생각한다면 정말정말 아쉽지만.. 광고는 아니다.. 광고받고싶다

일부 기능을 편하게 구현하기 위해 외부 라이브러리로는 API 통신을 위한 Alamofire, 앱 PUSH 알림을 위한 Firebase을 사용했다.

예전에는 URLSession을 사용하다가 이번에 Alamofire를 두 번째로 사용하는 것인데, 정말 편리한 것 같다.

json 파싱도 기본적으로 지원하고, 코드도 더 간결하게 쓸 수 있어서, URLSession 대비 더 좋은 것 같다!

그리고 무엇보다 대부분의 실무에서는 Alamofire을 사용한다고.. 또 저만 뉴비라서 모르던 사실..

그렇게 원활하게 개발되나 싶었는데, API 사용을 시작으로 점차 문제가 발생했다.

API

API가 큰 문제였다.

깃허브의 API에서는 커밋 정보를 제공하고 있지 않았던 것이다!

나는 Mac의 상단 메뉴 바에서 커밋 이력을 보여주는 ‘잔디’ 앱도 동일한 API를 사용할 것이라 생각했고, 그래서 ‘잔디’ 앱의 코드를 참고했다.

TMI지만, ‘잔디’ 앱은 오픈소스이다. 초록잔디는 “아직” 오픈소스가 아니고..

‘잔디’ 앱의 코드를 보니, 깃허브의 잔디 페이지를 크롤링을 하여 커밋 정보를 가져오고 있었다.

그래서 나도 해당 페이지에서 크롤링을 통해 커밋 정보를 가져왔고, 적절히 데이터를 파싱해서 커밋 관련 기능을 구현했다.

그런데 이것 말고도 또 한가지의 문제가 있었다.

초록잔디는 ‘앱이 Foreground 상태로 전환될 때’, ‘탭이 이동될 때’, ‘사용자가 새로고침 버튼을 누를 때’ 크롤링과 함께 깃허브 API를 통해 사용자 정보(프로필 사진, 팔로워, 팔로잉, 깃허브 계정 생성일) 등을 읽어오고 있는데, 깃허브 API는 1시간 당 60회로 API의 요청을 제한하고 있던 것이었다.

이 때 어떻게 해결해야 하는지 정말 많이 고민했다.

“사용자 정보를 가져오지 말까?”도 생각해 보았고, “사용자의 깃허브 토큰을 받아, API 호출을 1시간 당 6,000회까지 늘릴까?“도 생각해 보았지만, 사용자 편의성이 매우 떨어질 것이라고 판단했다.

결론은 ‘앱이 Foreground 상태로 전환될 때’, ‘탭이 이동될 때’, ‘사용자가 새로고침 버튼을 누를 때’에는 커밋 정보만 크롤링하기로 했고, API 호출은 ‘사용자가 설정 탭의 ‘사용자 정보 새로고침을 누를 때’, ‘하루동안 앱을 처음 켤 때’만 호출하기로 했다.

어차피 사용자 정보는 그렇게 자주 변동되는 정보가 아니기 때문이다!

Firebase

그렇게 모든 데이터를 얻어올 수 있도록 구현한 후 “이제 앱 심사를 요청할까?” 생각하던 도중, 정말 이상하게도 Firebase의 기능들이 동작하지 않았다.

평소에 SwiftUI를 연습했을 때처럼 AppDelegate를 만들어 AppDelegate에 Firebase 관련 코드를 넣어두었는데, 평소와 다르게 동작하지 않았던 것이다.

엄청나게 많이 오류를 해결하고자 노력했지만, 내가 개발 완료로 예상했던 기간까지 완료되지 않아서 포기하고 1.0 버전에서는 앱 알림과 앱 사용자 분석 기능을 제외한 채 출시했다.

그래서 1.0 버전의 앱에서 설정 탭의 ‘1일 1커밋 알림’을 토글하면 아래와 같은 알림이 뜬다.

다음번 1.1 버전의 앱 업데이트 때에는 꼭 고쳐서 업데이트를 올리고 싶다.

아마.. 프로젝트 파일을 새로 만들거나 로직을 완전 새롭게 짜야하지 싶은데..

코드는 깃허브 Private 레포에 버전관리가 되어있으니, 코드를 막 건들여보면서 해결해보아야겠다.

앱 심사

앱 심사는 정말 내가 생각한 것보다 빠르게 진행되었다.

7일 오후 3시 1분에 앱 심사를 요청했고, 8일 오전 12시 55분에 앱 심사가 통과되었으니, 9시간 54분만에 통과한 것이다.

그리고 더군다나, 단 한 번의 리젝 없이 곧바로 통과되었다.

기분 좋았다 ㅎㅎ

출시

8일 오전 12시 55분에 통과되었지만, 나는 앱을 10일 오전 9시에 출시했다.

내가 이 프로젝트를 시작할 때 부터 앱의 출시는 10일 오전 9시로 생각하고 개발했기 때문이다.

그런데 8일부터 10일까지 가만히 있기 싫어서, 본 서비스의 출시를 카운트다운하는 사이트를 개발했다.

green-grass.tech 도메인을 ‘깃허브 학생팩’을 이용하여 무료로 구매하여, 순수 HTML과 순수 JS로만 개발했다.

그렇게 10일 오전 9시가 되었고, 출시를 예약해두었기에 앱이 자동으로 출시되었으며, 나는 그 때 페이스북 ‘코딩이랑 무관합니다만,’ 그룹, ‘생활코딩’ 그룹, ‘Swift Korea’ 그룹에 글을 남겼다.

물론 홍보의 목적도 있었지만, 나는 홍보의 목적보단 꾸준한 커밋을 원하는 많은 사람들이 이 앱을 사용하여 좋은 영향을 얻길 바라는 마음에서 올렸다.

오류

앱을 잘 출시하고 나니 이 앱을 만들게 된 동기를 제공한 후배에게서 연락이 한 통 왔다.

아.. 출시 후 오류 발견이다..

대충 Int의 범위를 넘어서서 오류가 나는 것 같다고 나는 판단했다.

단순히 앱을 재설치하면 해결되는 오류이므로, 큰 문제이기도 하지만 그렇게 큰 문제는 아니다.

그래서 다음 1.1 버전에서 해결해서 업데이트를 배포하려고 한다 ㅎㅎ

다음부터는 오픈 베타 테스팅을 더 많이 해서 이런 오류들을 깔끔하게 잡고 출시해야겠다는 생각이 들었다.

혹시라고 초록잔디 앱에서 저 오류를 구현해보고 싶은 사람이 있다면, 위 사진의 999999999보다 많이 쳐야 오류가 구현된다.

크롤링

다음 업데이트 때 해당 오류를 해결하고자 생각하고 마음이 홀가분해지려던 도중, “어? 크롤링 해도 되나..?”라는 생각이 갑자기 들었다.

그래서 ‘잔디’ 앱을 개발하신 분께 깃허브 크롤링에 관련하여 여쭤보았다.

시원한 답변은 아니었지만, 그래도 메일 읽고서 바로 친절하게 답변주셨다!

도움 주신 ‘잔디’ 앱 개발자님께 감사 인사를 다시 한 번 드리고 싶다.

나는 이 답답한 심정을 어찌해야하나 싶었는데, 그 때 생각나는 것이 있었다.

바로 robots.txt였다.

바로 깃허브의 robots.txt를 확인해보았다.

다행히 초록잔디에서 크롤링하는 URL은 Disallow되어있지 않았다!

크롤링을 해도 괜찮다는 소리이다!

그래서 안심하고 배포를 중단하지 않았다 ㅎㅎ

이 앱 덕분에 robots.txt를 읽는 방법도 알았고, 크롤링 전에는 꼭 robots.txt를 확인해보아야 한다는 것도 알게 되었다.

앱스토어 3위

출시 후 앱스토어의 개발자 도구 부분에서 3위를 달성했다!

많은 분들이 초록잔디에 많은 관심을 보여주시고 다운로드해주신 덕분이다 :)

이 순위를 보고 나는 앞으로 더 좋은 앱을 개발해야겠다는 생각이 들었다.

(정말 기분이 좋았다 ㅎㅎ)

오픈소스

이 앱을 개발하면서 내가 가지고 있던 생각이 하나 있다.

내가 개발한 앱은 지금까지 항상 오픈소스가 아니었는데, 이번 앱 만큼은 오픈소스로 공개하고 싶다는 것이었다.

그래서 개발 초반에는 “이번 앱은 오픈소스로 공개해봐야지!”라는 마음을 강하게 가지고 개발하기 시작했다.

하지만 코드가 점점 더러워지기 시작했고, 그래서 나는 오픈소스를 포기했다.

정말 아쉬웠지만, 아쉬운 만큼 내 코드는 정말 더러웠다.

그래서 아직도 오픈소스로 공개하고 싶은 마음이 있다. 매우 강렬하게 있다.

만약 앞으로의 앱 업데이트를 통해 코드가 클린해진다면, 언제든 오픈소스로 공개할 예정이다.

빨리 코드 정돈해야겠다 ㅎㅎ

그래서

현재 앱은 App Store에서 ‘초록잔디’를 검색하거나, 여기를 눌러서도 다운받을 수 있다.

그리고 페이스북에서 “안드로이드는 앱이 없나요?”, “안드로이드도 출시해주시나요?”, “안드로이드도 써보고 싶은데 아쉽네요.”라는 댓글과 연락이 많이 오는데, 내가 안드로이드 개발자가 아니라서 iOS 앱만 출시한 점이 아쉽긴 하다.

그래서 현재 아는 안드로이드 개발자 분께 연락을 취해둔 상황이고, 개발을 시작하신 것 같다 ㅎㅎ

빠른 시일 내에 안드로이드 앱도 개발해서 세상에 선보이고 싶다.

작은 앱 하나지만, 많은 분들이 사랑해주시니 개발자로써 너무 기분이 좋았고, 좋은 경험이었던 것 같아서 앞으로 더 좋은 앱을 개발해야겠다는 생각이 많이 들었다.

마지막으로 앱을 사용하시는 모든 분들, 디자인해준 찬준이, 결정장애를 해결하준 창우, 그리고 이 글을 읽어주시는 여러분께 고맙다는 말을 전하고 마치겠다.

모두 고맙습니다 :)


본 Note를 공유하시려면?

여기를 눌러 링크 복사