Step 1: 필요한 의존성 추가
build.gradle(Module: app) 파일에 다음 의존성을 추가합니다.
dependencies {
// Room 라이브러리
implementation "androidx.room:room-runtime:2.6.1"
kapt "androidx.room:room-compiler:2.6.1"
implementation "androidx.room:room-ktx:2.6.1"
// Hilt 라이브러리
implementation ("http://m.google.dagger:hilt-android:2.50")
kapt ("http://m.google.dagger:hilt-android-compiler:2.50")
}
// Room 라이브러리
implementation "androidx.room:room-runtime:2.6.1"
kapt "androidx.room:room-compiler:2.6.1"
implementation "androidx.room:room-ktx:2.6.1"
// Hilt 라이브러리
implementation ("http://m.google.dagger:hilt-android:2.50")
kapt ("http://m.google.dagger:hilt-android-compiler:2.50")
}
또한, build.gradle 파일 상단에 다음 플러그인을 추가합니다.
plugins {
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
id 'kotlin-kapt'
id 'dagger.hilt.android.plugin'
}
Step 2: Application 클래스에서 Hilt 설정
Application 클래스를 만들고 @HiltAndroidApp으로 주석을 추가합니다.
kotlin
CopyEdit
@HiltAndroidApp class MyApp : Application()
Step 3: Entity(데이터 모델) 정의
Room 데이터베이스에서 사용할 **엔티티(Entity)**를 생성합니다.
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val name: String,
val age: Int
)
data class User(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val name: String,
val age: Int
)
Step 4: DAO(Data Access Object) 생성
데이터베이스와 상호작용할 DAO 인터페이스를 정의합니다.
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(user: User)
@Query("SELECT * FROM user_table ORDER BY id ASC")
fun getAllUsers(): Flow<List<User>>
@Delete
suspend fun delete(user: User)
}
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(user: User)
@Query("SELECT * FROM user_table ORDER BY id ASC")
fun getAllUsers(): Flow<List<User>>
@Delete
suspend fun delete(user: User)
}
Step 5: Room 데이터베이스 클래스 생성
데이터베이스를 정의하는 추상 클래스를 만듭니다.
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Step 6: Hilt 모듈 생성 (의존성 제공)
Hilt를 사용하여 Room 데이터베이스를 제공하는 모듈을 만듭니다.
@Module
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext context: Context): UserDatabase {
return Room.databaseBuilder(
context,
UserDatabase::class.java,
"user_database"
).build()
}
@Provides
fun provideUserDao(database: UserDatabase): UserDao {
return database.userDao()
}
}
@InstallIn(SingletonComponent::class)
object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext context: Context): UserDatabase {
return Room.databaseBuilder(
context,
UserDatabase::class.java,
"user_database"
).build()
}
@Provides
fun provideUserDao(database: UserDatabase): UserDao {
return database.userDao()
}
}
📌 설명
- @Module → Hilt 모듈을 정의합니다.
- @InstallIn(SingletonComponent::class) → 싱글톤 범위에서 사용할 수 있도록 설정합니다.
- @Provides → Room 데이터베이스와 DAO 객체를 생성하는 방법을 지정합니다.
Step 7: Repository 생성
Repository는 데이터 액세스를 위한 API 역할을 합니다.
@Singleton
class UserRepository @Inject constructor(private val userDao: UserDao) {
val allUsers: Flow<List<User>> = userDao.getAllUsers()
suspend fun insert(user: User) {
userDao.insert(user)
}
suspend fun delete(user: User) {
userDao.delete(user)
}
}
class UserRepository @Inject constructor(private val userDao: UserDao) {
val allUsers: Flow<List<User>> = userDao.getAllUsers()
suspend fun insert(user: User) {
userDao.insert(user)
}
suspend fun delete(user: User) {
userDao.delete(user)
}
}
8️⃣ Step 8: ViewModel 생성
ViewModel은 Repository와 상호작용합니다.
k@HiltViewModel
class UserViewModel @Inject constructor(private val repository: UserRepository) : ViewModel() {
val allUsers: LiveData<List<User>> = repository.allUsers.asLiveData()
fun insert(user: User) = viewModelScope.launch {
repository.insert(user)
}
fun delete(user: User) = viewModelScope.launch {
repository.delete(user)
}
}
class UserViewModel @Inject constructor(private val repository: UserRepository) : ViewModel() {
val allUsers: LiveData<List<User>> = repository.allUsers.asLiveData()
fun insert(user: User) = viewModelScope.launch {
repository.insert(user)
}
fun delete(user: User) = viewModelScope.launch {
repository.delete(user)
}
}
9️⃣ Step 9: UI에서 ViewModel 사용 (Jetpack Compose)
hiltViewModel()을 사용하여 ViewModel을 UI에 주입합니다.
@Composable
fun UserScreen(viewModel: UserViewModel = hiltViewModel()) {
val users by viewModel.allUsers.observeAsState(emptyList())
Column {
Button(onClick = { viewModel.insert(User(name = "Alice", age = 25)) }) {
Text("사용자 추가")
}
LazyColumn {
items(users) { user ->
Row {
Text("${user.name}, 나이: ${user.age}")
Spacer(modifier = Modifier.width(16.dp))
Button(onClick = { viewModel.delete(user) }) {
Text("삭제")
}
}
}
}
}
}
fun UserScreen(viewModel: UserViewModel = hiltViewModel()) {
val users by viewModel.allUsers.observeAsState(emptyList())
Column {
Button(onClick = { viewModel.insert(User(name = "Alice", age = 25)) }) {
Text("사용자 추가")
}
LazyColumn {
items(users) { user ->
Row {
Text("${user.name}, 나이: ${user.age}")
Spacer(modifier = Modifier.width(16.dp))
Button(onClick = { viewModel.delete(user) }) {
Text("삭제")
}
}
}
}
}
}
🔟 Step 10: Activity에서 Hilt 설정
@AndroidEntryPoint을 사용하여 Hilt가 MainActivity를 관리하도록 합니다.
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
UserScreen()
}
}
}
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
UserScreen()
}
}
}
'Kotlin (안드로이드 Compose)' 카테고리의 다른 글
[Android] BottomNavigationBar 구현하기 (0) | 2025.04.25 |
---|---|
Jetpack Compose에서 상태 관리하기: remember, Flow, StateFlow (0) | 2025.03.20 |