새싹에 합격하고 힘차게 달려오다보니 출시 프로젝트를 결국엔 마주하게 되었고, 결국 출시까지 완료하게 되었다!!
https://apps.apple.com/kr/app/dailypin-장소일기/id6470025950
💡 기획
어떠한 앱을 만들면 좋을까..
루틴 관리 어플을 만들까 고민도 해봤지만, API 통신 기능을 사용하고 싶었기 때문에 다른 주제를 고민하게 되었다.
평소 나의 추억들을 기록하는 것을 좋아한다.
여행을 다녀오거나 한 달 동안 다녀온 곳, 먹은 것 등을 블로그에 기록하고 종종 꺼내보기 때문에 기록 관련 어플이 좋지 않을까 생각했다.
오래 전 일을 기록을 하다보면 내가 이 날 정확히 어디에 갔는지 기억하기는 쉽지 않다. 그래서 그냥 간편하게 내가 오늘 어디를 다녀왔는지 기록할 수 있는 어플이 있으면 좋겠다는 생각을 하게되었다.
그렇게 주제를 장소 기록 어플로 정하게 되었고, 디테일한 요구사항을 정의하였다.
메인 화면은 지도 화면으로 해서 검색 화면, 달력 화면, 기록 화면으로 이동할 수 있는 구조이다.
기획은 처음이고, 디자인 감도 잡히지 않아서 기획 단계에서 화면 구성하는 것이 꽤 힘들었다.
비슷한 기존 어플을 여러개 설치하여 구경하면서 화면 구성을 결정하게 되었다.
📝 화면 별 기능
메인 지도 화면
- 메인 화면은 MapKit을 이용하여 지도를 볼 수 있다.
- 기록한 장소가 있다면 지도에 핀을 찍고, 해당 핀에 기록된 기록을 볼 수 있다.
- 원하는 위치을 길게 누르면 Google Geocoding API를 통해 주소로 변환하여 기록을 등록할 수 있다.
- 검색 화면으로 이동할 수 있다.
- 달력 화면으로 이동할 수 있다.
검색 화면
- Google Place API를 활용하여 키워드를 이용하여 검색한다.
- 검색 결과는 Diffable DataSource CollectionView를 사용하여 리스트 형태로 보여준다.
- 원하는 장소를 선택하면 메인 화면에서 장소를 볼 수 있다.
달력 화면
- 등록된 기록을 바탕으로 날짜 별로 기록을 볼 수 있다.
- 기록을 선택하여 작성된 기록 화면으로 넘어갈 수 있다.
기록 열람 화면
- 기록을 작성하거나 저장 또는 삭제를 할 수 있다.
개발 목표
- MVVM 패턴 적용하기
- API통신에 Router 패턴 적용하기
- Diffable DataSource
- 모듈화
💻 개발
MVVM
MVVM 패턴을 적용하기 위해 Observable을 생성하고, 비즈니스 로직을 분리하기 위해 꽤 많은 시간을 사용했다. 과연 내가 적용한 방식이 맞는 것인지는 모르겠지만, 아직 배우는 과정이니 단순히 비즈니스 로직을 분리하는 것 부터 시작하였다.
- 데이터를 가공하는 등의 비즈니스 로직은 ViewModel에 구현하기
- ViewModel은 UIKit을 import 해서는 안된다.
최소한 이 두 가지의 규칙에 맞게 MVVM 패턴을 적용하려 하였다.
최소 버전 iOS 15
iOS15와 16 버전에 큰 차이가 없다는 이야기를 듣고 이왕 할거면 iOS 15부터 대응해보자! 하는 결심으로 iOS 15로 대응하며 개발하고 있었다.
UIPageSheetPageController를 사용하여 화면의 반 보다 낮은 높이를 차지하는 뷰를 띄우려는 계획을 하였지만 높이 커스텀은 iOS 16부터 가능했고..
최소 버전을 올릴까 많은 고민을 했지만, FloatingPanel이라는 오픈소스 라이브러리가 있었기 때문에 처음 계획대로 iOS 15버전 대응을 그대로 이어가기로 했다.
Diffable DataSource CollectionView
출시 프로젝트 시작 직전에 과정에서 배운 Diffable DataSource를 활용하여 CollectionView를 구현하기로 하였다.
기존의 CollectionViewDataSource를 사용하면 데이터의 변화가 생겨 셀이 생성되거나 삭제될 때 매번 reloadData를 호출하여 업데이트를 해야했지만, Diffable DataSource를 활용하면 SnapShot을 통해 이전 데이터화 현재 데이터를 비교하여 apply 작업을 통해 변경된 부분을 apply를 한다는 장점이 있다.
DB에 접근하여 기록을 삭제하거나 등록한 후 데이터를 조회하는 경우가 많기 때문에 Diffable DataSource를 사용하여 업데이트 시 좀 더 자연스럽게 변경될 수 있도록 하였다.
RouterPatern
두 종류의 API를 사용하기 때문에 여러 API가 공통 파일을 통해 네트워크 통신을 할 수 있도록 Router 패턴을 사용하여 구현하였다. URLRequestConvertible로 HTTP 메서드, 헤더, 쿼리 등을 캡슐화 하여 URLRequest를 전달한다.
💡 업데이트
최소한의 기능만 구현 후 출시를 하였다. 더 많은 기능을 구현하게 되면 출시 기간이 무한대로 늘어날 것만 같아서 수 많은 갈등을 제껴두고 일단은 출시를 하게 되었다.
기록에 사진도 기록할 수 있는 기능과, 기록 화면에서 해당 기록에 선택 된 장소의 위치를 지도에서 확인할 수 있는 기능, 기록하고 있는 장소를 변경할 수 있는 기능을 더 구현하고 싶다.
기능 부분 뿐만아니라 코드적으로 개선이 필요하다고 생각한다. 모듈화, 메모리 누수, 불필요한 반복 등 코드를 더 개선해보고 싶다.
✍🏻 회고
- 첫 앱을 출시를 하기 위해 개발하면서 생각보다 고려해야 할 요소가 굉장히 많다는 것을 새삼 깨달았다. 생각보다 고려해야 할 예외 사항들이 많았다. 다양한 예외처리를 구현하고, 화면 전환 시 값 전달과 업데이트 등 깊게 생각해야 할 요소들이 많았다.
- 기획 단계에서 내가 매우 부족했음을 깨달았다. UI 구성도 잘 떠오르지 않아서 대략적인 스토리보드만 그렸더니 계속해서 수정하는 일이 발생했고, 필요한 기능이지만 기획 단계에서 놓쳐버린 기능들도 많았다.
- 메모리 누수에 관련하여 잘 대응을 하지 못한 것 같다. 클로저 구문을 많이 사용하기 때문에 많은 메모리 누수가 있을 것 같은데 해당 부분에서도 더 공부하여 업데이트를 해야겠다는 생각을 하게 되었다. 내 어플이 무거운 어플이 되지 않길 바라며..
과연 내가 해낼 수 있을지 매우 불안했지만, 멘토님들의 도움 덕분에 많은 문제들을 해결하고 무사히 출시까지 할 수 있었던 것 같다.🥹
많은 도움을 주셔서 정말이지 감사합니다🙇♀️
내 멘탈 케어에 도움을 주신 분께도 무한한 감사를 보냅니다🙇♀️
새싹 덕분에 많이 배우고 출시까지 할 수 있어서 아주아주 뜻 깊은 시간이 되었다! 덕분에 내 개발 능력도 꽤 성장했을지도?^^
더더욱 열심히 공부하고 멋진 iOS 개발자가 되는 그 날 까지 모두 화이팅😆
'iOS > 🌱 SeSAC' 카테고리의 다른 글
23.11.03 금 (1) | 2023.11.04 |
---|---|
23.11.02 목 (0) | 2023.11.03 |
23.11.01 수 (1) | 2023.11.01 |
23.10.31 화 (0) | 2023.11.01 |
23.09.01 금 (0) | 2023.09.01 |