항상 안드로이드 앱을 구현할 때 유지보수하기 쉽게 만드려면 어떻게 해야할까? 라는 생각을 많이 합니다. 핑계를 대자면 안드로이드 앱 개발자가 아니고, 취미로 앱을 만들기 때문에 앱 개발에 미숙하다는 것이고, 사실은 노력을 많이 안해서겠죠.
평소에 코드의 가독성을 향상시켜주고, Boilerplate 코드를 줄여주며, 유지보수가 쉽게 만들어주는 기술들을 배우려고 노력했습니다.
- Dependency Injection(DI): Dagger2
- Reactive Programming: RxJava
- Functional Programming
- Retrofit
- MVC, MVP, MVVM 등의 패턴들
- Android Architecture Component(AAC, Jectpack)
- Kotlin (Java 보다 짧은 코드로 구현 및 편리한 기능 ex. korutin)
각각 어떻게 사용해야 하는지 알겠지만, 이런 것들을 잘 사용했는지? 확신이 안서더라구요. 구현만 힘들고 막상 코드를 고치려니 좋은건지 잘 모르겠어요. 또, 제가 팀단위로 앱을 개발하지 않기 때문에 팀끼리 일할 때 장점이 있는 구조인지, 단점이 많은 구조인지 그런 것도 느끼기 어려웠구요.
Clean architecture에 도움이 되는 자료
기억은 안나지만 1년전에 안드로이드 Architecture를 어떻게 구현해야 하는지 예제와 함께 설명이 되어있는 블로그 글을 보았었는데요. 그 예제를 토대로 저의 앱을 refactoting해봤는데 제가 그 기술을 습득하기 어려웠었습니다. 그 글쓴이는 엄격한 설계를 바탕으로 앱을 개발하는데, 저 같은 초보자가 처음부터 그렇게 시작하는 것이 맞는지 의문이 들기도 했습니다.
최근에 우연히 Fernando Cejas님의 블로그를 알게 되었고, Fernando님이 생각하는 Clean Architecture와 그에 대한 샘플 앱을 볼 수 있습니다.
- Sample app(Kotlin): https://github.com/android10/Android-CleanArchitecture-Kotlin
- Clean architecture에 대한 설명(Kotlin): https://fernandocejas.com/2018/05/07/architecting-android-reloaded/
Java로 만든 Sample app과 포스팅도 있습니다. Sample app(Java)와
Clean architecture에 대한 설명(Java)를 참고해주세요.
Clean architecture
Fernando의 Clean architecture는 다음처럼 Layer가 나뉘어져 있습니다.
이런 구조는 다음과 같은 측면에서 도움을 줍니다.
- Problem solving.
- Scalability (확장성)
- Modularization (모듈화)
- Testability (테스트 가능한 코드)
- Independence of frameworks, UI and Databases.
Clean Architecture는 크게 3개의 architecture로 나눌 수 있습니다.
블로그를 보시면 간단하게 왜 이걸 사용해야 하는지, 어떤 장점이 있는지 설명이 되어있습니다. Dagger, MVVM 등의 패턴을 모르신다면 어려울 수 있기 때문에, 사전에 공부하시고 보셔야 합니다. 사용되는 각각의 기술은 알고 있지만, 함께 적용하는 방법을 모르시는 분들이 보시면 좋을 것 같습니다.
공부해야 할 것은?
이 블로그는 어떻게 안드로이드 구조를 설계해야하는지, 접근 방법에 대해서 알려주고 있습니다. 샘플 앱을 분석해보면서 왜 이렇게 구현했는지, 이렇게 구현하면 어떤 부분에서 장점이 될 수 있는지를 생각해봐야 할 것 같습니다. 지금까지 본 Architecture 글 중에서 이 글이 저에게 가장 도움이 되었습니다. 코드가 충분히 이해되었다면, 제가 만든 앱을 다시 리팩토링해보는 시간을 가져야겠습니다.
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력