목록분류 전체보기 (23)
안드로이드 개발일기
📙 remember와 rememberSavable둘 다 composable에서 값을 메모리에 기억하도록 해주는 compose 함수composable 내부에서 변수를 선언하면, recomposition 되서 ui가 다시 그려질 때 변수가 날라가기 때문에 데이터 저장이 필요함이때 remember를 쓰면 recomposition이 되어도 데이터가 날라가지 않음🧐 rememberSavable?- 화면 회전, 권한 변경과 같이 액티비티가 재시작하는 경우에도 값을 유지해야 한다면 사용- 내부적으로 Bundle에 저장할 수 있는 값만 지원해서, primitive type, Parcelable, Serializable 만 저장 가능- 만약 복잡한 객체를 저장해야 한다면 Saver 를 만들어야 함👩💻 어떻게 r..
freezed와 drift에서 사용하는 빌드 명령어가 다른 이유freezedflutter pub run build_runnerdriftdart run build_runner freezed, drift는 모두 '코드 생성'을 사용하는 라이브러리로, 베이스 코드를 작성하고 명령어 실행 시추가 코드를 포함하여 g.dart 파일을 자동 생성해준다. 이때 호출 방법의 차이가 있는데, 이는 라이브러리가 어떤 프로젝트(flutter or dart)에 의존하는지에 따라 달라진다.flutter 프로젝트에 의존(flutter와 함께 동작하는 패키지)이면 'flutter pub' 명령어를 사용한다. 빌드 명령어가 필요한 이유cf. Android주로 kapt, annotationProcessor가 빌드 프로세스에 포함되어 자..
CoroutineContext1. CoroutineContext- 코루틴의 실행 환경을 설정, 관리하는 인터페이스- 대표적으로 4가지 구성 요소가 있음 (1) CoroutineName: 코루틴 이름 (2) CoroutineDispatcher: 코루틴을 스레드에 할당해서 실행 (3) Job: 코루틴의 추상체, 코루틴을 조작하는데 사용 (4) CoroutineExceptionHandler: 코루틴에서 발생한 예외를 처리- Key, Value 형태로 각 구성요소를 관리 -> 중복 허용 x, 구성 요소는 하나씩만 존재- 더하기 연산(+)으로 객체 구성- 설정되지 않은 구성 요소는 설정되지 않은 상태로 유지- 같은 구성 요소가 둘 이상 더해지면 나중에 추가된 값을 사용val c1 = CoroutineName("M..
async와 Deferred 1. async 코루틴 빌더- Deferred 객체를 반환하는데, 코루틴으로부터 결과값을 수신할 때 사용- cf. launch: 결과값이 없는 Job을 반환 2. Deferred- Job 인터페이스의 서브타입으로 선언된 인터페이스- 그래서 Job 객체의 일종- Job 객체의 모든 함수와 프로퍼티를 사용할 수 있음 3. await - 결과값 수신을 대기할 수 있음 4. awaitAll- 복수의 async 코루틴 빌더를 실행하고 모든 결과값을 기다릴 때 사용 5. withContext- async-await 작업을 대체할 수 있음runBlocking { val job1 = async(Dispatchers.IO) { delay(1000L) return@async..
코루틴 빌더와 Job 1. Job 객체- 코루틴의 상태를 알 수 있는 객체- 코루틴을 제어할 수도 있음- 코루틴 빌더 함수 (runBlocking, launch 등)이 코루틴을 생성하면 Job 객체를 리턴 2. join, joinAll- 코루틴 실행이 완료될 때까지 호출부의 코루틴을 일시 중단함- 코루틴 간에 순차 처리가 필요한 경우 사용- joinAll은 여러 개의 Job 객체가 모두 끝날 때까지 일시 중단함 cf. delay- delay 함수는 Thread.sleep 처럼 일정 시간동안 지연시키는 역할을 하는데,- Thread.sleep은 지연시키는 동안 스레드가 블로킹되어 사용할 수 없는 상태가 되지만- delay는 지연을 수행하는 동안 다른 코루틴이 스레드를 사용할 수 있음 3. 지연 코루틴 (L..
3. CoroutineDispatcher1. CoroutineDispatcher- 코루틴을 스레드로 보내 실행시키는 역할- 자신에게 실행 요청된 코루틴을 작업 대기열에 넣고, 스레드풀에서 사용할 수 있는 스레드가 존재하면 코루틴을 보내 실행하게끔 만드는 역할- cf. 작업 대기열이 없는 CoroutineDispatcher도 존재 2. 제한된 디스패처 (Confined Dispatcher)- 사용할 수 있는 스레드나 스레드풀이 제한된 디스패처 (1) 단일 스레드 디스패처 (Single-Thread Dispatcher)- 사용할 수 있는 스레드가 하나인 디스패처== 스레드풀에 스레드가 하나val dispatcher: CoroutineDispatcher = newSingleThreadContext(name =..
1. 스레드 기반 작업의 한계와 코루틴의 등장1. JVM 스레드- 기본적으로 메인 스레드를 단일 스레드로 해서 실행- 보통 메인 스레드가 종료되면 종료-> 더 정확히는 사용자 스레드가 모두 종료될 때 종료되는데, 보통은 메인 스레드 하나에서 수행되므로 위와 같이 표현사용자 스레드- 우선 순위가 높은 스레드데몬 스레드ExampleThread().apply { isDaemon = true}.start()- 데몬 스레드는 우선 순위가 낮음- 사용자 스레드가 종료됐을 때 데몬 스레드가 강제 종료하지만 프로세스는 정상 종료 (Process finished with exit code 0) 2. 단일 스레드- 스레드 하나만을 사용하며, 다른 작업을 동시에 수행하지 못함-> 메인 스레드에서 시간이 오래 걸리는 작업을 ..

AppCheckFirebase의 Storage, Realtime DB 등 api에 접근해야 하는 상황에서승인되지 않은 클라이언트가 액세스하는 것을 방지하여 api 리소스를 보호합니다. 안드로이드에서는 PlayIntegrity, SafetyNet을 이용해 앱 체크를 적용할 수 있습니다. SafetyNet은 deprecated 되었기 때문에, 여기서는 PlayIntegrity 사용을 설명하겠습니다. Play Integrityplay integrity api는 사용자가 정품 android 기기에서, Google Play 등 정상적인 루트로 플레이 스토어의 서명이 된 정상적인 앱을 설치하여 실행한 것인지 확인합니다. 이 과정을 위해 플레이 콘솔에서 firebase 프로젝트 연결, firebase 콘솔에서 앱 등..

플러터에 흥미가 생겼다.간단한 앱을 만들어보고자 안드로이드 스튜디오에서 플러터를 사용할 수 있게 환경을 세팅해본다. 1. 플러터 plugin 설치 flutter 플러그인 설치 후 안드로이드 스튜디오를 재시작한다. 2. Flutter sdk 설치https://docs.flutter.dev/get-started/install/macos/mobile-android Start building Flutter Android apps on macOSConfigure your system to develop Flutter mobile apps on macOS and Android.docs.flutter.dev sdk를 설치 후 아래 명령어를 실행하여 sdk를 development 폴더 아래로 설정한다.unzip ~..
구현하고자 하는 기능 앱이 백그라운드에서 task를 수행하고, 완료되면 이벤트를 받아서 추후 로직을 수행한다.-> 앱이 종료되어도 재실행시 계속 수행해야 하므로 WorkManager를 사용-> 이벤트 수신을 위해 WorkManager.getWorkInfoByIdFlow를 사용 로직1. UseCase에서 WorkRequest를 만들고 WorkManager.enqeue에 넣는다.2. WorkManager의 일이 끝나면 이벤트를 받기 위해 Flow를 사용한다.3. 호출한 UseCase의 메소드는 WorkManager의 수행 완료 값을 가지고 Flow 형태로 반환한다.4. viewModel은 이를 consume하여 추후 로직을 수행한다. 코드UseCasesuspend fun doTask(): Flow { ...