본문 바로가기

Android51

2024 Android 앱 모듈화 가이드 (Modularization) 배경이번에 devfest에서 안성용 개발자님께서 발표하셨던 Android Modularization Recipe에 대해 보게 되었습니다. 기존에 제가 아는 Modularization은 아래 그림같은 형태로 app, feature, data, core 정도로 나눠서 구성했었는데 feature 단위가 커짐에 따라 어떻게 모듈을 구성해야할지, 재사용성과 빌드속도가 향상된 것인지 의아했던 부분이 있었는데 이번 기회에 저도 따라가면서 모듈 구조를 완성해보자 라는 생각에 학습하게 되었습니다.  기존 구성했던 방식과의 차이점대부분의 오픈소스 프로젝트를 보면 위의 사진과 같이 큰 묶음으로 모듈을 묶고 있는걸 볼 수 있었습니다. (ex. pokedex, nowinandroid)하지만 이렇게 개발했을 때 1개의 모듈에서 .. 2024. 4. 25.
[Android] Kakao Login 구현하기3 - MVVM+UiState 도입 이제 설정 이후 제대로된 구현 글입니다. 앞에 내용인 프로젝트 설정을 못보셨다면 링크를 참고해주세요! UI에서 카카오톡 구현 사실 앞에서 진행되었던 프로젝트 설정에 비하면 카카오톡 로그인 코드는 굉장히 쉽습니다. (링크) 버튼을 클릭했을 때 이 코드만 넣어주시면 바로 해결됩니다. (만약 설정부분에서 빠진 부분이 있다면 안되겠죠 ㅎㅎ) // 로그인 조합 예제 // 카카오계정으로 로그인 공통 callback 구성 // 카카오톡으로 로그인 할 수 없어 카카오계정으로 로그인할 경우 사용됨 val callback: (OAuthToken?, Throwable?) -> Unit = { token, error -> if (error != null) { Log.e(TAG, "카카오계정으로 로그인 실패", error.. 2023. 9. 30.
[Android-Test] Android Compose Test 도입하기 - 실전 배경 이번 포스팅에선 CodeLab에서 제공하는 Compose Test를 기준으로 정리해보려고 합니다. 테스트를 따라가기에 앞서 컴포저블 함수들이 어떻게 이뤄져있는지 파악해보겠습니다. Rally의 구조 Rally 앱은 RallyTopAppBar와 현재 screen의 content로 구성되어 있으며 AppBar에서 탭을 클릭 시 해당 화면으로 변경됩니다. CodeLab 테스트에선 OverviewBody에 대한 테스트를 진행하므로 Overview 화면을 기준으로 표시했습니다. 간단한 UI 테스트 만들기 CodeLab에선 Account bar가 잘 클릭되는지 테스트를 진행합니다. @Test fun rallyTopAppBarTest() { val allScreens = RallyScreen.values().to.. 2023. 9. 27.
[Android-Test] Android Test코드 작성하기1 - JUnit 배경 안드로이드 개발을 하다보면 테스트코드를 작성하지 않고도 UI와 로직을 구현할 수 있습니다. 저 역시도 지금까지 이렇게 개발을 해왔는데 예전 코드를 리팩토링 혹은 에러를 수정할 때 내가 수정한 로직이 이전과 동일하게 작성하는지 체크하는 것이 매우 어려웠고, 실제로도 보장할 수 없다고 생각이 되어 지금부터 Test를 작성하는 법에 대해 공부해보려 합니다. 목표는 JUnit -> Espresso -> Coroutines Test -> Hilt Test -> 클린 아키텍처 적용 시의 Test 까지 정리해보려고 합니다! Junit이란? Unit Test는 말 그래도 단위 테스트로, Test Driven Development로 개발하게 되면 기능 단위별로 테스트 코드를 구성해야 합니다. 대표적인 Unit Te.. 2023. 9. 24.
[Android] Compose랑 Hot Stream은 어울릴까? 배경 스낵바나 토스트처럼 매번 노출되어야 하는 컴포넌트들을 위해서 SharedFlow를 사용했었는데 Compose에서 collect되지 않는 문제가 발생했습니다. 그 이유를 하나하나 파악해 보고자 합니다. 원인을 파악하기에 전에 잠깐! 제가 앞으로 테스트하는 환경의 ViewModel은 다음과 같이 통일하겠습니다 class MainViewModel : ViewModel() { private val _testFlow = MutableSharedFlow(replay = 1) val testFlow = _testFlow.asSharedFlow() fun inputTest(value: String) { viewModelScope.launch { _testFlow.emit(value) } } } XML + Shar.. 2023. 9. 19.
[Android] Multi-Module 구조에서 Navigation을 구현하자 (with DeepLink) 배경 이번에는 Multi-Module구조에서 Navigation을 적용하는 방법에 대해 정리해볼까 합니다. 제가 모듈화를 적용하면서 feature 단위로 모듈을 나눴을 때 2개의 feature 간의 의존성이 없기 때문에 어떻게 이동해야하는지 막막했던 경험이 있습니다. 다른 포스팅을 참고하려고 해도 이게 뭔소린가 싶은 내용도 있었고, 따라 적용해봤지만 좀 더 좋은 구조를 찾고 싶다는 마음이 생긴 적도 있었기에 제가 직접 구현하고 정리해서 이 글을 통해 다른 분들이 조금이나마 쉽게 Navigation을 적용하셨으면 합니다! ※ Compose가 아닌 일반 XML을 활용한 방식입니다. 만약에 Compose Navigation을 원하시면 댓글로 남겨주세요 ㅎㅎ 빠른 시일 내로 정리해보도록 하겠습니다! Naviga.. 2023. 9. 19.
[Intelij][Android][Git] 변경된 코드들을 관리하기 힘들 때 ChangeList를 활용해보자 정리 배경 이번 드로이드 나이츠 2023에 참여해서 Track1 Marton Braun 님이 발표하신 "Git Good with Android Studio"을 듣게 되었습니다. 그 중에서도 Intelij에서 제공되는 "New ChangeList"가 굉장히 편리해보여서 어떻게 활용할 수 있는지 정리해보고자 합니다. New ChangeList란?? Intelij 기반 IDE에서 commit 탭을 열어주면 Changes라는 항목이 있습니다. 해당 항목의 옵션을 열어보면 다음과 같이 New ChangeList, Delete ChangeList가 나오는 것을 보실 수 있습니다. Intelij에 따르면 ChangeList를 다음과 같이 설명합니다. Changelists are displayed in the Chan.. 2023. 9. 15.
[Android] Compose Navigation + Stateflow를 쓰는데 왜 리컴포지션이 계속 발생하지..? (1) 문제 배경 이번에는 제가 경험 했던 Compose Navigation과 Stateflow를 같이 사용했을 때 발생했던 문제에 대해서 작성해보려 합니다. 저는 Android Developer에서 제공되는 Compose Navigation의 NavHost를 참고했습니다. ViewModel의 경우 간단하게 다음과 같이 구성하겠습니다. class MyViewModel : ViewModel() { private val _test = MutableStateFlow(null) val test = _test.asStateFlow() fun update(check: Boolean?) { _test.value = check } } 화면 구성의 경우 StartScreen, A, B 화면을 두고 StartScreen에서 Vi.. 2023. 8. 7.
[Android] API 키 관리하기 - Groovy, KTS ApiKey를 왜 숨겨야 하는걸까? 깃허브의 모든 커밋과 리뷰는 기록이 남습니다. 만약 ApiKey와 같은 중요한 정보들이 제대로 처리하지 않고 기록에 남는다면 소중한 정보들이 노출되므로 조심해야 합니다. 이번 포스팅에서는 어떻게 하면 이런 정보들을 관리할 수 있는지에 대해 정리해보고자 합니다. 관리하는 방법 1. gitignore에 기록이 남지 않았으면 하는 파일들을 명시 우선, 가장 먼저 깃으로의 노출을 막아야할 것은 local.properties입니다. 우리는 여기에 API 키를 포함한 중요 정보들을 저장하고 관리할 것입니다. 그 이후에 /build 경로를 막습니다. 해당 경로에 BuildConfig가 존재하는데, 저희가 local.properties에서 키값을 불러오면 BuildConfig에 명시.. 2023. 2. 27.