2024년 3월 5일 화요일

Room, Retrofit, Coroutines 을 이용한 Repository pattern

 Repository pattern은 애플리케이션에 있을 수 있는 여러 데이터 소스, 애플리케이션의 데이터가 내부 데이터베이스 또는 웹 API와 같은 외부 서비스로부터 기인하는 것을 숨기는데 사용되는 추상화입니다.

이 패턴은 Android 애플리케이션을 개발할 때 널리 사용되며, 애플리케이션을 만드는 데 권장되고 있습니다.

다음 다이어그램은 Android의 일반 모바일 애플리케이션 아키텍처를 표시합니다.

액티비티와 프레그먼트는 서로 다른 ViewModel의 인스턴스를 하나 이상 가질 수 있으며 없을 수도 있습니다. 각 ViewModel 은 특정 저장소(Repository)에 대한 종속성을 가지며 이 저장소는 여러 ViewModel 에서 공유될 수 있습니다.

저장소는 정보를 검색할 데이터 소스를 알고 있습니다. 이 경우 저장소는 SQLite의 상위 계층인 Room 모델과 웹 서비스와 통신하기 위해 Retrofit 에서 제공하는 서비스 인터페이스를 알고 있습니다.

각 레이어는 아래 레이어만 알고 있으며 ViewModel 은 저장소가 누구와 상호작용하는지 모릅니다.

알림을 작성하기 위한 EditText 와 알림을 추가하는 버튼, 샘플 액티비티를 살펴보겠습니다.

 
class CreateReminderActivity : AppCompatActivity() {

    val viewModel: CreateReminderViewModel by lazy {
        val app = application as ReminderApp
        val viewModelProviderFactory =
            CreateReminderViewModelProviderFactory(
                app,
                intent
            )
        ViewModelProvider(
            this,
            viewModelProviderFactory
        )[CreateReminderViewModel::class.java]
    }

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

        val reminderEditText: EditText = findViewById(R.id.reminderEditTextView)
        val createReminderButton: Button = findViewById(R.id.createReminderButton)


        createReminderButton.setOnClickListener {
            createReminder(
                text = reminderEditText.text.toString()
            )
        }
    }

    private fun createReminder(text: String) {
        if (text.isEmpty()) {
            showToast(message = "Reminder text field is empty")
        } else {
            viewModel.createReminder(text = text)
        }
    }

    private fun showToast(message: String) {
        ...
    }
}