이전 포스팅에 이어 작성하겠습니다.
AAC(Android Architecture Component) 구조를 적용해 보겠습니다.
먼저 app/build.gradle에 종속성을 추가합니다.
// Lifecycle
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.5.1'
// Coroutine
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1'
// by viewModels
implementation 'androidx.activity:activity-ktx:1.5.1'
implementation 'androidx.fragment:fragment-ktx:1.5.5'
BookSearchRepository
interface BookSearchRepository {
suspend fun searchBooks(
query: String,
sort: String,
page: Int,
size: Int
) : Response<BookSearchRequestApi>
}
BookSearchRepositoryImpl
class BookSearchRepositoryImpl : BookSearchRepository {
override suspend fun searchBooks(
query: String,
sort: String,
page: Int,
size: Int
): Response<SearchResponse> {
return api.searchBooks(query, sort, page, size)
}
}
Repository 인터페이스와 인터페이스를 구현할 클래스를 나누어 작성합니다.
작성한 Repository는 API 가이드 문서에서 확인한 Parameter를 이용해 DB에 데이터를 요청하는 역할을 수행합니다.
BookSearchViewModel
class BookSearchViewModel(
private val bookSearchRepository: BookSearchRepository
): ViewModel() {
private val _searchResult = MutableLiveData<SearchResponse>()
val searchResult : MutableLiveData<SearchResponse> get() = _searchResult
fun searchBooks(query: String) = viewModelScope.launch(Dispatchers.IO) {
val response = bookSearchRepository.searchBooks(query,"accuracy",1,15)
if (response.isSuccessful) {
response.body().let {
_searchResult.postValue(it)
}
}
}
}
BookSearchViewModelFactory
class BookSearchViewModelFactory(
private val bookSearchRepository: BookSearchRepository
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(BookSearchViewModel::class.java)) {
return BookSearchViewModel(bookSearchRepository) as T
}
throw IllegalArgumentException("ViewModel class not found")
}
}
BookSearchViewModel은 생성 시에 BookSearchRepository를 전달받도록 작성했습니다.
하지만 ViewModel 자체로는 생성 시에 초기값을 전달받을 수 없기 때문에 ViewModelFactory를 생성해 줍니다.
그리고 이제 MainActivity에서 Repository, Factory, ViewModel 객체를 생성합니다..
MainActivity
class MainActivity : AppCompatActivity() {
private val binding: ActivityMainBinding by lazy {
ActivityMainBinding.inflate(layoutInflater)
}
private val bookSearchRepository = BookSearchRepositoryImpl()
private val factory = BookSearchViewModelFactory(bookSearchRepository)
private val viewModel: BookSearchViewModel by viewModels() { factory }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
}
}
다음 포스팅에서 응답받은 데이터를 ListAdapter를 사용해 UI에 띄워주겠습니다.
* [인프런] "냉동코더의 알기 쉬운 Modern Android Development 입문" 참고
728x90
반응형
'Android' 카테고리의 다른 글
[Android] 안드로이드의 4대 구성요소(4대 컴포넌트) (1) | 2023.01.10 |
---|---|
[Android] Daum검색 Rest API를 이용해 책 검색 앱 만들기 (3) (1) | 2023.01.08 |
[Android] Daum검색 Rest API를 이용해 책 검색 앱 만들기 (1) (0) | 2023.01.08 |
[Android] BottomNavigationView(하단 네비게이션) 구현하기 (0) | 2023.01.06 |
[Android] MVVM 디자인 패턴 (0) | 2022.12.31 |