Skip to content

기술적 도전

modyhoon edited this page Dec 5, 2021 · 4 revisions

Coordinator 를 사용한 MVVM-C 패턴 적용

  • 🏗️ ViewController가 비대해지는 문제를 해결하고, 유지보수에 용이하며, 테스트 가능한 구조를 설계하고자 MVVM-C 패턴을 선택하였습니다.

  • 테스트 가능한 구조가 되기 위해서는 ViewController 외부에서의 의존성 주입이 필요하였고, 항상 화면 맨 위에 띄워지는 하차 알람 인디케이터를 구현하기 위해서는 여러 개의 UIWindow 관리도 필요했습니다.

  • Usecase, ViewModel 등을 주입해주고, Window 관리와 화면 전환을 담당하는 Coordinator 두어 객체 간 책임을 분리하고 테스트 가능한 구조가 되도록 하였습니다.

공공 API 트래픽 제한 문제 해결

  • 🔑 공공 API에는 하루 1000번이라는 트래픽 제한이 있어 이 문제를 해결하기 위해 두 가지 방법을 사용하였습니다.

    • 첫째로 가능한 여러개의 AccessKey를 사용하여, 반환된 결과가 한도 초과일 시 다른 AccessKey로 API를 재요청 하도록하였습니다.

    • 둘째로 고정적인 데이터는 저장된 파일을 ****사용하고, Protocol을 사용해 추후 API 사용으로의 변경이 쉽도록 구조를 설계하였습니다.

Combine을 통한 비동기 로직 처리

  • 🪡 비동기 코드를 효율적으로 관리하기 위해 Combine을 사용하였습니다.

  • 잦은 API 요청 은 많은 비동기 작업으로 이어졌고, 비동기 그리고 뷰와 모델 간의 연결을 보다 간결하게 표현하는 것이 필요하였습니다.

  • 그래서 Combine 의 여러 Operator들을 사용해 데이터를 정제하는 과정을 물 흐르듯 표현하고, 공통적인 부분들은 Operator를 커스텀하여 사용함으로써 중복 로직을 줄이고 코드의 가독성을 향상시킬 수 있었습니다.

실시간 데이터를 위한 Timer

  • ⏰ 매초 버스 도착정보가 흐르는 시간처럼 보이도록, 그리고 30초마다 자동으로 데이터를 갱신하도록 하기 위해 Timer를 사용하였습니다.

  • 공공 API가 주는 데이터로는 시간이 흐르고 있다는 것을 표현하기 어려웠고, 주기적으로 도착 정보를 갱신해 주어야 UX 측면에서 이점을 얻을 수 있다고 생각하였습니다.

  • Timer를 사용하여 NotificationCenter의 post 요청을 보내고, 각 noti를 받은 ViewModel들은 적절한 값을 처리한 뒤 Combine의 바인딩을 통해 뷰에 즉각 반영합니다.

CoreLocation 을 통한 GPS 정보를 활용한 승하차 추적 서비스

  • 🗺️ 사용자가 탑승한 버스를 추적하고자 CoreLocation 기술을 사용하여 사용자의 버스 승차 여부를 판별하였습니다.

  • 앱이 Foreground에서 벗어나더라도 주기적으로 사용자의 위치를 파악하고자 하였습니다.

  • Background Modes로 설정하여 현재 위치를 주기적으로 받을 수 있고, API 또한 주기적으로 요청하여 Background에서도 정확한 버스 추적이 가능하였습니다.

스토리보드 없이 Programmatically View 사용

  • 📖 Storyboard 를 제거한 채 온전히 Code 만으로 화면 UI 를 작성하였습니다.

  • 버스 위치 표시와 같이 runtime에 뷰를 생성﹒제거할 수 있는 방법이 필요하였고, 뷰 관련 코드의 응집도를 높이고자 하였습니다.

  • 따라서 온전히 Code만으로 구현하였고, 반복되어 사용되는 View를 CustomView로 분리하여 재사용성을 높였습니다.

외부 라이브러리 NO

  • 🚫 외부 라이브러리를 일절 사용하지 않았으며, 네트워크 레이어 또한 URL SessionCombine만을 사용해 직접 설계하였습니다.

  • 외부 라이브러리에 의존하여 개발할 경우 라이브러리의 취약점은 곧 앱 동작의 취약으로 이어질 것이며, 이에 대한 해결도 라이브러리의 패치에 의존해야 하므로 유지보수 또한 어려워질 것 입니다.

  • 단순히 편의를 위해 외부 라이브러리를 가져다 쓰는 것을 지양하고, 내부 동작을 완벽히 이해하여 책임 질 수 있는 코드를 작성하고자 노력하였습니다.

Github Action을 활용한 CI 배포

  • 🤖 협업한 코드를 workflow로 다루기 위해 github action을 사용했습니다.

  • 원격에서 merge된 코드는 빌드가 잘 되는지, 테스트 케이스를 통과 하는지 검증하기 어려웠습니다.

  • 따라서 저희는 특정 trigger에 의해 수행되는 코드를 지정할 수 있게 해주는 github action을 채택했습니다.