본인은 현재 (2021.09~2021.12)까지 SeSac에서 iOS 개발 과정을 듣고 있다. 정말 운이 좋게 신청할 수 있었고, 정말 운이 좋게 합격을 하게 되었다. 합격수기와 현재까지의 회고는 개발썰에서 풀도록 하겠다. 이 글을 처음 읽으시는 분들을 위해 첨언을 하자면 본인은 이전에 개발 경험이 전혀 없고, 알고리즘 문제를 간단히 3개월 정도 공부해봤을 뿐이다. 까막눈이라고 보면 된다.
이 과정을 수료하기 위해 거쳐야 하는 많은 프로젝트 중에 온전한 앱을 만들어보는 첫번째 프로젝트는 개인 프로젝트이다. 1명이 기획, 디자인, 개발부터 출시까지 오롯이 맡아 진행하게 되는데, 단 2주의 기간이 주어진다. 업데이트, 마이그레이션 등에 추가로 1주가 주어진다. 그러니 총 3주라는 시간 동안 완성도 있는 앱을 만들어야 했다. 토이프로젝트인데 이제 토이가 애나벨인...?
선택에 기로에 섰다. 내가 그나마 잘 알고, 익숙한 기능들 위주로 구현을 할 수 있는 앱을 만들 것인가? 아주 도전적인 과제로 가득한 앱을 만들 것인가. 본인은 항상 챌린지를 선택하고 후회하는 타입이기 때문에 후자를 선택했다. 그렇게 나온 기획이 러닝 앱이다.
기획은 비교적 단순하게 시작했다. 내가 만들 러닝앱이 갖추었으면 하는 몇 가지 핵심 기능들을 추려보았다.
1. 달린 경로를 기록
2. 달린 거리를 기록
3. 달린 시간을 기록
4. 기록의 조회
이렇게 4가지는 러닝 앱의 핵심 기능으로 무조건 갖춰야 하는 스펙이었다. 그 이외의 기능은 MVP에는 크게 필요하지 않은 것으로 판단했다. 이 4가지 기능을 구현하기 위해 어떤 기술이 필요한지 생각해 보았다.
달린 경로를 기록하려면 먼저 지도가 필요하다. 본인은 일단 swift에서 기본적으로 제공하는 애플지도를 사용하기로 했다. 국내에서는 부족한 정보로 악명이 높지만, 린하게 시도해보고 싶었다. 더구나 러닝 경로를 표현하는데 주변 맛집 같은 정보는 불필요했다.
경로를 기록하려면 일단 사용자의 위치가 필요했다. 그에 따라 위치 권한을 표기하는 것도 필요할 것이다. 또 지나온 경로를 표시하기 위해서는 지도에 그림을 그려줘야 한다. 이 그림을 그려주는 기능을 어떻게 만들어 줄 것인가가 가장 희미했다.
그 다음으로 고려해야 할 것은 이동한 경로가 포함이 되는 영역만을 스크린샷으로 남기는 것 이었다. 이 부분은 스스로 로직을 짜서 해결하기 매우 어려운 부분이었다. 다행히도 7-8년 전 쓰여진 여러 좌표를 모두 포함하는 map의 region을 계산해 내는 로직을 찾게 되었고, 현재(2021) 사용이 가능하도록 응용해서 적용하게 되었다. 이 부분은 한국어 자료가 거의 없고 deprecated된 부분이 있어 최신 자료가 없었다. 후에 이 시리즈 내에서 별도로 언급할 예정이다!
위의 여러 기능을 구현하기 위해 추후 MapKit과 CoreLocation을 활용하게 된다. 사진을 찍는데는 MKMapSnapshotter를 활용했다.
달린 거리를 기록하는 것은 경로를 기록하면 쉽게 해결이 될 것 같았다. 지도상에 그려지는 선들의 길이(엄밀히 말하면 이동된 지점 간의 거리의 합산)를 미터로 환산해주면 쉽게 해결할 수 있을 것 같았다. 실제로 개발하는 과정에서도 이 방법을 사용했다.
거리를 기록하는데는 CoreLocation만 활용하였다.
시간은 유저가 시작을 누르는 순간부터 정지를 누르는 순간까지를 타이머로 보여주면 될 것이라고 생각했다. 굉장히 간단한 부분이라고 생각했는데 개발 과정에서 유저가 백그라운드에서 포어그라운드로, 포어그라운드에서 백그라운드로 앱을 활성화/비활성화하는 과정에서 어떻게 정확하게 시간을 측정할 것인가 하는 문제에 맞닥뜨리게 된다.
시간을 기록하는데는 별도의 라이브러리가 필요하지 않았다.
이 부분은 수업시간에도 반복적으로 많이 했었고, 깃 헙에 서툴었던 내가 여러 번 숙제를 날려먹는 과정에서 거의 10번 20번 반복하다 보니 제법 자신이 있는 부분이었다. 실제로 기획 과정에서도 크게 생각하지 않았고 소요 시간도 짧은 편이었다. 오히려 기록의 검색에서 애를 먹었고 현재도 답을 찾지 못한 부분이 있다.
기록 저장에는 Realm DB를 활용했다.
그 밖에 달리기를 시작 하기 전 유저의 위치를 기반으로 날씨를 보여주는 스펙을 넣고 싶었고, 프로필을 저장하게 해주고 싶었다. 뭔가 동기부여가 되지 않을까 해서. 날씨를 보여주는 데는 Alamofire와 SwiftyJSON, Kingfisher가 사용되었다.
출시를 마치고 나니 부족한 점이 너무 많았다. 백그라운드에서 타이머가 제대로 동작하지 않는 점, 장시간 백그라운드에서 경로를 추적할 때 다시 포어그라운드로 돌아오면 앱이 심하게 버벅거리거나 터져버리는 현상, 제자리에 있는데도 이동 거리가 계산되는 등 아직 갈길이 매우 먼 앱이다.
+) 위의 현상들은 LocationManager의 distanceFilter와 CMMotionActivity 를 복합적으로 사용해서 해결하였다. 국내 러닝 앱과 NRC를 보면서 계속 기준을 바꿔 나갔는데, 수정 이후 국내 출시 앱들보다는 더 정확하며, NRC와 비슷한 수치로 측정이 됨을 알 수 있었다! 수정한 1.1버전이 심사를 기다리고 있다. 자비로우신 많은 분들의 기도가 필요하다.
그럼에도 참 다행이라고 생각하는 것은 뛰어나고 인류애가 많은 전세계의 훌륭한 프로그래머, 코더 들이 남긴 정보로 이 문제들을 충분히 해결할 수 있다는 점이다! 또한 SeSac 프로그램에 속해있으니 멘토님들의 조언을 가까이에서 구할 수 있다는 특혜를 받고 있다. 앱 개발을 하기에 지금처럼 좋은 환경은 또 없을 것 같다.
글을 쓰는 현재는 앱 출시가 마무리 되었지만, 아직 개발 중인 기능들이 많다. 그래도 앱스토어에 내 이름 석자(?) 들어간 앱이 출시되었다는 그 자체로 뿌듯하기도 하고, 신기하기도 하다. 아직 부끄러워서 주변에 받아달라고는 못했다. 개선이 되는 대로 열심히 홍보해볼까 싶다!
다음 편에서는 이제 각각의 기능을 어떻게 구현했고, 어디서 어떤 정보들을 얻었는지를 써보려고 한다. 아직 이 앱은 개선의 여지가 많기 때문에, 즉 아직 허접하기 때문에 더 좋은 방법도 많을 것이다. 전적으로 초보인 내 글을 신뢰하기보다는 이런 방법도 있구나 하는 정도로 봐주셨으면 좋겠다. 아무래도 지도 부분이 앱 구현의 주된 기능인 경우가 많지는 않아서 국내 자료로는 아주 많이 부족했다. 문제를 해결하는 과정에서 찾아본 양질의 정보들 또한 이미 시간이 오래 지나 deprecated 된 경우가 있었다. 이를 수정하고 적용하는 데 많은 시간이 걸렸기 때문에 다른 분들은 나처럼 삽질을 하지 않으셨으면 한다!
러닝 앱 개발기 (3) - Firebase Crashlytics를 활용해 유저의 사용성을 높여보자 (feat.출시 앱 관리하기) (0) | 2022.02.23 |
---|---|
러닝 앱 개발기 (2) - CMMotionActivity를 활용해 사용자의 모션을 감지하기 (5) | 2021.12.09 |
러닝 앱 개발기 (1) - 달린 경로를 기록하기 (0) | 2021.12.09 |