안드로이드를 공부한 기간이 그리 길지 않아서 그런지 개인 프로젝트를 진행 하면서 코드가 점점 산으로 가는게 느껴졌다.
어떻게 해야지 다른 사람이 보기 쉽고 추후에 유지 보수가 쉬운 코드를 짤까? 라는 질문을 스스로 던졌고,
그 질문에 답하기 위해 이 글을 작성한다.
Github에서 다른 개발자 분들이 만들어 놓은 앱을 종종 구경하곤 하는데 ReadMe 파일에 어떤 Architecture Pattern를 사용해서 개발 했다고 기술 되어 있는걸 볼 수 있었다.
제일 자주 보였던건 MVVM, MVC 패턴 이였고 그 외에 MVP 패턴이 보였었다.
그렇다면 MVVM, MVC, MVP 패턴은 뭐고 아키텍쳐 패턴은 또 뭘까?
Architecture Pattern?
- 아키텍처 패턴은 소프트웨어 공학의 다양한 문제를 해결한다.
- 예를 들어 컴퓨터 하드웨어 성능 제한, 비즈니스 위험의 최소화와 고가용성 등이 있다.
- 일부 아키텍처 패턴은 SW 프레임워크 안에 구현되어 있다.
- 아키텍처 패턴이 시스템의 이미지를 전달하기는 하지만 아키텍처 자체를 의미하는 것은 아니다. 다양한 아키텍처가 동일한 패턴을 구현하고 관련 특성을 공유할 수 있다.
- 안드로이드 분야에서 자주 이용하는 것은 MVC, MVVM, MVP 패턴이 있다.
Architecture pattern를 이해하기 전에 디자인 패턴을 미리 알아보는 것을 추천!!
Architecture Pattern을 사용하는 이유는?
초보 개발자들이 흔히 하는 실수가 Activity 또는 Fragment에 모든 코드를 때려 박는 것이다.
Activity 또는 Fragment같은 UI 기반 클래스는 UI 및 운영체제 상호작용을하는 처리하는 로직만 포함해야 한다.
아키텍쳐 패턴을 사용한다면 UI기반 클래스를 최대한 가볍게 유지하여 구성요소 수명 주기와 관련된 많은 문제를 피하고 그러한 클래스의 테스트 가능성을 개선할 수 있게된다.
MVVM?
- MVVM 패턴이란 Model, View, ViewModel의 줄임말
- MVVM 패턴은 마틴 파울러의 Presentation 모델 패턴에서 파생된 디자인 패턴이다.
액티비티에 기능을 붙이다보면 액티비티가 무거워지거나 혹은 종속성이 너무 강해 테스트가 힘들고 유지보수가 어려워진다.
위와 같은 고민 때문에 MVVM 패턴이 등장했다.
MVVM은 View - ViewModel - Model을 이용해 각각의 역할을 분리하여 가독성과 재사용성을 높인 디자인 패턴이다.
MVVM에서는 뷰에서 뷰모델로, 뷰모델에서 모델로 작업을 처리하고, 뷰에서 모델을 직접 참조하지 않으며
뷰에서 뷰모델을 관찰하며(옵저버) 데이터의 변경 사항을 감지한다.
그러면 정확하게 View란 뭐고, ViewModel은 뭐고 Model은 또 뭔데? ㅋㅋㅋㅋ,,
View
- Activity, Fragment와 같이 화면에 보여지는UI (Button, TextView 등등 ..)
- 사용자의 텍스트 입력, 버튼 터치 등과 같은 액션을 받는다
- ViewModel의 데이터를 관찰해 Observe UI를 갱신한다
- 데이터의 변화를 알아차리고 자동으로 화면으로 갱신할 수 있다.
ViewModel
- View가 요청한 데이터를 Model로 요청하는 역할을 담당
- Model로부터 요청한 데이터를 받음
- 뷰의 상태를 유지하고, 뷰의 행동을 관리하며 필요한 데이터 반환을 수행한다.
- 사용자의 입력과 앱 데이터 사이에서 중간 역할을 하는 컨트롤 타워와 비유할 수 있다.
- 사용자의 입력이나 데이터 변경에 따라 적절한 작업을 수행하고 결과를 뷰에 전달한다.
- 예를 들어 사용자가 로그인 버튼을 클릭 했을 때 뷰 모델은 사용자가 입력한 사용자 이름과 비밀번호를 검증하고 로그인 작업을 처리하는 예시가 있음
Model
- ViewModel이 요청한 데이터를 반환한다
- DB 사용이나 Retrofil을 통한 백엔드 API 호출이 보편적 (Repository, Database 등)
AAC (Android Architecture Component)
MVVM은 훌륭하게 앱을 만들 수 있는 디자인 패턴임은 분명하지만 구조가 복잡하다는 단점이 크다.
하지만 MVVM 패턴을 간편하게 적용할 수 있도록 구글에서 AAC 라는 것을 제공한다.
AAC는 다양한 구성 요소로 구성되어 있으며, 주요한 구성 요소는 아래와 같다.
- ViewModel:앱의 UI와 관련된 데이터를 처리하고 관리하는 데 사용됩니다. 액티비티나 프래그먼트와 같은 UI 컨트롤러와 별개로 존재하며, 액티비티나 프래그먼트의 생명주기와 독립적으로 데이터를 유지한다.
- LiveData: LiveData는 관찰 가능한 데이터 홀더로서, 데이터의 변화를 알릴 수 있으며, LiveData는 수명 주기를 인식하여 액티비티나 프래그먼트 등의 UI 컴포넌트의 상태에 맞춰 데이터를 업데이트한다.
- Room: Room은 안드로이드 앱에서 SQLite 데이터베이스에 접근하는 데 사용되는 ORM(Object-Relational Mapping) 라이브러리이며 Room은 데이터베이스에 접근하는 코드를 간소화하고, 컴파일 타임에 오류를 확인할 수 있는 기능을 제공한다.
- Paging: Paging은 대량의 데이터를 효율적으로 로드하고 표시하는 데 사용되는 라이브러리입니다. Paging은 RecyclerView와 함께 사용하여 데이터를 페이지 단위로 로드하고 스크롤링을 지원한다.
AAC는 앱의 아키텍처를 개선하고 관리하기 위해 일관된 접근 방식과 구조를 제공하여 개발자들이 더 쉽게 안드로이드 앱을 개발할 수 있도록 도와주며, AAC를 사용하면 앱의 생명주기 관리, 데이터 관리, 데이터베이스 액세스 등과 같은 일반적인 문제들을 보다 쉽게 해결할 수 있습니다.
LiveData
-> View가 ViewModel을 관찰할 때, 그 관찰 대상이 되는 관찰 가능한(Observable) 데이터 홀더 클래스이다.
View에서 ViewModel의 LiveData를 관찰하게 되면 데이터가 변경될 때 내부적으로 자동으로 알려주게 된다.
Live Data는 Activity 및 Fragment의 생명주기를 인지한다.
즉, Activity가 화면 위에 활성화되어 있을 때만 UI변경 등의 기능을 동작하게 되고, Destroy되 상태에서는 동작하지 않기 때문에
메모리 릭의 발생을 줄여준다.
RoomDatabase
SQLite 데이터베이스를 편하게 사용할 수 있도록 해주는 라이브러리이다. SQLite의 코드를 직접 작성하는 경우, 직접 테이블을 Create하거나 쿼리문을 일일이 변수를 통해 작성해주어야 했지만, Room을 쓰면 조금 더 직관적이고 편리하게 DB를 사용할 수 있다.
'Android' 카테고리의 다른 글
Android - GitHub에 API Key, Hash 값 숨기기 (0) | 2023.01.05 |
---|---|
안드로이드 - csv 파일 읽기 (0) | 2022.11.21 |
안드로이드 - Kotlin login 구현 (PHP, mysql, volley) (0) | 2022.08.04 |
Android - Mac북 에뮬레이터 인터넷(와이파이 안될 경우) (1) | 2022.08.04 |
Android BottomNavigation Bar Round효과 (0) | 2022.08.02 |