본문 바로가기
Android

[Android] Daum검색 Rest API를 이용해 책 검색 앱 만들기 (2)

by JongSeok 2023. 1. 8.

이전 포스팅에 이어 작성하겠습니다.

 

[안드로이드] Daum검색 Rest API를 이용해 책 검색 앱 만들기 (1)

Kako Developers(https://developers.kakao.com) 사이트에서는 Daum검색과 관련된 다양한 Rest API를 제공합니다. Kakao Developers 카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시

develop-oj.tistory.com


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
반응형