LiveData와 Room의 통합 방법은?
_____A1:
- LiveData 는 Android 아키텍처 컴포넌트 중 하나로, 데이터의 변경을 감지하고 UI에 자동으로 업데이트를 반영해주는 라이프사이클 인식 데이터 홀더입니다.
- Room 은 SQLite 데이터베이스를 쉽게 다룰 수 있게 해주는 Android 아키텍처 컴포넌트로, 데이터베이스 접근 추상화 레이어를 제공합니다.
---
Q2: LiveData와 Room은 왜 함께 사용하나요?
A2: Room에서 데이터 변경이 발생하면 자동으로 UI에 변경사항을 반영하고 싶을 때 LiveData를 함께 사용합니다. 이렇게 하면 UI는 항상 최신 상태를 유지하고, 별도의 데이터 변경 감지 로직 없이도 변화에 반응할 수 있습니다.
---
Q3: Room에서 LiveData를 반환하려면 어떻게 하나요?
A3: DAO 메서드에서 `LiveData
- >` 형식으로 반환 타입을 선언합니다. 예를 들어:
```kotlin
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAllUsers(): LiveData
- >
}
```
---
Q4: Room과 LiveData를 통합하는 기본적인 절차는 무엇인가요?
A4:
1. Entity 정의: 데이터베이스 테이블에 대응하는 @Entity 클래스 작성
2. DAO 작성: 쿼리를 선언하며, 반환 타입으로 LiveData를 사용
3. RoomDatabase 구현: Database 클래스에서 DAO 인스턴스 제공
4. ViewModel에서 DAO 호출: LiveData를 반환받아 UI에 연결
5. Activity/Fragment에서 LiveData 옵저빙: `observe`를 통해 UI 업데이트 처리
---
Q5: 예제 코드를 보여주세요.
A5:
```kotlin
// 1. Entity
@Entity(tableName = "user")
data class User(
@PrimaryKey val id: Int,
val name: String
)
// 2. DAO
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAllUsers(): LiveData
- >
}
// 3. RoomDatabase
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
// 4. ViewModel
class UserViewModel(application: Application) : AndroidViewModel(application) {
private val userDao = Room.databaseBuilder(application, AppDatabase::class.java, "db").build().userDao()
val users: LiveData
- > = userDao.getAllUsers()
}
// 5. Activity/Fragment
class UserActivity : AppCompatActivity() {
private lateinit var viewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProvider(this).get(UserViewModel::class.java)
viewModel.users.observe(this) { users ->
// UI 업데이트 코드
}
}
}
```
---
Q6: LiveData가 데이터베이스 변경 사항을 자동으로 감지하는 원리는?
A6: Room은 내부적으로 데이터베이스 쿼리에 변화가 있을 때 LiveData 객체에 변경 알림을 전달합니다. LiveData는 옵저버(액티비티나 프래그먼트)가 활성 상태일 때만 업데이트를 전파하여 불필요한 연산을 줄입니다.
---
Q7: LiveData 대신 Flow나 RxJava를 사용할 수도 있나요?
A7: 네, Room은 `Flow
---
Q8: 주의해야 할 점이 있나요?
A8:
- DAO 메서드 반환 타입이 반드시 LiveData여야 자동 관찰이 가능합니다.
- LiveData는 UI 스레드에 데이터를 전달하므로, Room 쿼리는 별도 스레드에서 실행됩니다.
- 오래된 Android 버전에서는 LiveData 리스너가 제대로 해제되지 않을 수 있으니 주의합니다.
- 대량 데이터는 LiveData 대신 별도의 페이징 기법(Paging 라이브러리 등)과 함께 사용하는 게 좋습니다.
---
요약:
Room의 DAO에서 LiveData를 반환 타입으로 선언하면, 데이터베이스의 변경사항이 자동으로 LiveData를 구독하는 UI에 전달됩니다. ViewModel에서 DAO 메서드를 호출해 LiveData를 받아 UI(액티비티, 프래그먼트)에서 옵저빙하면 실시간 데이터 동기화가 간편해집니다.
이 둘을 통합하는 기본적인 개념과 절차를 자세히 설명해드리겠습니다.
1. 개념 이해 - Room 은 SQLite 데이터베이스를 추상화한 ORM 라이브러리로, SQL 쿼리를 자바/코틀린 메서드로 변환해줍니다.
- LiveData 는 데이터 변경을 관찰하여 UI에 자동으로 갱신되는 Lifecycle-aware 데이터 홀더입니다.
Room에서 쿼리 결과를 단순 값으로 반환하면 데이터 변경 시 UI가 자동으로 갱신되지 않지만, 쿼리의 반환 타입을 `LiveData
---
2. 통합 절차 1) Entity 클래스 정의 Room에서 사용하는 데이터 클래스에 `@Entity` 어노테이션을 붙입니다.
```kotlin @Entity(tableName = "users") data class User( @PrimaryKey val id: Int, val name: String, val age: Int ) ```
2) DAO 인터페이스에 LiveData 반환 타입 사용 Room의 DAO에 쿼리를 작성할 때 단순값이나 `List
- >`를 반환하도록 합니다.
```kotlin @Dao interface UserDao { @Query("SELECT * FROM users") fun getAllUsers(): LiveData
- > } ``` 이렇게 정의하면, 이 쿼리의 결과가 데이터베이스에서 변경될 때마다 해당 `LiveData` 객체가 업데이트되고, 구독하고 있는 옵저버에게 변경된 값이 전달됩니다.
3) Room 데이터베이스 객체 생성 및 DAO 연결 Room 데이터베이스 클래스를 생성하고, DAO를 가져옵니다.
```kotlin @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } ``` ```kotlin val db = Room.databaseBuilder(context, AppDatabase::class.java, "app-db").build() val userDao = db.userDao() ```
4) ViewModel에서 LiveData 받아서 UI에 제공 ViewModel 단에서 DAO로부터 LiveData를 받아서 UI에 노출합니다.
```kotlin class UserViewModel(application: Application) : AndroidViewModel(application) { private val userDao = AppDatabase.getDatabase(application).userDao() val allUsers: LiveData
- > = userDao.getAllUsers() } ```
5) Activity 또는 Fragment에서 LiveData 옵저빙 UI 컴포넌트에서는 ViewModel의 LiveData를 옵저빙하여 데이터가 변경될 때 UI를 자동 갱신합니다.
```kotlin viewModel.allUsers.observe(viewLifecycleOwner) { users -> // users 리스트를 UI에 반영하는 코드 (예: RecyclerView 어댑터에 전달) } ``` ---
3. 요약 - Room DAO 쿼리 메서드의 반환 타입을 `LiveData
- 이런 LiveData는 Room 내부에서 데이터 변경을 감지하여 자동으로 값이 갱신된다. - ViewModel에서 LiveData를 받아 UI 레이어에 전달한다.
- UI에서는 LiveData를 옵저빙해서 데이터 변경 시 자동으로 UI가 업데이트 되도록 한다.
이러한 통합 덕분에 별도의 데이터 갱신 로직 없이도, 코드를 간결하고 안정적으로 유지할 수 있습니다.
Lifecycle-aware이기 때문에 메모리 누수와 UI 비활성 상태일 때 업데이트를 방지할 수도 있습니다.
작성자:
최다영 [비회원]
| 작성일자: 1년 전
2025-05-25 12:40:43
조회수: 185 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 185 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.