안드로이드 어플리케이션의 형태를 단순화 하여 보면, 이렇게 나눌 수 있다.
'서버와 통신하여 결과값을 화면에 보여주는 형태'
좀 더 쪼개자면,
- 화면부
- 통신부
가 있겠다.
화면부를 좀 더 쪼개자면,
- UI를 표현하는 부분
- 로직에 따라 UI를 제어 하는 부분
으로 나눌 수 있겠다.
통신부분을 나누자면,
- Request, Response 형태를 담는 부분
- 실제 통신 부분
이 있겠다.
위에서 맨 처음에 작성한 한줄짜리 문장을 다시 생각해보면, '결과값을 화면에 보여주는' 것이 중요하다.
이 말은, 화면부와 통신부가 연결이 되어야 한다는 뜻이 된다. 이를 구현하기 위해 여러 방법이 있겠다만,
Repository 패턴을 기준으로 설명해 보려 한다. 이에 앞서 먼저 화면부를 보자.
1. UI 구성
- UI를 표현하는 부분은 2가지로 나뉘어 진다. xml을 통한 레이아웃 구현방법과,
- 안드로이드에서 밀고 있는 jetpack compose 를 통한 방법이다.
1.1. xml을 통한 레이아웃
- 전통적인 방법으로, 태그를 이용하여 레이아웃을 구성한다. 뷰들을 레이아웃에 묶어 화면 구성하는 방법이다.
- 장점이라면 익숙함, 그리고 구조를 한눈에 보기 좋다 정도?
- 단점이라면 계층구조가 될 가능성이 높아 복잡하고, 남이 구현한걸 보기 어렵다.
1.2. jetpack compose
- 안드로이드에서 밀고 있는 방법으로, 코드에서 코딩을 통해 구현하는 방법이다.
- 장점이라면, 재사용성이 높고, 코드가 간결하다
- 단점이라면, 아무래도 익숙하지 않고, 경우에 따라 재사용할 뷰가 많지 않을 수 있다. 한눈에 구조 파악하기 힘들다.
2. UI 제어 부분
- Activity 혹은 Fragment 로 이루어진 클래스 파일 그리고 ViewModel 이 있다.
- ViewModel이 장점이 훨 많으므로, ViewModel을 활용하자.
- ViewModel 에서 통신 결과값을 subscribe로 받고, livedata의 observe를 통해 Activity나 Fragment에 전달한다.
그리고 여기서 실제 UI에 결과값을 표시한다.
- 필요 로직에 따라 서버와 통신하고, 해당 결과를 UI에 표시하는 형태인 것이다.
-> 그리고 이를 위해 비동기, 이벤트 방식으로 처리를 함으로서 보다 간결하게, 최소화 된 오류와 함께 구현을 한다.
3. 통신 부분
- 크게 Model, DataSource, Repository로 구분할 수 있겠다.
3.1. Model
- Request, Response 형태에 맞는 data class를 구현한다. API 호출시 전달되고, 받아야 하는 항목들을 규격에 맞춰
구현한다.
3.2. DataSource
- 실제 통신부 라고 보면 된다. 엄밀히 말해 통신은 보통 Retrofit을 사용하여 구현을 하고, DataSource 에선
이를 호출하는 쪽으로 개발을 한다.
- SharedPreference를 이용하여 내부에 값을 저장, 가져오는 경우와 서버로 부터 통신을 하는 2가지 파트로 구성할
수 있다
- 반응형 모델로 구현을 하여, subscribe 형태로 구독, ViewModel 에서 데이터를 받도록 한다.
3.3. Repository
- ViewModel 과 연계하는 부분이라고 보면 된다. DataSource 를 통해 내, 외부에 통신을 하고, 이를 한번 감싼것이다.
이렇게 하여 ViewModel 측에선 내, 외부 신경쓰지 않고 Repository에 정의한 함수를 호출만 하면 된다.
정리하자면,
Activity 혹은 Fragment <-> ViewModel <-> Repository <-> DataSource <-> Model 인 격이다.
'Android' 카테고리의 다른 글
| 부모뷰 영역을 넘어 자식뷰를 그리는법 Clipchildren 그리고 한계 (0) | 2023.03.08 |
|---|---|
| UseCase (0) | 2023.01.26 |
| SharedPreference (0) | 2023.01.26 |
| ViewModel 생성법 2가지 (0) | 2023.01.26 |
| ViewModel 코딩시 유의점 (0) | 2023.01.26 |