본문 바로가기
Kotlin (안드로이드 Compose)

Room Database with Dependency Injection (DI) in Android

by duduryapp 2025. 3. 20.

 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")
}
 
또한, build.gradle 파일 상단에 다음 플러그인을 추가합니다.
 
plugins {
    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
)

 


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)
}

Step 5: Room 데이터베이스 클래스 생성

데이터베이스를 정의하는 추상 클래스를 만듭니다.

@Database(entities = [User::class], version = 1, exportSchema = false)
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()
    }
}

📌 설명

  • @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)
    }
}

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)
    }
}

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("삭제")
                    }
                }
            }
        }
    }
}

🔟 Step 10: Activity에서 Hilt 설정

@AndroidEntryPoint을 사용하여 Hilt가 MainActivity를 관리하도록 합니다.

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            UserScreen()
        }
    }
}