코틀린 안드로이드 앱개발 강좌, 제트팩과 androidx 소개

안드로이드 앱 개발은 시간이 지남에 따라 계속 진화해 왔으며, 최근 몇 년간 코틀린은 개발자들 사이에서 각광받는 언어로 자리잡았습니다. 코틀린의 간결하고 현대적인 문법은 안드로이드 개발을 한층 더 쉽게 만들어 줍니다. 하지만, 코틀린을 제대로 활용하기 위해서는 안드로이드 앱 개발을 위한 다양한 라이브러리와 도구를 이해하는 것이 중요합니다. 이번 강좌에서는 안드로이드 제트팩(Android Jetpack)AndroidX에 대해 살펴보겠습니다.

1. 안드로이드 제트팩이란?

안드로이드 제트팩은 안드로이드 앱 개발에 필요한 다양한 구성 요소를 집합적으로 제공하는 라이브러리이다. 이 라이브러리는 앱 구조를 돕고, 생명주기 관리를 쉽게 만들어 주며, 데이터 저장 및 UI 구성에 필요한 여러 도구들을 통합하여 제공합니다. 안드로이드 제트팩은 크게 다음과 같은 세 가지 주요 구성 요소로 나눌 수 있습니다:

  • 아키텍처 컴포넌트(Architecture Components): ViewModel, LiveData, Room 프레임워크가 포함되어 있으며, 앱의 아키텍처를 보다 효율적으로 설계하고 관리할 수 있게 해줍니다.
  • UI 컴포넌트(UI Components): Navigation, Fragment, ViewPager와 같은 UI 관련 구성 요소로, 사용자 인터페이스를 손쉽게 설계할 수 있도록 도와줍니다.
  • 행위 컴포넌트(Behavior Components): WorkManager, Paging Library 등을 포함하여, 비동기 작업 처리 및 데이터 페이징을 효율적으로 관리할 수 있게 합니다.

1.1 아키텍처 컴포넌트

아키텍처 컴포넌트는 MVVM(Model-View-ViewModel) 패턴을 따르는 앱 개발을 위해 설계되었습니다. 이들 컴포넌트는 생명주기 인식, 데이터 관찰, 데이터베이스 작업 등 다양한 기능을 제공합니다.

1.1.1 ViewModel

ViewModel은 UI 관련 데이터를 저장하고 관리하는 역할을 합니다. ViewModel은 Activity나 Fragment의 생명주기와 관계없이 데이터를 유지하기 때문에, 화면 회전이나 기타 생명주기 변화가 발생할 때 유용합니다.

class MainViewModel : ViewModel() {
    private val _text = MutableLiveData()
    val text: LiveData get() = _text

    fun updateText(newText: String) {
        _text.value = newText
    }
}

1.1.2 LiveData

LiveData는 생명주기에 맞춰 데이터를 관찰할 수 있게 해주는 객체입니다. UI는 LiveData를 구독하고, 데이터가 변경되면 자동으로 업데이트됩니다.

viewModel.text.observe(this, Observer { newText ->
    textView.text = newText
})

1.1.3 Room

Room은 SQLite 데이터베이스 작업을 쉽게 할 수 있도록 해주는 ORM 라이브러리입니다. Room을 사용하면 SQL 쿼리를 작성하지 않고도 데이터를 삽입, 업데이트, 삭제할 수 있습니다.

@Entity(tableName = "users")
data class User(
    @PrimaryKey val id: Int,
    val name: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAllUsers(): List
    
    @Insert
    fun insertUser(user: User)
}

1.2 UI 컴포넌트

UI 컴포넌트는 사용자 인터페이스의 흐름과 탐색을 관리하는데 중요한 역할을 합니다. Navigation Component는 다양한 화면을 손쉽게 연결할 수 있게 해주고, Fragment와 ViewPager를 통해 사용자 경험을 향상시킬 수 있습니다.

1.2.1 Navigation Component

Navigation Component는 앱의 탐색을 쉽게 구현하도록 돕는 라이브러리입니다. Navigation 그래프를 정의하고, 여러 화면 간의 전환을 관리할 수 있습니다.

val navController = findNavController(R.id.nav_host_fragment)
navController.navigate(R.id.action_firstFragment_to_secondFragment)

1.2.2 Fragment

Fragment는 사용자 인터페이스의 일부를 캡슐화하여 재사용할 수 있게 하는 구성 요소입니다. Fragment는 Activity와 분리되어 생명주기를 관리합니다.

1.2.3 ViewPager

ViewPager는 여러 Fragment를 슬라이드하여 탐색할 수 있도록 도와주는 구성 요소입니다. PagerAdapter를 통해 페이지를 관리할 수 있습니다.

class ViewPagerAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm) {
    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> FirstFragment()
            1 -> SecondFragment()
            else -> FirstFragment()
        }
    }

    override fun getCount(): Int {
        return 2
    }
}

1.3 행위 컴포넌트

행위 컴포넌트는 백그라운드 작업, 데이터 로딩 등과 같은 비즈니스 로직을 관리하는 데 도움을 주는 컴포넌트입니다.

1.3.1 WorkManager

WorkManager는 필요에 따라 백그라운드에서 작업을 수행할 수 있도록 해주는 프레임워크입니다. 이를 통해 작업의 지연이나 정기적인 수행이 가능하게 됩니다.

val workRequest = OneTimeWorkRequestBuilder()
    .setInputData(workDataOf("key" to "value"))
    .build()

WorkManager.getInstance(context).enqueue(workRequest)

2. AndroidX란?

AndroidX는 안드로이드의 새로운 라이브러리 패키지를 포함하는 라이브러리입니다. 구글은 AndroidX를 통해 다양한 라이브러리를 보다 손쉽게 관리하고 업데이트할 수 있도록 개선하였습니다. AndroidX는 다음과 같은 특징이 있습니다:

  • 모듈화: 각 기능이 독립된 라이브러리로 제공되기 때문에 필요한 라이브러리만 선택해 사용할 수 있습니다.
  • 버전 관리: 구글이 정기적으로 AndroidX 라이브러리의 업데이트를 제공하여 최신 기능을 쉽게 활용할 수 있습니다.
  • 모든 API에 대한 일관된 방식 제공: AndroidX 라이브러리는 모든 API에 대해 일관된 이름 규칙을 제공합니다.

2.1 AndroidX 구성 요소

AndroidX는 다양한 구성 요소로 이루어져 있으며, 그 중 일부는 다음과 같습니다:

  • AppCompat: 호환성을 지원하는 다양한 UI 구성 요소를 제공합니다.
  • ConstraintLayout: UI 요소들을 쉽게 배치할 수 있게 돕는 레이아웃입니다.
  • RecyclerView: 대량의 데이터를 효율적으로 표시할 수 있는 구성 요소입니다.
  • Room: 앞서 설명한 것처럼, 데이터베이스 작업을 쉽게 할 수 있도록 돕는 ORM 라이브러리입니다.

2.2 AndroidX 사용 예제

아래는 AndroidX의 RecyclerView를 사용하여 리스트를 표시하는 간단한 예제입니다.

2.2.1 build.gradle 설정

dependencies {
    implementation "androidx.recyclerview:recyclerview:1.2.1"
}

2.2.2 RecyclerView 어댑터

class MyAdapter(private val items: List) : RecyclerView.Adapter() {

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val textView: TextView = itemView.findViewById(R.id.textView)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_layout, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.textView.text = items[position]
    }

    override fun getItemCount() = items.size
}

2.2.3 RecyclerView 설정

val recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(listOf("Item 1", "Item 2", "Item 3"))

3. 결론

안드로이드 제트팩과 AndroidX는 안드로이드 앱 개발에 있어 필수적인 요소이며, 이를 통해 개발자는 더 나은 품질의 앱을 빠르게 구축할 수 있습니다. 이번 강좌를 통해 안드로이드 제트팩의 다양한 구성 요소와 AndroidX의 중요성을 이해하는 데 도움이 되었기를 바랍니다. 앞으로 더 심도 있는 코틀린 안드로이드 앱 개발 강좌로 돌아오겠습니다!