Skip to content

기술적 도전

JISU LEE 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을 채택했습니다.