Search
📱

안드로이드 기술 스택

날짜
2024/07/11
파트
안드로이드
서기
블로그 업로드 여부

사용 기술

Android Studio
Gradle
MVVM
Glide
MockK
JUnit 4, JUnit 5
Espresso
OkHttp3 & Retrofit2
Kotlin Coroutines
Jetpack
Data Binding : Jetpack
ViewModel(Android Architecture Components) : Jetpack
DataStore : Jetpack
LiveData : Jetpack
Navigation : Jetpack
RecyclerView: Jetpack

사용 이유

Android Studio

위치 기반 기능 구현, 푸시 알림, 갤러리와 같은 하드웨어의 기능을 쉽게 활용하며 언제든 손쉽게 접근할 수 있는 모바일 서비스를 선택했다.
cross platform 보다 높은 성능과 효율적으로 스마트폰의 리소스를 사용하기 위해 native platform 선택하였다.
native platform 중 안드로이드 운영체제는 대한민국에서 가장 높은 시장 점유율을(2024년 기준 73.64%) 을 보유하고 있기 때문에 더 넓은 수요층에게 접근 가능
안드로이드 애플리케이션 개발에 최적화된 통합 개발 환경(IDE)인 Android Studio 를 선택했다.

Gradle

Gradle은 Android Studio와 함께 사용되는 빌드 시스템으로, 프로젝트의 의존성을 관리하고 빌드 과정을 자동화하는 데 도움을 준다.
1.
가독성: 코딩에 의한 간결한 정의가 가능하므로 Maven보다 스크립트의 가독성이 높다.
2.
구조적인 장점: Build Script를 Groovy 기반의 DSL(Domain Specific Language)를 사용하여 코드로서 설정 정보를 구성하므로 구조적인 장점이 있다.
3.
편리함: Gradle 설치 없이 Gradle wrapper를 이용하여 빌드를 지원한다.
4.
성능: 빌드와 테스트 실행 결과가 Maven보다 더 빠르고, Gradle은 캐시를 사용하기에 반복 시 차이가 더 커진다.
[참고 레퍼런스]

MVVM

MVC (Model View Controller): MVC는 모델(Model), 뷰(View), 컨트롤러(Controller)로 구성되며, UI와 비즈니스 로직을 분리하는데 주로 사용된다. 컨트롤러에서 뷰를 직접 조작하는 의존성 분리가 되지 않으며 Controller의 복잡성이 증가할 수 있다.
MVP (Model View Presenter): MVP는 모델(Model), 뷰(View), 프리젠터(Presenter)로 구성되며, MVC의 한계를 극복하기 위해 개발되었다. 모델은 데이터와 비즈니스 로직을 담당하고, 뷰는 화면 표현을 담당하며, 프레젠터(Presenter)는 뷰와 모델 간의 중개자 역할을 한다. MVP는 테스트 용이성을 높이고, 뷰와 로직을 분리하여 유지보수를 쉽게 만든다. View와 Presenter 사이의 결합도를 줄이고, 비즈니스 로직을 Presenter로 이동함으로써 Controller의 문제점을 해결한다. 그러나 Presenter는 시간이 지남에 따라 복잡해질 수 있고, 더 많은 인터페이스와 메서드가 필요하므로 추가 비즈니스 로직을 수용하기 쉽지 않다는 단점이 있다.
MVVM (Model View ViewModel): MVVM은 모델(Model), 뷰(View), 뷰모델(ViewModel)로 구성되며, 바인딩을 사용하여 뷰와 뷰모델(ViewModel)을 연결하는 아키텍처 패턴이다. MVVM은 데이터 바인딩을 사용하여 View와 ViewModel을 바인딩하고, ViewModel이 Model과 상호작용하여 View에 반영한다. 이로써 비즈니스 로직(Model)과 UI를 분리하면서도 UI 요소와 데이터의 동기화를 통해 뷰(View)와 모델(Model)을 연결하는 코드의 양을 줄여 UI 업데이트를 간편하게 관리하고, 테스트 용이성을 높이는데 도움을 준다. Data Binding, Live Data와의 호환성도 좋다.

Glide

구글이 공개를 한 이미지 라이브러리이므로 유지보수성과 신뢰성이 높다.
사용 방법이 간단하다.
이미지 로딩 속도가 빠르다.
URL 이미지 로딩이 가능하다.
Picasso와 달리 실시간으로 리사이징하지 않기 때문에 메모리 사용량이 적다.
[참고 레퍼런스]

MockK

kotlin의 단위테스트를 쉽게 작성할 수 있게 해주는 모킹 라이브러리로는 MockK와 Mockito가 있다. 해당 라이브러리들을 통해 테스트 코드 작성 시 유연성과 생산성을 높일 수 있다. 이때 Mockito가 아닌MockK를 선정한 이유는 다음과 같다.
1.
First class support for Kotlin features (Kotlin 기능에 대한 최고 수준의 지원)
2.
A pure Kotlin-mocking DSL for writing clean and idiomatic Kotlin code(깔끔하고 관용적인 Kotlin 코드 작성을 위한 순수 Kotlin 모방 DSL)
3.
Mocking support for final classes and methods(최종 클래스 및 메서드에 대한 모킹 지원 )
4.
Coroutine support by default(기본적으로 코루틴 지원)
[참고 레퍼런스]

JUnit 4, JUnit 5

JUnit은 자바와 코틀린에서 널리 사용되는 테스트 프레임워크이다. 테스트 작성 및 실행이 간편하여 안드로이드 애플리케이션 개발에 필수적이다.

Espresso

안드로이드 공식 UI테스트 프레임워크로, 간단하고 직관적인 API를 제공하여 테스트를 쉽게 작성하고 실행할 수 있게 해준다.

OkHttp3 & Retrofit2

1. OkHttp 란?
OkHttp는 Square에 의해 개발된 오픈 소스 HTTP 클라이언트 라이브러리입니다. REST API 및 서버와 HTTP 기반의 클라이언트의 요청과 응답에 편의성 제공을 위한 라이브러리 입니다. HTTP와 HTTP/2의 최신 기능을 지원합니다. Java와 Kotlin, 그리고 Android와 같은 JVM 기반 시스템에서 동작합니다.
2. Retrofit란?
Square에서 개발한 라이브러리로, HTTP API를 Kotlin 혹은 Java 인터페이스로 매핑하는 역할을 합니다. 내부적으로 OkHttp를 사용하며, 간편한 API 선언 및 JSON/XML 파싱을 위한 플러그인을 지원합니다.
3. OkHttp 와 Retrofit 비교분석
OkHttp와 Retrofit은 모두 HTTP 클라이언트 라이브러리이지만, 사용 방식과 목적에서 차이점이 있습니다.
OkHttp는 저수준 HTTP 클라이언트 라이브러리로, HTTP 요청과 응답을 생성하고 처리하는 기본 기능을 제공합니다. OkHttp를 사용하면 HTTP 헤더, 바디 등의 세부 사항을 수동으로 제어할 수 있으며, 요청 및 응답에 대한 세밀한 제어가 가능합니다.
Retrofit은 상위 수준의 REST 클라이언트 라이브러리로, HTTP API를 Kotlin 또는 Java 인터페이스로 매핑하는데 초점을 두고 있습니다. 이로 인해 Retrofit는 복잡한 HTTP 요청을 단순화하고, 코드의 가독성을 높이며, 코드 중복을 줄일 수 있습니다. 기본적으로 Retrofit은 OkHttp를 내부적으로 사용하여 실제 HTTP 요청을 수행합니다.
Retrofit을 사용하는 이유는 OkHttp와 비교하여 HTTP 통신을 추상화하여 코드를 더 깔끔하게 작성할 수 있게 해주기 때문이다. OkHttp와 함께 사용한다면, 반복적으로 API의 헤더에 사용자 정보 등을 넣는 작업을 Interceptor을 활용할 수 있는 OkHttp client 의 옵션을 커스텀하는 장점이 있기에 OkHttp와 Retrofit을 함께 사용한다.
[참고 레퍼런스]

kotlin-Serialization

Gson에 비해 코틀린의 코루틴, 널 안정성, 데이터 클래스 등의 기능을 더 잘 지원하기 때문에, 코틀린을 주로 사용하는 프로젝트의 경우 Gson보다 kotlin-serialization이 더 자연스러운 선택이 될 수 있다.
1.
널 안정성과 Default-Argument 지원
2.
kotlin 100%
100% Kotlin 으로 만들어져있고,  JetBrain이 공식적으로 지원하는 라이브러리이기에 Kotlin에서 보다 강력한 기능과 확장성을 제공
3.
쉽게 커스터마이징 가능
Json Option 으로 개발자가 원하는 기능을 쉽게 추가할 수 있다.

Kotlin Coroutines

비동기 코드를 간단하고 직관적으로 작성할 수 있으며, 자바 라이브러리와도 잘 호환된다. 네트워크 호출이나 데이터 I/O와 같은 오래 걸리는 작업을 비동기적으로 수행하기 위해 사용한다.
메모리 누수 및 블라킹 방지 등 효율적인 Context Switching을 위해 Coroutine을 사용합니다.

Jetpack

Android Application 개발 시 구글에서 권장하는 Jetpack 라이브러리
ViewModel, Navigation, Flow, LiveData, Work Manager, Data Store, DataBinding 등을 포함하는 Android Jetpack 라이브러리 활용
쉽고 빠른 화면 구성을 위해 Jetpack 라이브러리를 사용했습니다.
[참고 레퍼런스]

Data Binding : Jetpack

데이터와 UI를 연결하는 작업을 레이아웃(.xml)에서 처리하는 기술
데이터바인딩을 사용할 경우 xml에서 데이터를 직접 설정할 수 있기 때문에 코드가 간결해진다.

ViewModel(Android Architecture Components) : Jetpack

ViewModel은 안드로이드 아키텍처 컴포넌트(AAC)의 일부로 UI 관련 데이터를 저장하고 관리하는 역할을 한다. 이 데이터는 화면 회전과 같은 구성 변경이 발생해도 유지된다. 즉, ViewModel을 사용하면 사용자에게 지속적으로 일관된 데이터를 보여줄 수 있다. 이외에도 UI 컨트롤러(액티비티, 프래그먼트)와의 생명 주기와 독립적이기 때문에 메모리 누수를 방지하며, viewModelScope를 사용하여 코루틴을 통한 비동기 작업을 쉽게 처리할 수 있다.
또한, ViewModel이 액티비티나 프래그먼트보다 긴 생명주기를 가지므로 데이터 손실을 방지하여 사용자가 앱을 사용하는 동안 중요한 데이터는 안전하게 보존되어 다음 세션에서도 사용할 수 있습니다. 애플리케이션에서 데이터 손실을 방지하고 개발 과정을 단순화하는 데 큰 도움이 됩니다.

Preferences DataStore : Jetpack

현재 앱에서 저장해야하는 데이터의 양이 작고 1:1의 관계(key-value)를 가지기 때문에 room이나 SQLite보다는 SharedPreferences 또는 Preferences DataStore을 채택하는 것이 리소스면에서 합리적이다.
DataStore는 SharedPreferences를 대체하기 위해 Jetpack에서 발표한 라이브러리다. SharedPreferences와 다르게 DataStore은 runtime exception으로부터 안전하고 실제 작업을 UI Thread가 아닌 DisPatcher.IO로 이동해서 하기에 안전하다. 그리고 더 간단하고 편리한 사용성을 가졌다.
코틀린 코루틴을 활용하여 비동기적으로 데이터 저장 및 읽기를 처리할 수 있으므로 앱의 성능을 유지할 수 있다.
Kotlin coroutine과 Flow를 사용하여 비동기적으로일관되게 데이터를 저장할 수 있다.
[참고 레퍼런스]

LiveData : Jetpack

데이터의 변경을 감지하고 UI에 자동으로 업데이트를 반영하는데 사용된다. 생명주기를 고려하여 데이터의 유효성을 유지할 수 있어, 안정적이고 효율적으로 데이터를 관리할 수 있다.

Navigation : Jetpack

안드로이드 애플리케이션 내에서 화면 전환을 관리하는 데 도움을 준다. 간단하고 직관적인 API를 제공하여, 복잡한 네비게이션 구조도 쉽게 구현할 수 있다.

Recyclerview : Jetpack

ListView에서는 ViewHolder 패턴을 사용하지 않을 시 성능 저하의 문제가 발생할 수 있다. RecyclerView는 어댑터 인터페이스에서 ViewHolder 패턴을 강제적으로 사용하게 하여 성능 저하 문제를 방지한다. 이것이 RecyclerView를 사용하는 여러 가지 이유 중 대표적인 한 가지이다.
RecyclerView vs ListView
Displays a vertically-scrollable collection of views, where each view is positioned immediately below the previous view in the list. For a more modern, flexible, and performant approach to displaying lists, use androidx.recyclerview.widget.RecyclerView.
구분
ListView
RecyclerView
성능
데이터가 적을 때 효율적
데이터가 많을 때 효율적
아이템 추가/삭제
느림
빠름
아이템 레이아웃
세로 고정
LayoutManager 지원
애니메이션
전용 클래스 지원하지 않음
전용 클래스 지원
이외에도 RecyclerView가 Decoration, 커스텀 설정, API 업데이트 등 다양한 이점을 갖는다.
[참고 레퍼런스]
 link iconBrunch StoryAndroid RecyclerView 사용하기

추후 추가

Google Analytics | Crashlytics, FCM
Room
Dagger-Hilt: 인스턴스 생명주기 관리를 위해 Dagger보다 러닝커브가 훨씬 낮고, 초기 DI 환경 구축 비용을 절감할 수 있으며 안드로이드 앱에 최적화되어 있습니다.
CICD: Github Action을 활용한 CI/CD를 구축하여 코드 변경사항이 dev 브랜치에 push될때마다 자동으로 테스트 되게하여 코드의 안정성을 보장하였고 빌드가 완료되면 팀 Slack에 apk 파일을 자동으로 업로드 하여 배포 자동화를 구축하였습니다.