티스토리 뷰

728x90
반응형
SMALL

MVVM 아키텍처의 고급 적용에서 LiveData를 더 자세히 살펴보겠습니다. MVVM은 Model, View, ViewModel의 약자로, 각 구성 요소가 역할에 맞게 분리돼 유지보수와 테스트가 용이한 아키텍처 패턴입니다. LiveData는 MVVM 아키텍처에서 데이터의 관리와 UI 업데이트를 용이하게 만들어주는 핵심 도구입니다.

1. MVVM 아키텍처와 LiveData 소개

MVVM 아키텍처는 다음과 같은 특징을 가지고 있습니다.

  • Model: 앱의 데이터와 비즈니스 로직을 담당합니다.
  • View: UI를 표현하며, 사용자의 입력을 받아 ViewModel에 전달합니다.
  • ViewModel: View와 Model 간의 중개자 역할을 수행하며, UI와 데이터 간의 통신을 관리합니다.

LiveData는 MVVM 아키텍처에서 View와 ViewModel 간의 통신을 원활하게 만들어주는 도구입니다. 주로 ViewModel이 가진 데이터를 라이프사이클을 인식하여 자동으로 업데이트하며, 메모리 누수를 방지하는 등의 장점을 제공합니다.

2. LiveData의 특징과 장점

2.1 특징

  • 라이프사이클을 인식: 활성 상태의 라이프사이클에서만 데이터를 업데이트하고, 비활성 상태에서는 업데이트를 건너뜁니다.
  • 메인 스레드에서 사용: 메인 스레드에서 바로 UI를 업데이트할 수 있습니다.

2.2 장점

  • 메모리 누수 방지: 옵저버 패턴을 통해 올바른 라이프사이클에서만 업데이트되므로 메모리 누수 가능성이 낮습니다.
  • 자원 효율성: 화면이 활성 상태일 때만 데이터를 업데이트하므로 불필요한 자원 소모를 방지합니다.

3. LiveData를 사용한 MVVM 아키텍처 구현

3.1 ViewModel 구현

// MyViewModel.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {

    // MutableLiveData를 사용하여 데이터의 변경을 감지
    private val _data = MutableLiveData<String>()
    val data: LiveData<String>
        get() = _data

    fun updateData(newData: String) {
        // 데이터 업데이트 시 MutableLiveData에 값을 할당
        _data.value = newData
    }
}

3.2 UI에서 ViewModel과 LiveData 사용

// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import kotlinx.android.synthetic.main.activity_my.*

class MyActivity : AppCompatActivity() {

    private lateinit var viewModel: MyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my)

        // ViewModel 초기화
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        // LiveData를 관찰하여 UI 업데이트
        viewModel.data.observe(this, Observer {
            textView.text = it
        })

        // 데이터 업데이트
        buttonUpdate.setOnClickListener {
            viewModel.updateData("New Data!")
        }
    }
}

4. LiveData의 확장성

LiveData는 안드로이드 앱의 규모가 커질수록 더 큰 가치를 발휘합니다. LiveData는 안드로이드 앱의 아키텍처를 확장 가능하게 만들어주어 유지보수가 용이하며, 효율적인 개발을 가능케 합니다.

5. LiveData의 활용 예시

5.1 어떻게 LiveData를 사용할까?

LiveData는 주로 데이터 관찰을 통해 UI 업데이트를 처리하는 데 활용됩니다. 아래는 실제 앱에서 LiveData를 사용한 예시입니다.

5.2 실시간 채팅 앱에서의 LiveData 활용

5.2.1 ViewModel에서의 LiveData 활용

// ChatViewModel.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class ChatViewModel : ViewModel() {

    // 채팅 메시지를 저장하는 MutableLiveData
    private val _chatMessages = MutableLiveData<List<String>>()
    val chatMessages: LiveData<List<String>>
        get() = _chatMessages

    // 메시지를 추가하는 함수
    fun addMessage(message: String) {
        val currentMessages = _chatMessages.value.orEmpty().toMutableList()
        currentMessages.add(message)
        _chatMessages.value = currentMessages
    }
}

5.2.2 UI에서의 LiveData 활용

// ChatActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import kotlinx.android.synthetic.main.activity_chat.*

class ChatActivity : AppCompatActivity() {

    private lateinit var chatViewModel: ChatViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_chat)

        // ViewModel 초기화
        chatViewModel = ViewModelProvider(this).get(ChatViewModel::class.java)

        // LiveData를 관찰하여 UI 업데이트
        chatViewModel.chatMessages.observe(this, Observer { messages ->
            // 채팅 메시지 업데이트
            updateChatUI(messages)
        })

        // 사용자가 메시지를 입력하고 전송할 때
        buttonSend.setOnClickListener {
            val newMessage = editTextMessage.text.toString()
            chatViewModel.addMessage(newMessage)
            editTextMessage.text.clear()
        }
    }

    // UI 업데이트 함수
    private fun updateChatUI(messages: List<String>) {
        // 채팅 메시지를 UI에 표시
        // (예: RecyclerView, TextView 등을 활용하여 구현)
    }
}

위의 예시에서는 ViewModel이 LiveData를 사용하여 실시간으로 채팅 메시지를 업데이트합니다. UI는 LiveData를 관찰하여 메시지가 추가될 때마다 자동으로 업데이트되며, 사용자는 EditText를 통해 메시지를 입력하고 전송할 수 있습니다. 이러한 방식으로 LiveData는 실시간 상호작용이 필요한 부분에서 효과적으로 활용될 수 있습니다.

6. LiveData의 활용 예시: 실시간 데이터 업데이트

LiveData를 사용하여 실시간으로 데이터를 업데이트하는 예시를 살펴보겠습니다. 이 예시에서는 데이터 소스가 변경될 때마다 UI가 자동으로 업데이트되는 간단한 앱을 만들어 보겠습니다.

6.1 데이터 모델 클래스

// User.kt
data class User(val id: Int, val name: String)

6.2 Repository 클래스

// UserRepository.kt
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData

class UserRepository {

    // 가상의 데이터 소스
    private val usersData = mutableListOf<User>()

    // MutableLiveData를 사용하여 데이터 변경을 감지
    private val _usersLiveData = MutableLiveData<List<User>>()
    val usersLiveData: LiveData<List<User>>
        get() = _usersLiveData

    init {
        // 초기 데이터 추가
        usersData.add(User(1, "Alice"))
        usersData.add(User(2, "Bob"))
        usersData.add(User(3, "Charlie"))

        // 초기 데이터를 LiveData에 할당하여 UI 업데이트
        _usersLiveData.value = usersData
    }

    // 새로운 사용자 추가
    fun addUser(user: User) {
        usersData.add(user)

        // 변경된 데이터를 LiveData에 알림
        _usersLiveData.value = usersData
    }
}

6.3 ViewModel 클래스

// UserViewModel.kt
import androidx.lifecycle.ViewModel

class UserViewModel : ViewModel() {

    private val userRepository = UserRepository()

    // LiveData를 통해 데이터를 UI에 노출
    val usersLiveData = userRepository.usersLiveData

    // 사용자 추가
    fun addUser(user: User) {
        userRepository.addUser(user)
    }
}

6.4 UI에서 ViewModel과 LiveData 사용

// MainActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private lateinit var userViewModel: UserViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // ViewModel 초기화
        userViewModel = ViewModelProvider(this).get(UserViewModel::class.java)

        // LiveData를 관찰하여 UI 업데이트
        userViewModel.usersLiveData.observe(this, { users ->
            // UI 업데이트 로직
            displayUsers(users)
        })

        // 사용자 추가
        buttonAddUser.setOnClickListener {
            val newUser = User(4, "David")
            userViewModel.addUser(newUser)
        }
    }

    private fun displayUsers(users: List<User>) {
        // 사용자 목록을 UI에 표시하는 로직
    }
}

이 예시에서는 UserRepository 클래스가 가상의 데이터 소스를 가지고 있고, 해당 데이터의 변경을 MutableLiveData를 통해 UserViewModel으로 전달합니다. UI는 UserViewModel의 usersLiveData를 관찰하고, 데이터의 변경이 감지되면 자동으로 업데이트됩니다. 사용자가 "Add User" 버튼을 누를 때마다 새로운 사용자가 추가되고, UI가 실시간으로 갱신됩니다.

이처럼 LiveData는 데이터의 실시간 업데이트를 쉽게 처리할 수 있도록 도와주며, 이러한 유연성은 안드로이드 앱의 다양한 상황에서 활용될 수 있습니다.
Happy coding! Skill UP!! 🚀

728x90
반응형
LIST
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함