본문 바로가기

Android/Trouble Shoot

(8)
Third-Party-Library 없이 영상으로부터 빠르게 프레임 추출하기 (feat.YUV) 동기 네이버 부스트캠프에서 진행 중인 그룹 프로젝트가 드디어 개발 막바지 단계에 이르렀습니다. 영상 업로드 기능을 구현하면서, 영상의 썸네일을 추출하고 함께 전송하는 기능도 구현하였습니다. 해당 과정에 대해서는 다음 포스트에 자세히 기록되어 있습니다. Third-Party-Library 없이 비디오 컷 편집 기능 구현하기 동기 네이버 부스트캠프의 꽃, 그룹 프로젝트를 개발하고 있습니다. 실력있는 동료들과 함께 비디오와 관련된 앱 서비스를 기획, 디자인, 개발하고 있는데요. 제가 낸 주제이기도 하고, 비디오 blothhundr.tistory.com 위 포스트에는 썸네일을 얻어 오기 위해 MediaCodec 과 MediaMetadataRetriever 를 두고 고민했던 과정이 담겨있는데요. 당시에는 Medi..
AccessToken 재발급과 예외 처리 (feat.Ktor) 동기 예외는 전형적이지 않은 경우나 사건을 의미합니다. 프로그래밍을 하다보면 정말 수없이 겪게 되는 것이 예외 상황인데요. 오늘은 Ktor 와 JWT 사용에 있어서 발생할 수 있는 예외 상황에 대한 처리를 하였습니다. 그 과정 중 저는 어떤 문제를 만났고, 어떤 고민을 했는지, 또 그 고민을 어떻게 해결하였는지에 대해 포스팅하려 합니다. 주니어 개발자(지망생?)의 시선이므로, 잘못된 내용이 포함될 수 있어 해당 포스트에서 나올 기술적인 부분에 대해 참고하시는 것은 고려해보시면 좋을 것 같습니다. 요구 사항은 무엇이었나? 서버의 API 를 이용하기 위해 JWT 를 활용하는 상황입니다. 모든 API 통신에 대해 AccessToken 이 요구되고, AccessToken 이 만료되면 RefreshToken 을 ..
[Jetpack Compose] List 아이템의 필드 변경이 Recomposition 을 트리거 해야 할 때 어떤 이슈가 있었나? List 내 원소의 필드를 직접 수정하여 UI 를 업데이트 하려 하였으나, 생각하는 대로 되지 않았습니다. 당연히, 해당 List의 객체가 이전의 객체와 같으므로 UI 업데이트가 진행되지 않았으리라 판단하고, 해당 List에 대해 toMutableList() 메서드를 사용하여 새로운 객체로 반환했습니다. RecyclerView 와 RecyclerView.Adapter 를 사용할 때에 이러한 문제를 해결할 수 있었으니까요. 분명히 List 객체도 변경해주었고 State 객체를 업데이트 해주었음에도 불구하고, UI 가 업데이트되지 않고 있습니다. 어떻게 해결하였나? List의 toMutableList() 메서드는 List를 새로운 객체로 반환하지만, List 아이템의 객체들까지 새로운 ..
[Jetpack Compose] LazyColumn, LazyRow 의 항목 삭제가 정상적으로 이루어지지 않는 이슈 개발 도중, 제목과 같은 이슈가 발생했습니다. 아래는 이해를 돕기 위한 영상입니다. 야키토리, 휘낭시에, 스시, 생고기 네 장의 사진을 불러왔고, 그 중 두 개의 사진을 삭제합니다. LazyList 의 itemsIndexed() 메서드를 사용했고, 리스트에서의 삭제를 위해 index 를 인자로 넘깁니다. 첫번째로는 스시를 삭제하고, 두번째로는 휘낭시에를 삭제합니다. 그렇다면, 남아있어야 할 사진은 야키토리와 생고기이지만, 실제로 삭제 후 화면에 남은 사진은 야키토리와 휘낭시에 입니다. 즉, 의도와 다르게 엉뚱한 이미지가 삭제되는 것(처럼 보이는 상황)입니다. 위와 같은 상황을 겪고 계신다면, 당연히 디버깅을 진행하셨으리라 생각합니다. 디버깅 해보신 분들은 아시겠지만, 리스트에서는 정상적으로 의도한 사진이..
[Jetpack Compose] Column 속 LazyColumn 의 OverScroll 을 막는 방법 Nested Scroll Jetpack Compose 에서는 자손 Composable 의 터치 및 스크롤 이벤트가 조상 Composable 로 전파됩니다. DND 8기로 활동하면서 개발 중인 앱에는 Column 내에 LazyColumn 이 포함되어 있는 형태의 화면이 있습니다. 해당 스크린 UI 개발을 마치고 커밋하기 전, 기기에 빌드하고 실행해봤습니다. 문제 없이 모든 부분 정상 작동하여 커밋하려고 했는데, LazyColumn 에서 스크롤을 Over 하게 수행하니 화면 전체에 해당하는 Column 이 스크롤되고 있었습니다. 기능상 심각한 문제는 아니었지만, 해결하지 않으면 유저가 예상하는 UX 와는 거리가 멀어질 것이라 판단했습니다. LazyColumn 의 스크롤이 끝나면 Column 의 스크롤이 진행..
[Jetpack Compose] LazyColumn/LazyRow/Pager OverScrollEffect 없애기. 개발중인 앱에서 HorizontalPager(LazyColumn, LazyRow, VerticalPager 모두 해당 됩니다.) 를 사용중인데, OverScrollEffect 가 적용되어 있어, Fancy 하지 못한 느낌을 줍니다. CompositionLocalProvider(LocalOverscrollConfiguration.provides(null)) { // Composable } 사용하고자 하는 Composable 을 위 CompositonLocalProvider 블록으로 감싸주면 됩니다. 주의할 점은, 여전히 체험판이기에 @OptIn Annotation 이 필요합니다. @OptIn(ExperimentalPagerApi::class, ExperimentalFoundationApi::class) C..
ViewModel 의 illegalStateException: Can not perform this action after onSaveInstanceState 앱 리팩토링 중 만나게 된 예외입니다. 위치 서비스 권한을 획득하기 위해 Callback 을 두고 Intent 로 위치 서비스 설정 창으로 이동합니다. 위치 서비스를 사용하도록 설정한 뒤 돌아와 즉시 ViewModel 을 참조하니 발생한 에러입니다. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState onSaveInstanceState() 이후에 해당 액션을 진행할 수 없다고 나옵니다. 이는 안드로이드 액티비티의 생명주기와 관련한 예외입니다. onSaveInstanceState() 에 액티비티에서 참조가 남아있는 객체들을 저장합니다. onSaveInstanceState() 는 onStop() 과 onD..
에이펙싱 버전 2.0.7 트러블 슈팅 컴퓨터를 켜면, 습관적으로 구글 플레이 콘솔에 접속하여 현재 적극 서비스 중인 '에이펙싱' 의 각종 KPI 를 둘러봅니다. 금일 오전, 여느 날과 다름 없이 에이펙싱이 순조롭게 서비스되고 있는지 확인하기 위해 플레이 콘솔에 접속했습니다. 그런데 이게 웬 걸? 116 개의 비정상 종료가 기록돼 있었습니다. 참 부끄러운 일입니다. 플레이 콘솔의 스택 트레이스는, 엔드포인트가 그다지 정확하게 기록되진 않습니다. 에러가 발생한 액티비티, 프래그먼트, 클래스가 어디인지 정도만 확인할 수 있는 경우가 대부분입니다. 즉, 소스의 길이가 길면 버그를 잡아내는 행위 자체가 굉장히 힘들어집니다. 다행히, 리뷰를 남겨주신 분과 컨택이 되어 대화를 나눠볼 수 있었습니다. 앱 기능을 사용하기 위해 필요한 유저 ID 를 전달받을..