-
Notifications
You must be signed in to change notification settings - Fork 10
기술적 도전
-
🏗️ ViewController가 비대해지는 문제를 해결하고, 유지보수에 용이하며, 테스트 가능한 구조를 설계하고자
MVVM-C
패턴을 선택하였습니다. -
테스트 가능한 구조가 되기 위해서는 ViewController 외부에서의 의존성 주입이 필요하였고, 항상 화면 맨 위에 띄워지는 하차 알람 인디케이터를 구현하기 위해서는 여러 개의 UIWindow 관리도 필요했습니다.
-
Usecase, ViewModel 등을 주입해주고, Window 관리와 화면 전환을 담당하는
Coordinator
두어 객체 간 책임을 분리하고 테스트 가능한 구조가 되도록 하였습니다.
-
🔑 공공 API에는 하루 1000번이라는 트래픽 제한이 있어 이 문제를 해결하기 위해 두 가지 방법을 사용하였습니다.
-
첫째로 가능한
여러개의 AccessKey
를 사용하여, 반환된 결과가 한도 초과일 시 다른 AccessKey로 API를 재요청 하도록하였습니다. -
둘째로 고정적인 데이터는
저장된 파일
을 ****사용하고, Protocol을 사용해 추후 API 사용으로의변경이 쉽도록
구조를 설계하였습니다.
-
-
🪡 비동기 코드를 효율적으로 관리하기 위해
Combine
을 사용하였습니다. -
잦은
API 요청
은 많은 비동기 작업으로 이어졌고, 비동기 그리고 뷰와 모델 간의 연결을 보다 간결하게 표현하는 것이 필요하였습니다. -
그래서
Combine
의 여러Operator
들을 사용해 데이터를 정제하는 과정을 물 흐르듯 표현하고, 공통적인 부분들은Operator
를 커스텀하여 사용함으로써 중복 로직을 줄이고 코드의 가독성을 향상시킬 수 있었습니다.
-
⏰ 매초 버스 도착정보가 흐르는 시간처럼 보이도록, 그리고 30초마다 자동으로 데이터를 갱신하도록 하기 위해
Timer
를 사용하였습니다. -
공공 API가 주는 데이터로는 시간이 흐르고 있다는 것을 표현하기 어려웠고, 주기적으로 도착 정보를 갱신해 주어야 UX 측면에서 이점을 얻을 수 있다고 생각하였습니다.
-
Timer
를 사용하여 NotificationCenter의 post 요청을 보내고, 각 noti를 받은 ViewModel들은 적절한 값을 처리한 뒤 Combine의 바인딩을 통해 뷰에 즉각 반영합니다.
-
🗺️ 사용자가 탑승한 버스를 추적하고자
CoreLocation
기술을 사용하여 사용자의 버스 승차 여부를 판별하였습니다. -
앱이 Foreground에서 벗어나더라도 주기적으로 사용자의 위치를 파악하고자 하였습니다.
-
Background Modes로 설정하여 현재 위치를 주기적으로 받을 수 있고, API 또한 주기적으로 요청하여 Background에서도 정확한 버스 추적이 가능하였습니다.
-
📖
Storyboard 를 제거
한 채 온전히 Code 만으로 화면 UI 를 작성하였습니다. -
버스 위치 표시와 같이
runtime
에 뷰를 생성﹒제거할 수 있는 방법이 필요하였고, 뷰 관련 코드의 응집도를 높이고자 하였습니다. -
따라서 온전히 Code만으로 구현하였고, 반복되어 사용되는 View를 CustomView로 분리하여
재사용성
을 높였습니다.
-
🚫 외부 라이브러리를 일절 사용하지 않았으며, 네트워크 레이어 또한
URL Session
과Combine
만을 사용해 직접 설계하였습니다. -
외부 라이브러리에 의존하여 개발할 경우 라이브러리의 취약점은 곧 앱 동작의 취약으로 이어질 것이며, 이에 대한 해결도 라이브러리의 패치에 의존해야 하므로 유지보수 또한 어려워질 것 입니다.
-
단순히 편의를 위해 외부 라이브러리를 가져다 쓰는 것을 지양하고, 내부 동작을 완벽히 이해하여
책임 질 수 있는 코드
를 작성하고자 노력하였습니다.
-
🤖 협업한 코드를 workflow로 다루기 위해
github action
을 사용했습니다. -
원격에서 merge된 코드는 빌드가 잘 되는지, 테스트 케이스를 통과 하는지 검증하기 어려웠습니다.
-
따라서 저희는 특정 trigger에 의해 수행되는 코드를 지정할 수 있게 해주는 github action을 채택했습니다.
S002_강민상 | S013_김태훈 | S045_이지수 | S057_최수정 |
---|---|---|---|
@FreeDeveloper97 | Modyhoon | tmfrlrkvlek | sujeong000 |