전체 글 243

컴포즈의 Side-Effect 형제들에 대해서 알아보자 - 1

컴포즈에는 side effect 라는 개념이 존재한다. 단어의 원래 뜻은 부작용이라는 뜻인데 왜 이런 명칭을 붙였는지 의아하긴 했는데 찾아보니 composable 은 단방향으로 state 를 전달하는게 기본인데 전달되는 방향 반대로 상태를 변경해야하는 상황도 지원하기 위해 side effect 라는 개념을 도입했기 때문에 이런 이름이 붙었다고 한다. 요약을 해보자면 side effect 는 Composable 에서 자신이 아닌 외부의 상태에 영향을 발생시키는 것이겠다. 보통 flow 를 사용해서 특정 이벤트를 collect 하면 외부의 상태를 변경하는 경우가 일반적인 예라고 할 수 있겠다. Side Effect 를 지원하기 위한 다양한 API LaunchedEffect rememberCoroutineSc..

Jetpack Compose CompositionLocal 에 대해 알아봅시다

컴포즈를 사용하다보면 종종 CompositionLocal 을 마주치곤 한다. 테마를 커스텀하고 싶을때 사용하곤 했는데 CompositionLocal 은 어떻게 동작하길래 테마 커스텀에서 사용됐는지 개념을 알아보자. CompositionLocal 이 필요한 이유 컴포저블 함수들은 트리형태로 구성된다. 그래서 상태의 관리를 편하게 하기 위해서 보통 상태 호이스팅이라는 개념으로 상위 노드에서 관리하고 하위 노드로 전파한다. 그런데 극단적으로 트리의 깊이가 100개면 어떨까. 이 상태를 아래까지 다 전파하는건 쉽지 않을거다. 이때 CompositionLocal을 유용하게 써먹을 수 있는데 너무 대충 그렸지만 아래 같은 느낌으로 컴포지션로컬의 영역에 있는 컴포저블끼리는 하위에서 상위 노드의 상태에 접근하도록 제공..

DeepDive Android

새로 카테고리를 만들었다. 안드로이드 개발자랍시고 습관적으로 사용하는 것들이 어떻게 내부적으로 동작하는지 모르고 사용하던 나의 무지함을 조금이라도 덜어내기 위해 처음부터 공부한다는 마음으로 내부 코드들을 깊게 들여다보고 이해하기 위해 만들어진 카테고리다. 잘못 이해하는것도 있고 완벽하게 이해하지 못하는 것도 있겠지만 원리를 이해하려는 노력들이 적힐 예정이다.

스와이프 삭제 구현

이미 쓴 글이 있지만 솔직히 너무 별로라서 새로 만들어봤다. (솔직히 내가 만들어놓고도 이건 좀.. 하고 있었음) 2024.01.14 - [Android/Android Compose] - [안드로이드 컴포즈] 스와이프 삭제 구현 핵심 키워드는 DraggableAnchors, AnchoredDraggableState 이고 구현에 관심이 있다면 위 검색어로 찾아보면 훨씬 쉽고 자연스럽게 뚝딱하고 만들 수 있다. @OptIn(ExperimentalFoundationApi::class) @Composable fun SwipeScreen( contentComposable: @Composable () -> Unit, buttonComposable: @Composable () -> Unit, buttonModifie..

[안드로이드 컴포즈] 스와이프 삭제 구현

안드로이드 컴포즈에는 SwipeToDismiss 라는게 이미 만들어져 있다. 레이아웃을 옆으로 밀면 밀어낸 반대 방향에 버튼이 생기는 레이아웃 같은걸 만들때 쓴다. 하지만? 나는 또 다른 디자인으로 만들고 싶었다. 찾아보면 이걸 사용해서도 방법은 있겠지만 그냥 내가 생각나는대로 만드는게 빠를거 같아서 만들어봤다. 혹시나 구글이 준비해준 SwipeToDismiss 가 맘에 안드는 사람들에게 귀찮음을 덜어줄 수 있었으면 한다. 만드려는 레이아웃은 이렇다. 순서는 아래와 같다. 1. 스와이프 했음을 인지하는 방법 2. 스와이프한 값을 이용해서 컴포넌트를 스와이프 한 방향으로 옮기는 방법 3. 삭제 버튼을 나오게 하는 방법 @OptIn(ExperimentalMaterial3Api::class) @Composab..

안드로이드 컴포즈 dialog 커스텀 하기

안드로이드 컴포즈에서 제공하는 AlertDialog 를 사용하면 간단하게 뚝딱 dialog 를 만들 수 있지만 정해진 틀에 맞춰서 사용해야하는 문제가 있다. 나는 역시나 고집을 부려서 커스텀을 하고 싶었는데 어떻게 만들었는지 간단히 정리하려한다. 먼저 Dialog의 기본 형태를 잡아보자. 아래 코드를 살펴보자. @Composable fun DialogComponent( onDismissRequest: () -> Unit, visible: Boolean, height : Dp, content: @Composable () -> Unit ) { if (visible) { //커스텀하려면 AlertDialog 말고 Dialog를 써준다. Dialog( onDismissRequest = { onDismissReq..

안드로이드에서 FFMPEG로 m3u8 to mp4 하기

영상 플랫폼에서 일을 하다보니 m3u8 을 접할 기회가 많아졌다. 사실 우리도 모르게 많은 영상 플랫폼에서 m3u8 을 접하는데 유튜브,아프리카tv, 트위치 등 보통 많은 서비스들이 이를 채택하고 있다. 그 이유는 mp4로 재생할 경우에는 파일을 전부 다운로드 받아야 재생이 가능해서 4분짜리 영상을 앞부분 3초만 볼건데도 다운을 기다려야하고 불필요한 데이터도 낭비하게 한다. 그것을 m3u8 파일은 n초 간격으로 파일을 잘라서 보관하기 때문에 모두 다운받지 않고 필요한 만큼만 다운로드 받아서 볼 수 있게 해준다. 그러나 m3u8 파일을 재생하는 플레이어가 없다면 m3u8 파일은 일반적인 기기에서 실행하기 어렵다. 나같은 경우는 영상의 썸네일을 몇초 간격으로 추출할 필요가 있었는데 m3u8 파일은 특정 라이..

Android 2023.12.02

Android Room Entity Relation

프로젝트를 하다보면 서버를 거칠 필요없이 앱 내부에서만 사용하는 데이터를 관리하고 싶을때가 있다. txt 파일로 앱에 저장하거나 SharedPreferences 를 사용하거나 DataStore 를 사용하거나 여러 방법이 있겠지만 간단하게 저장만을 위한 것이 아닌 많은 데이터들을 좀 더 사용하기 편한 방식으로, 또는 데이터간의 관계를 가지기 위해서는 Room 을 사용해야한다. Sql 에 대한 지식이 있는 사람이라면 간단한 쿼리를 적는건 어렵지 않을 수 있겠지만 나의 경우엔 정말 간단한 쿼리만 적어서 사용했고 1:N 관계나 외래키 등록같은건 Room 에서 다룰일이 없었는데 이번에 사용할 기회가 생겨서 적어보려 한다. Entity(table) 간의 관계 정의하기 room의 관계형 쿼리는 현재 2가지 방식을 통..

Android 2023.12.02

이직 후 근황

영상 플랫폼에서 일한다는건 꽤나 앱개발자로서 흥미롭다. 간단하게 영상 출력해보는 정도로 써본 exoplayer 가 전부였는데 컨버팅, 코덱, ffmpeg , trim , crop , 카메라 등등... 여러가지를 접해보고 있다. 여러 가지 프로젝트를 동시에 하는거보다 하나의 서비스에 몰입해서 애정을 가지고 개발하고 있는 점도 즐거움중에 하나다. 이미 라이브되고 있는 서비스다보니 업데이트 템포를 쫒아가랴 기존의 많은 코드들을 이해하고 익히는데 시간이 좀 걸렸지만 이제는 확실히 적응이 되어가는거 같다. 아직도 공부가 부족해서 헤매는 부분이 있긴하지만 어찌저찌 도움 받으며 해결해나가고 있다. 사이드 프로젝트 이야기를 좀 하자면. 이전에 하던 사이드 프로젝트는 이유는 모르겠지만 어째선가.. 팀원들이 다들 바쁘기도..

잡담 2023.11.16

라이브러리 배포 후 적용을 하려는데 NoClassDefFoundError ?

아마 라이브러리 배포를 처음 해봐서 바보 같은 실수를 한거 같다. aar 로 라이브러리 배포가 됐는데 데모앱에서는 잘됐는데 왜 실제 프로젝트에서는 안되는거야? 하면서 NoClassDefFoundError 를 만났는데 이는 aar 은 라이브러리에 작성된 리소스는 불러오지만 라이브러리에 종속되어있는 다른 라이브러리는 불러오지 않기 때문. 라이브러리 내부에는 적용되어있지만 실 프로젝트에 없는 라이브러리를 적용시켜주었더니 해결. 쓰고보니 뭔가.. 예전에 이런 글을 봤던거 같기도 하네

Android 2023.11.16