2022. 10. 6. 21:53ㆍAndroid
멋진 설계를 가진 것은 프로그램이던 다른 어떤 것이건 감탄을 자아냅니다.
얼마 전에 개관 30주년을 맞은 환기미술관을 다녀왔는데요. 마침 설계도가 전시되어 있기도 했고, 박물관 곳곳에 왜 이렇게 박물관이 설계되었는지 설명이 잘 되어있어서 더욱 보는 재미가 있었습니다.
개발자는 프로그램을 설계합니다. 좋은 프로그램을 설계하고 싶은 것은 자연스러운 욕심일 것입니다. 아마 이 글을 읽으시는 분께서는 이런 갈증이 있어서이지 않을까 생각해봅니다.
안드로이드 개발에 있어서도 좋은 뷰는 어떻게 설계해야 하고, 왜 그렇게 되었는지 설명하는 글을 쓴다면, 읽는 누군가가 재미를 느낄 수 있지 않을까? 하는 작은 생각에서 이 글을 작성하게 되었습니다.
MVC, MVP, MVVM, MVI 까지… 정말 다양한 아키텍처가 있습니다. 하지만 빠지지 않고 들어가는 게 있죠. 바로 View입니다.
그렇기 때문에 올바른 View의 설계는 좋은 안드로이드 설계를 위해서는 필연적이라고 할 수 있는데요.
그렇다면 어떻게 해야 이 View를 잘 설계할 수 있을까요?
저는 View를 설계할 때 항상 “언제든지 파괴될 수 있다.”라는 대전제를 깔고 설계합니다.
아주 간단한 전제이지만, 이것으로 인해 많은 생각을 하게 되고, 조금 더 좋은 설계를 할 수 있게 되는 것 같습니다.
언제든지 파괴가 된다… 이런 상황에서 어떻게 해야 할까요?
한번 생각해봅시다. 철야작업을 하고 있는데, 밖에 천둥이 쳐서 자꾸 정전이 된다면 어떻게 하시겠습니까?
작업한 결과물이 날아가지 않도록, 혹시나 정전이 되어 컴퓨터가 꺼지더라도 언제든지 작업물을 복구할 수 있게 잘 저장하게 될 것입니다.
자, 이제 안드로이드 프로그래밍으로 다시 돌아와 봅시다.
언제든지 뷰가 파괴될 수 있는 상황이라면 우리는 어떻게 해야 할까요.
뷰는 보여줘야 할 상태가 저장된 곳(Single source of truth)에 있는 상태를 “보여주기만(View)” 하는 것으로 생각하는 것입니다. 그렇게 함으로써 뷰에 상태를 저장하지 않고, 상태는 다른 곳에 잘 유지(저장과 복구)함으로써 좋은 설계에 다가갈 수 있습니다.
다시 말해, 좋은 뷰의 설계는 뷰에 상태를 최대한 가지지 않음으로써 가능해진다는 것입니다.
요즘 선언형 UI 프로그래밍이 점점 떠오르고 있는데요. 사실 꼭 선언형 프로그래밍이 아니더라도 위 전제를 지킬 수 있습니다.
하지만 안드로이드에서 선언형 프로그래밍을 할 때 사용하는 Compose는 사용자로 하여금 상태를 뷰에 저장하지 못하도록 반강제 합니다.
바꿔 말하면, 아무리 Compose를 사용하더라도 Compose 컴포넌트에 상태를 마구 저장하면 Compose라는 껍데기를 쓴 명령형 UI 프로그래밍을 하는 것이 되는 것입니다.
선언형 UI 프로그래밍을 할 때는
“컴포넌트는 언제든지 파괴될 수 있으므로 상태를 저장하고 복원하자!”
라는 전제를 항상 잊지 않고 프로그래밍해야 합니다.
다시 MV* 시리즈로 넘어오면, 모든 뷰에 해당하는 것들을 설계할 때는, (계속해서 반복하고 강조하는) 상태를 가지지 않는 것 을 잊어선 안됩니다.
프래그먼트나 액티비티를 뷰로 사용하겠다는 마음을 먹었으면 프래그먼트나 액티비티에는 최대한 상태를 저장하지 않도록 하는 것이죠.
안드로이드는 보통 MVVM 아키텍처로 많이 개발하게 되는데요.
MVVM 아키텍처로 개발할 때 View에 상태를 가지지 않음으로써 (Viewmodel 에만 상태를 저장함으로써)
- Viewmodel 만 테스트하는 것이 가능해진다
- Viewmodel 은 뷰의 존재를 모르게 개발할 수 있다
- 그러므로 View와 Viewmodel의 의존성을 끊어낼 수 있다
- View가 파괴, 생성됨이 Viewmodel에 영향을 주지 않으므로 설정 변경에 유연하게 대응할 수 있다(화면 회전, 다크 모드 적용, 폴드 화면 펼치기 등)
다시 한번 복습해봅시다!
- 뷰는 보여줘야 할 상태가 저장된 곳 (Single source of truth)에 있는 상태를 “보여주기만(View)” 하는 것으로 생각하는 것입니다.
- 다시 말해, 좋은 뷰의 설계는 뷰에 상태를 최대한 가지지 않음으로써 가능해진다는 것입니다.
- 선언형 UI 프로그래밍을 할 때는, 컴포넌트는 언제든지 파괴될 수 있으므로 상태를 저장하고 복원하자!
'Android' 카테고리의 다른 글
[Androidx / Jetpack] Room 개요 및 사용법 (0) | 2020.08.30 |
---|---|
[Androidx / Jetpack] ViewModel 개요 및 사용법 (0) | 2020.08.30 |
[Androidx / Jetpack] LiveData 개요 및 사용법 (0) | 2020.08.30 |
의존성 주입 - Dagger, 모듈과 컴포넌트 (0) | 2020.08.17 |
의존성 주입 - Dagger 기초 예제 (0) | 2020.08.17 |