0. 시작하며...
1. 모바일 앱 사용자 환경의 기본 개념
2. 그렇다면 어떻게 설계해야 할까?
3. 구글이 권장하는 아키텍처
0. 시작하며...
구조적으로 잘 구성된 앱을 만들려면 어떻게 해야 할까?
어떻게 해야 유지, 보수를 쉽게 할 수 있을까?
구글이 이에 대한 해답을 정리하여 공식문서에 정리해두었다.
그리고 이것을 Clean Architecture라 부른다. 깔끔하게 잘 만들어진 설계도쯤으로 해석할 수 있다.
오늘은 이 클린 아키텍처를 공부한 내용을 정리해보려 한다.
1. 모바일 앱 사용자 환경의 기본 개념
여러분들이 인스타그램을 사용하고 있다고 상상하며 다음 예시를 읽어보자.
- 남자 친구에게 사진을 공유하기 위해 사진 촬영을 눌렀다. 카메라 앱이 실행되며 사용자는 인스타그램을 나가지만 여전히 사용 환경은 끊임없이 연결된다.
- 오늘 영~ 컨디션이 별로라 사진빨을 안 받는 것 같다. 그래서 앨범을 클릭해서 갤러리 앱을 실행한다.
- 인스타그램으로 돌아와 사진을 공유한다.
이렇게 사용자가 앱을 잠시 떠나는 상황은 매우 흔한 상황이다.
만약 이 과정에서 전화가 오거나 알림이 오면 사용 환경이 중단될 수도 있다.
또, 스마트폰의 리소스는 제한되어 있으므로 운영체제가 공간이 필요하다고 판단하면 앱 프로세스를 종료하기도 한다.
잠시 앱을 떠났다고, 전화를 받고 왔다고 내가 작업하던 내용이 날아가는 걸 원하는 사용자는 아무도 없을 것이다.
이렇듯 사용자 혹은 운영체제가 앱 구성요소를 제거할 수 있기 때문에 우리는 앱 데이터나 상태를 앱 구성요소에 저장하면 안 되며 앱 구성요소가 서로 종속되면 안 된다. 이것이 모바일 앱 사용자 환경의 기본 개념이다.
2. 그렇다면 어떻게 설계해야 할까?
나 같은 초보 개발자가 하는 실수가 있다.
Activity랑 Fragment에 코드를 다 때려 박는 것이다. 이렇게 하면 생명 주기와 관련된 많은 문제가 발생한다.
이러한 UI 기반 클래스에는 UI 및 운영체제 상호작용을 처리하는 로직만을 포함해야 한다.
메모리 부족이라던지 등의 이유로 OS가 클래스를 제거할 수 있으므로 사용자의 원활한 앱 사용을 위해 UI 기반 클래스를 가볍게 유지하며 의존성을 최소화하는 것이 좋다.
그다음으로는 Model을 뷰 객체 및 앱 구성요소와 독립시키는 것이다.
Model이란 뷰에 표시될 데이터를 가지고 처리를 담당하는 구성요소를 뜻한다.
쉽게 말해 데이터와 관련된 걸 UI와 분리시키라는 말이다. 이렇게 함으로써 앱은 생명 주기와 관련된 문제를 피할 수 있다.
어떤 문제가 발생할 수 있는지는 생명 주기에 대해 다룬 포스팅에 언급한 적이 있다.
위 두 규칙으로 우리는 역할을 잘 분배하고 의존성을 낮추어야 하며 그래야 여러 문제로부터 벗어나고 유지/보수가 용이해진다는 것을 알 수 있다. 이 규칙을 지키는 아키텍처 패턴의 종류에는 MVC, MVP, MVVM이 있는데 앱 개발뿐만 아니라 여러 분야에서 쓰이는 개념이다.
아키텍처 패턴에 대해서는 더 공부해서 다음에 포스팅을 해봐야겠다. 오늘은 주제를 벗어나므로 패쓰
3. 구글이 권장하는 아키텍처
구글에서는 권장하는 아키텍처의 예시를 보여주며 모든 상황에 최적화된 아키텍처 패턴은 없으며 위 규칙을 잘 지키고 있다면 방법을 바꿀 필요는 없다고 설명하고 있다. 아래 내용은 하나의 모범 예시 정도로 보면 된다.
이 부분에 대해서는 권장 아키텍처를 실제로 사용해보고 작성할 예정이다.
구글이 설명한 내용은 이곳에서 볼 수 있다.
💡 알게 된 점
- 채용 공고에 맨날 쓰여있는 MVVM, 클린 아키텍처가 이런 뜻이었구나...
- 공식문서를 자주 읽자. 진짜 자세히 잘 설명되어 있다.
- 업데이트 좀 자주 하자. 안드로이드 스튜디오 구버전을 몇 년째 쓰고 있으니 이런 것도 모르지 바보야..
- View Model, Live Data에 대해 공부하면서 난 진짜 불편하게 더럽게 앱을 만들고 있었구나를 느꼈다.
📘 참고한 자료
'오늘은 뭘 배울까? > Android' 카테고리의 다른 글
RecyclerView + MVVM + Room을 연습해보자! (0) | 2021.03.11 |
---|---|
안드로이드 View Model(뷰 모델)을 공부해보자! (14) | 2021.03.08 |
코틀린 데이터 바인딩(Data binding) (0) | 2021.03.06 |
안드로이드 뷰 바인딩(view binding) (6) | 2021.03.05 |
[Kotlin] 뷰페이저2 활용 예제 : tabLayout, indicator, fragment, 자동 스크롤, 무한스크롤, 배너 등 (13) | 2021.02.27 |
댓글