목록전체 글 (105)
우찬쓰 개발블로그
라이브러리들 버전 정리좀 하려다가 어느순간 부터 :app:dependencies가 제대로 동작하지 않았다. 에러는 다음과 같았는데 * What went wrong:An exception occurred applying plugin request [id: 'com.android.library']> Failed to apply plugin 'com.android.internal.library'. > The configurator service has already configured the build analyzer service. To add execution time warnings, add them directly to the BuildAnalyzerService.* Try:> Run with --..
CardView안에 RecyclerView를 넣은 레이아웃 구조의 형태에서 CardView에만 클릭이벤트를 넣었는데도 RecyclerView의 아이템의 해당하는 영역에 클릭을하면 CardView에서 클릭이벤트가 발생하지 않는다. 적당한 xml 옵션이 없는거 같아서 (clickable, focusable 만으로는 해결이 안되는거 같음,,) 그냥 RecyclerView의 상위 ViewGroup을 하나 만들고 이 ViewGroup에서 TouchEvent를 인터셉트 하는게 빠른거 같았다. 기본적으로 터치 이벤트는 아래의 플로우로 하위 뷰까지 전달된다.클릭이벤트도 결국 아래 플로우를 응용한 구조이기 때문에 중간에 onInterceptTouchEvent를 true로 주면 그 아래까지 터치 이벤트가 전달이 되지 않기..
저자 조세영 코루틴 관련 문서나 책은 많이 읽었지만, 이렇게 깔끔하게 정리된 책은 처음보는것 같다. 덕분에 머리에서 정리가 잘 안되어 있거나 헷갈리던 부분을 다시 되짚어 볼 수 있었다. 아래는 자주 잊어버리는 부분만 정리. 코루틴은 스레드 블로킹을 해결하기 위해 등장했다. 스레드를 양보할 수 있다. - 코루틴을 쓰레드로 보내기 위한 역할 Dispatchers.IO - 쓰레드 수 = JVM 프로세서수 or 64 중 큰 수 Dispatchers.Default - 쓰레드 수 = CPU 코어수 - CPU연산(CPU 바운드 작업)에 주로 사용. - CoroutineName - CoroutineDispatcher - Job - CoroutineExceptionHandler 코틀린 취소는 자식으로 전파됨 예외 thr..
Pull Request 에 Sonar 를 붙여서 새로운 코드의 Test Coverage가 60%가 넘지않으면 fail이 뜨도록 하는 Sonar 설정을 깃헙에 붙여서 쓰고있었다. 잘 쓰고 있던 와중에, 이상한 현상이 하나 발견되었는데, 내 로컬에서는 분명이 문제없게 돌아가는 테스트코드가 Pull Request Sonar를 깃 액션으로 돌리면, 특정 테스트코드의 ViewModel 생성부에 constructor에 Repository하나를 넣지않았다고 계속 컴파일 에러를 뱉는 것이었다. 그래서 pullRequest.yml에 빌드옵션도 넣어보고 캐시도 날려보고 별짓을 다했다. 거쳤던 사고회로 1. 깃 러너캐시가 꼬였나? 2. 내 로컬의 캐시가 꼬여서 안되야할 코드가 돌아갔나?(? 사실 돌아보면 말도안됨) 3. 소..
저자 마이클 투히크, 클라리사 옹 완벽주의는 결국 나의 스트레스의 주 원인이다. 왜 완벽주의를 쫒게 되었을까? 아마 사람들에게 받고 싶은 인정, 필요한 사람이 되기 위해서, 성취감이 좋아서.. 그런데 목표를 타인과 묶게되면 결과를 알기가 너무 어렵다. 이게 결국 스트레스의 주 원인이다. 가치를 쫒으라고 책이 얘기하는데, 가치가 타인에게 있으면 결국 타인을 쫒게된다. 그 타인이 내 질문에 귀찮아하거나 제대로 된 피드백을 주지 않으면 또 상처받는다. 그렇다면 결국 가치를 바꿔야 한다. 나의 행복을 가치로 두고 싶지만 그 행복 조차도 타인과 엮이는 경우가 대다수이다. 가정이 있다면 내 가정을 가치로 두고싶은데, 가정은 아직 꾸리지 못했다. 내 존재가치에 의미부여를 해주는 것에 가치를 두고싶은게 양보할 수 없는..
저자 - 마틴 파울러 추천을 많이 받아서 책은 가지고 있었으나 뒤늦게 읽게 된 책. 회사에서 레거시 코드 리팩토링을 할 일이 많아져서 휴가 기간동안 정독했다. 주니어때 읽었다면 많은 도움이 되었을거 같은데, 지금은 이미 거의 당연한 내용이 대부분이라 술술 훑었다. 개인적으로 생각한 가장 중요한 포인트는 테스트 코드가 꼭 있어야 된다는 점과 가독성을 신경써야한다는 점이다. 특히나 성능에서 조금 손해를 보더라도 가독성에 더 노력을 가하는게 좋다는 점이 매우 공감이 많이 된다. 변수명과 함수명을 지을때에도, 이 코드를 처음보는 개발자가 책읽듯 읽힐 수 있게 코드를 짜는 방향이 제일 좋아보인다.
1년에 한번 정도씩 까먹을때쯤 관련 이슈가 일어나서 그냥 정리해두기로.. LaunchMode Standard (default) - 항상 새로 생성. [push A] A [push B] A - B [push A] A - B - A [push A] A - B - A - A SingleTop - 최상단에 이미 그 Activity가 있을경우 그대로 사용. - 새로 호출시 onCreate 대신 onNewIntent가 호출됨. [push A] #SingleTop A [push B] A - B [push A] #SingleTop A - B - A [push A] #SingleTop A - B - A SingleTask - 같은 taskAffinity의 어떠한 Task stack 내에 이미 그 Activity를 가지고..
적당한 그림을 항상 못찾아서.. 저장용 refer https://medium.com/androiddevelopers/the-android-lifecycle-cheat-sheet-part-iii-fragments-afc87d4f37fd The Android Lifecycle cheat sheet — part III : Fragments In this series: * Part I: Activities — single activity lifecycle * Part II: Multiple activities — navigation and back stack * Part III… medium.com
저자 - Jorge Castillo Compose 구조를 알고싶어서 정독했다. 아쉽지만 영어 원서여서 좀 독해가 부족했을듯. 몇가지 정리사항 Compose는 리액트JS에서 영감을 받았다. Compose는 UI를 설명하는 트리이다. Composable 함수들은 프로그램 로직을 쓰도록 디자인된게 아니라 노드 트리의 변경사항을 설명하도록 디자인되었다. Compose는 Annotation Processor를 통하지 않음. Kotlin Compiler임 하드코딩 되는 뷰를 위해서는 @ReadOnlyComposable 를 적극적으로 사용할 수 있을듯. Subcomposition은 독립적인 invalidation을 위한것이다. 여러가지 반응형 애니메이션을 위해서 LookaheadLayout 을 사용할 수 있다. Mo..
ViewModel의 테스트 코드를 짜다가 ViewModel.launch에 delay가 있을경우, 시간차 문제로 테스트 코드가 도달하지 못하는 문제를 마주했다. advanceUntilIdle() 를 사용하면 해결될줄 알았건만 애석하게도 테스트코드는 계속 delay()의 다음으로 도달하지 못했다. 곰곰히 생각해보니 결국 Coroutine의 Context 와 관련된 문제일것 같아서 내 코드를 훑어보니, 아무생각없이 @Before에 넣어둔 아래 코드가 문제였다. Dispatchers.setMain(Dispatchers.Unconfined) StandardTestDispatcher() 로 교체 Dispatchers.setMain(StandardTestDispatcher()) 이후 advanceUntilIdle()..