Development

- 최근 내가 구성한 클린 아키텍처의 레이어는 프레젠테이션 - 도메인 - 데이터 레이어로 구성된다. - 여기서 도메인이란 무엇일까? 바로 비즈니스 로직과 함께 앱의 핵심적인 규칙을 정의하는 레이어다. - UseCase가 포함되며 UseCase는 애플리케이션의 구체적인 비즈니스 규칙을 캡슐화한 것이다. - 앱의 기능적인 부분이 변경된다? 이 도메인 레이어를 수정하게 된다. - 여기서 기능을 명확히 보자1. 사용자에게 스켈레톤 효과를 보여준다.2. 사용자에게 유저 데이터 조건 처리를 통해 이벤트 목록을 추천한다.3. 사용자가 선택한 이벤트를 로컬 DB에 저장한다. - 1번의 경우에는 순수 UI 동작이다. 안쪽 레이어로 들어올 이유가 없다. - 3번의 경우에는 로컬 DB에 저장하는 순수 서비스의 기능이다. 데..
Scaffold란?- Scaffold는 TopBar, BottomBar, FAB 등 전용 슬롯을 가지고 화면의 뼈대를 만들어주는 컴포저블이다.@Composablefun Scaffold( modifier: Modifier = Modifier, topBar: @Composable () -> Unit = {}, bottomBar: @Composable () -> Unit = {}, snackbarHost: @Composable () -> Unit = {}, floatingActionButton: @Composable () -> Unit = {}, floatingActionButtonPosition: FabPosition = FabPosition.End, containerC..
- 서비스 기능 중에 Custom Tabs로 자사 서버에서 제공해 준 url을 열고, 앱링크로 데이터를 수신받아 다시 앱을 열어주는 로직이 있었는데, 디바이스 기본 브라우저가 파이어폭스면 이 앱링크가 동작하지 않는 문제가 있었다. - 찾아보니.. 파이어폭스 자체 앱 말고 사이드 브라우저 통해서는 앱링크를 지원하지 않는 것으로 보인다....;https://connect.mozilla.org/t5/ideas/firefox-for-android-deep-link/idi-p/23741 Firefox for android - deep linkHello! I use firefox very long time - from version 6 or ssomething like this, i very love this br..
- 안드로이드에서는 Background Task 수행이 메모리, 배터리 등의 자원 문제로 제한적이다. - 기본적으로 안드로이드는 리눅스 커널 기반 운영 체제인데, 리눅스와는 달리 디스크 스왑 파티션이 없다. - 스왑 파티션 (Swap Space)이 무엇이냐? 램이 가득 찼을 때 사용되는 곳으로 메모리 상의 비활성화 데이터를 스왑 파티션으로 이동시킨다. - 하지만 그렇다고 스왑 파티션 자체가 램의 용량을 늘린다고는 할 수 없다. 액세스 타임이 느린 HDD 레벨에 존재하기 때문이다.- 안드로이드는 기본적으로 이 Swap Space가 없기 때문에 시스템이 메모리를 많이 잡아먹는 프로세스에 대해 백그라운드 동작을 하지 못하도록 강제 종료하고 여유 메모리를 확보한다. - 모든 프로세스는 액티비티 매니저가 부여한 ..
- 데이터를 로컬이나 서버로부터 가져오는 접근자인 데이터 소스 - 기존 프로젝트에서 급하게 먼저 출시하느라 DataStore에 값을 저장하고 가져오는 로직이 object로 단순하게 구성되어 있었다.object SettingsDataStore { private val Context.dataStore by preferencesDataStore(name = "settings") private val LAST_TRAIN_KEY = booleanPreferencesKey("last_train_enabled") private val DEST_ID = stringPreferencesKey("destination_id") private val DEST_NAME = stringPreferencesK..
- 백그라운드 작업을 예약하고 수행하기 위한 Jetpack 요소인 WorkManager를 클린 아키텍처 + Hilt 구조 프로젝트에 사용해 봤다.HiltWorker 구성- 먼저 WorkManager에 대한 gradle 의존성을 추가하되, Hilt worker에 대해서도 같이 추가해주어야 한다.implementation("androidx.hilt:hilt-work:1.2.0")implementation(libs.androidx.work.runtime.ktx)- Hilt와 Worker 간 브리지 역할을 해주는 설정이다. - Worker를 구성해 준다.@HiltWorkerclass JibroWorker @AssistedInject constructor( @Assisted context: Context, ..
- 최근 개인 제작 앱을 구글 플레이 스토어에 등록 심사를 요청했는데, ACCESS_FINE_LOCATION 권한에 대한 허가가 필요한 이유를 사용자에게 구체적으로 제공해야 한다고 하여 거절당했다. - 가볍게 Toast로 위치 권한이 필요합니다. 정도로는 납득시킬 수 없고, 적절한 기능 예시와 함께 사용자에게 권한 허가를 요청해야했다. - 먼저 해당 권한에 대한 기능 관련 화면 스크린숏을 3장 정도 수집했다. 그리고 drawable에 추가. - 나는 수평 슬라이드 페이징을 통해 예시 화면을 보여주고자 했다. - 대충 슬라이드 페이징 - 제목 - 설명 - Yes or No 버튼을 수직으로 배치하고자 Column을 최상단에 약간의 padding을 넣어 선언했다.Column( modifier = Modi..
- 서비스의 기존 로직에 UI 로직과 DB 접근, 네트워크 로직을 복잡하게 모두 차지하고 있는 Manager 클래스가 있었다. - 작업 시에 혼동이 오고 유지보수다 어렵다 보니 에러 발생 시 찾기가 쉽지 않았고, 스레드에 대한 문제도 빈번하게 발생하고 있었다. - 어느 정도 간단한 DB 접근은 문제없다 해도 데이터가 많다면 ANR이 발생.. 이를 위해 비동기 처리가 누락된 부분을 탐색했지만 매니저 클래스를 나눠버리는 게 나을 것으로 확인되었다.- 아예 MVVM 패턴을 적용하도록 했다. 내부의 DB 쿼리 작업들이 명시된 ~DAO 클래스들은 내부적으로 AppContext를 사용하고 있는데, 이 의존성을 전부 해결하려면 상당한 시간이 걸려.. 일단은 당장 ANR 문제를 해결하기 위해 Hilt 없이 MVVM 패..
- Polling에 대한 로직을 구성하면서 여러 화면에 한 번에 폴링에 따른 변경 사항을 전파할 수 있는 Event Bus 라이브러리를 사용했다.https://github.com/greenrobot/EventBus GitHub - greenrobot/EventBus: Event bus for Android and Java that simplifies communication between Activities, Fragments, ThreadEvent bus for Android and Java that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality. - green..
- 폴링은 특정 조건이 충족될 때까지(또는 최신 상태를 얻기 위해) 일정 간격으로 서버나 작업 상태를 반복 조회해 변화가 있으면 처리하는 방식이다. - 서버에서 비동기로 처리 중인 데이터가 있다면 그 처리 상태를 클라이언트에서 주기적으로 확인하는 시스템이 필요했다. - 먼저 object class로 Polling Manager를 선언했다. 그리고 멀티 스레드 상황 처리에 대한 SynchronizedList를 기반으로 대상 데이터 타입을 기반으로 한 리스트를 선언했다.object PollingManager { private val pollingList = Collections.synchronizedList(mutableListOf())- Collections.synchronizedList(...)는 ..
SeungYong.Lee
'Development' 카테고리의 글 목록 (2 Page)