๊ธฐ์กด์๋ Activity์ UI์ ๋ก์ง์ ๋ชจ๋ ๋ชฐ์๋ฃ๋ ๋ฐฉ์
ํ๋ฉด ํ์ ์ ๋ฐ์ดํฐ ์์ค
์ฝ๋์ ๋์ ๊ฒฐํฉ๋ โ ์ ์ง๋ณด์ ์ด๋ ค์
ํ
์คํธ ์ด๋ ค์
UI (Compose)
โ
ViewModel (UI ์ํ/๋ก์ง)
โ
Repository (๋ฐ์ดํฐ ์ค๊ฐ)
โ
Room, Network (DB/API)
class DemoViewModel : ViewModel() {
var temperature by mutableStateOf("")
}
@Composable
fun TemperatureInput(viewModel: DemoViewModel = viewModel()) {
TextField(
value = viewModel.temperature,
onValueChange = { viewModel.temperature = it }
)
}
val demoViewModel: DemoViewModel by viewModels()
val viewModel: DemoViewModel by viewModels()
@Composable
fun TemperatureInput(viewModel: DemoViewModel) {
Column {
Text(text = "ํ์ฌ ์จ๋: ${viewModel.temperature}")
TextField(
value = viewModel.temperature,
onValueChange = { viewModel.temperature = it },
label = { Text("์จ๋ ์
๋ ฅ") }
)
}
}
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER
);
์ด: ์์ฑ (name, age ๋ฑ)
ํ: ๋ฐ์ดํฐ ํ ์ค
๊ธฐ๋ณธ ํค(PK): ๊ฐ ํ์ ๊ณ ์ ํ๊ฒ ์๋ณ
์๋๋ก์ด๋ ๋ด์ฅ ๊ฒฝ๋ DB
SQL๋ก ๋ฐ์ดํฐ ์กฐ์ ๊ฐ๋ฅ
Room ์์ด ์ฌ์ฉํ๋ ค๋ฉด SQLiteOpenHelper ๊ตฌํ ํ์
SQLite ์ฌ์ฉ์ ๊ฐํธํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ถ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
@Entity: ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ์
@Dao: ์ฟผ๋ฆฌ ์ ์
@Database: DB ๊ฐ์ฒด ์ ๊ณต
implementation "androidx.room:room-runtime:2.6.1"
kapt "androidx.room:room-compiler:2.6.1"
@Entity
data class Note(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val content: String
)
@Dao
interface NoteDao {
@Insert suspend fun insert(note: Note)
@Query("SELECT * FROM Note") fun getAll(): Flow<List<Note>>
}
@Database(entities = [Note::class], version = 1)
abstract class NoteDatabase : RoomDatabase() {
abstract fun noteDao(): NoteDao
}
class NoteViewModel(private val repository: NoteRepository) : ViewModel() {
val notes = repository.allNotes.asLiveData()
fun addNote(content: String) {
viewModelScope.launch {
repository.insert(Note(content = content))
}
}
}
ViewModel: UI ์ํ ๊ด๋ฆฌ
LiveData / State: UI ์ฌ๊ตฌ์ฑ ํธ๋ฆฌ๊ฑฐ
Room: ์์ ํ๊ณ ํธ๋ฆฌํ DB ์ ๊ทผ
Compose: ์ ์ธํ UI ์์ฑ
=> ์ด ์กฐํฉ์ ํ๋ ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ํ์ค ๊ตฌ์กฐ