[kotlin] 코틀린으로 Android Jetpack의 Room 라이브러리를 활용하여 페이징 기능을 구현하는 방법은?

안드로이드 앱에서 대량의 데이터를 처리할 때 페이징은 매우 유용한 방법입니다. Room 라이브러리는 SQLite 데이터베이스를 편리하게 다룰 수 있는 도구로, 페이징을 쉽게 구현할 수 있습니다.

1. 의존성 추가

먼저, 프로젝트의 build.gradle 파일에 Room 라이브러리의 의존성을 추가합니다.

dependencies {
    implementation "androidx.room:room-runtime:2.4.0"
    kapt "androidx.room:room-compiler:2.4.0"
}

2. 엔티티 및 DAO 생성

다음으로, 페이징할 데이터의 엔티티를 정의하고, 해당 엔티티에 대한 데이터 액세스 객체(DAO)를 생성합니다. 이때, 페이징 라이브러리에서 제공하는 PagingSource를 사용하여 데이터를 가져오는 메서드를 정의합니다.

@Entity
data class Item(
    @PrimaryKey
    val id: Int,
    val name: String
)

@Dao
interface ItemDao {
    @Query("SELECT * FROM Item")
    fun getItems(): PagingSource<Int, Item>
}

3. Repository 생성

이후, 데이터 액세스 객체를 사용하여 데이터를 가져오고 관리할 Repository 클래스를 생성합니다.

class ItemRepository(private val itemDao: ItemDao) {
    fun getItems(): Flow<PagingData<Item>> {
        return Pager(
            config = PagingConfig(pageSize = 20),
            pagingSourceFactory = { itemDao.getItems() }
        ).flow
    }
}

4. ViewModel 및 UI 작성

마지막으로, ViewModel을 생성하여 Repository로부터 데이터를 가져오고 이를 UI에 노출시키는 작업을 수행합니다.

class ItemViewModel(private val itemRepository: ItemRepository) : ViewModel() {
    val items: LiveData<PagingData<Item>> = itemRepository.getItems().liveData.cachedIn(viewModelScope)
}
class ItemFragment : Fragment() {
    private val viewModel: ItemViewModel by viewModels()
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        viewModel.items.observe(viewLifecycleOwner) { pagingData ->
            // 페이징된 데이터를 처리하는 로직을 작성
        }
    }
}

위와 같이 안드로이드 Jetpack의 Room 라이브러리와 페이징 라이브러리를 활용하여 안정적이고 효율적인 페이징 기능을 구현할 수 있습니다.

더 자세한 내용은 아래 공식 문서를 참고하시기 바랍니다.