diff --git "a/_posts/android/2022-01-27-\353\221\220\353\262\210-\354\247\270-\354\225\210\353\223\234\353\241\234\354\235\264\353\223\234-\354\225\261-\352\260\234\353\260\234-\355\233\204\352\270\260_\354\233\220\354\213\240-\353\240\210\354\247\204-\354\234\204\354\240\257.md" "b/_posts/android/2022-01-27-\353\221\220\353\262\210-\354\247\270-\354\225\210\353\223\234\353\241\234\354\235\264\353\223\234-\354\225\261-\352\260\234\353\260\234-\355\233\204\352\270\260_\354\233\220\354\213\240-\353\240\210\354\247\204-\354\234\204\354\240\257.md" new file mode 100644 index 000000000000..fc8dd87c0243 --- /dev/null +++ "b/_posts/android/2022-01-27-\353\221\220\353\262\210-\354\247\270-\354\225\210\353\223\234\353\241\234\354\235\264\353\223\234-\354\225\261-\352\260\234\353\260\234-\355\233\204\352\270\260_\354\233\220\354\213\240-\353\240\210\354\247\204-\354\234\204\354\240\257.md" @@ -0,0 +1,126 @@ +--- +categories: + - Android +tags: + - Kotlin + - Android +--- + + + + + + + +이번에는 최근 플레이하고 있는 크로스 플랫폼 게임, 원신의 유틸리티성 앱을 개발했습니다. + +사용자들의 니즈를 반영해서 현재도 활발히 업데이트 중으로, 앱을 개발하며 느낀 점을 적어보려고 합니다. + + + +해당 앱은 [깃 허브](https://github.com/danggai/android_genshin_resin_widget)와 [플레이 스토어](https://play.google.com/store/apps/details?id=danggai.app.resinwidget)에서 확인 할 수 있습니다. + + + + + +# Why + +> 왜 이 앱을 개발했는가? + +게임 특성 상, 시간 당 충전 재화인 '레진'은 굉장히 귀한 재화입니다. + + + +해당 재화를 확인하기 위해서는 게임에 접속하거나, 관련 공식 앱을 실행하여 찾아봐야만 하는 + +일련의 과정이 너무 번거로웠고, 언제든 편하게 확인할 수 있는 경로를 새로 만들고 싶었습니다. + + + +그 와중에 iOS에서 사용자들이 연구해서 위젯으로 볼 수 있도록 개발한 결과물을 보게되었고, + +안드로이드에서도 이렇게 볼 수 있으면 정말 좋을텐데, 하는 생각에 개발했습니다. + + + +물론 제가 쓰기 위해서가 큽니다. :) + + + + + +# How + +> 어떤 환경에서, 어떤 패턴으로 개발했는가? + +Android에서 Kotlin, Rx, Koin, Retrofit2를 사용해서 개발했습니다. + +MVVM패턴을 사용하였고, DataBinding을 통해 글루 코드들을 줄이는 방향과 각 함수들을 캡슐화 할 수 있도록 노력했습니다. + + + + + + + +# When + +> 개발에 걸린 기간은? + +프로젝트 생성 일은 2021년 10월 25일, 첫 앱 개시 일은 2021년 11월 2일로 + +앱 자체의 핵심 기능인 '레진 확인'은 일주일만에 개발이 진행되어 빠르게 핵심 기능만으로 배포할 수 있었습니다. + + + +현재는 여러가지 편의 기능들을 넓게 구현하는데 집중하고 있습니다. + + + +현재는 자동 출석 체크, 여러 위젯 타입 지원, 위젯 디자인, 여러 알림 등 + +다양한 편의 기능 및 커스터마이징을 지원하기 위해 현재까지도 노력하고 있습니다. + + + + + + + + + +## 구현 간 예상과 달랐던 점 + +> 타 사의 API를 사용함 + +제가 직접 만든 API가 아닌, 미호요사의 API를 분석하고 이용하는 것에 가까웠기에 + +언제 Base URL이 바뀔 지 모르는 일이거나, 특정 Parameter이 생기거나 사라질 수 있다는 점을 주목할 필요가 있었습니다. + + + + + +> 매일 같은 시간에 동작해야하는 동작 + +또한, 매일 같은 시간에 반드시 동작해야 하는 기능(자동 출석체크)을 구현하기 위해 Worker을 통해 Background에서 진행하는 방식을 택한 점이 아쉽습니다. + +현재는 Alarm Manager을 통해 호출하고, Foreground Service를 새로 호출하는 방식으로 리팩터링을 진행했습니다. + +Background에서 반드시 특정 시간에 동작해야하는 기능을 구현 할 경우, 기기의 상태가 여러가지 변수로 작용하여 해당 작업들이 원하는 시간에 동작하지 않음을 알 수 있었습니다. + + + + + +> Worker을 제거 할 때 + +지난 버전에서 구현 된 Worker이 더 이상 다음 버전에서 필요 없을 경우, 단순히 클래스를 제거하는 형태로 배포 시 + +기존 Worker이 작동 된 기기에서 업데이트가 되면 `org.koin.core.scope.Scope.throwDefinitionNotFound`이 발생했습니다. + + + +중간에 버퍼 역할을 해주는 버전을 배포하여, Worker을 정상적으로 제거 후 다음 버전에서 삭제하는 방식으로, 두 버전을 거쳐 배포하는 방법을 고려해봐야 함을 알았습니다. +