PHpullh

KOTLIN · 디자인패턴

MVVM 패턴

Model-View-ViewModel 패턴을 Kotlin으로 구현합니다. StateFlow로 상태를 관리하고 UI와 분리합니다.

디자인패턴고급mvvmstateflowviewmodelarchitecture

핵심 설명

Model-View-ViewModel 패턴을 Kotlin으로 구현합니다. StateFlow로 상태를 관리하고 UI와 분리합니다.

Kotlin code

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

// Model
data class Todo(val id: Int, val text: String, val done: Boolean = false)

// ViewModel
class TodoViewModel {
    private val _todos = MutableStateFlow<List<Todo>>(emptyList())
    val todos: StateFlow<List<Todo>> = _todos.asStateFlow()

    private var nextId = 1

    fun addTodo(text: String) {
        _todos.value += Todo(nextId++, text)
    }
    fun toggleTodo(id: Int) {
        _todos.value = _todos.value.map {
            if (it.id == id) it.copy(done = !it.done) else it
        }
    }
    fun removeDone() {
        _todos.value = _todos.value.filter { !it.done }
    }

    val stats: Flow<String> = _todos.map { list ->
        val done = list.count { it.done }
        "완료: $done / 전체: ${list.size}"
    }
}

// View (콘솔 시뮬레이션)
fun main() = runBlocking {
    val vm = TodoViewModel()
    val job = launch { vm.todos.collect { println("목록: $it") } }

    vm.addTodo("Kotlin 공부")
    vm.addTodo("프로젝트 완성")
    delay(50)
    vm.toggleTodo(1)
    delay(50)
    vm.removeDone()
    delay(50)
    job.cancel()
}

학습 팁

ViewModel은 Android의 ViewModel 클래스를 상속하면 구성 변경(화면 회전)에도 상태가 유지됩니다.

주의할 점

ViewModel에서 View를 직접 참조하면 메모리 누수가 발생합니다. 반드시 StateFlow/SharedFlow를 통해 간접 통신하세요.

자주 묻는 질문

MVVM 패턴란 무엇인가요?

Model-View-ViewModel 패턴을 Kotlin으로 구현합니다. StateFlow로 상태를 관리하고 UI와 분리합니다.

MVVM 패턴 학습 시 주의할 점은 무엇인가요?

ViewModel에서 View를 직접 참조하면 메모리 누수가 발생합니다. 반드시 StateFlow/SharedFlow를 통해 간접 통신하세요.