전체 글 30

Recyclerview에서 ListAdapter 의 변경사항이 실시간으로 업데이트 되지 않던 이슈

지난 글에서 ListAdapter를 포스팅하며 DiffUtil에서 새로운 아이탬을 구별하거나, 아이탬의 내용이 같은지 구분하는 것을 설명한 적이 있다 해당 링크 : https://yk-coding-letter.tistory.com/8 문제 상황 그런데 최근, 개발을 하던 중 Room에서 변경사항을 recyclerview에 실시간으로 업데이트하려고 했으나 잘 작동하지 않았던 이슈가 있었다. 분명히 areItemsTheSame() 과 areContentsTheSame()을 제대로 작성했음에도 ui로 드러나지 않았고, 앱을 껐다 키거나 스크롤을 내렸다가 다시 돌아왔을 때야 비로소 변경되었다. 어떻게 이런 일이 발생할 수 있는 것인지 생각해보았다. 우선 나는 정확히는 Paging3의 recyclerview를 사..

Programming/Android 2021.11.24

GitHub에서 commit한 보안파일 히스토리 삭제하기

Github에서 다른 사람들에게 보여주고 싶지 않은 파일들이 있을 수 있다. 예를 들면 google-services.json (firebase의 푸시알림을 위한 데이터가 들어가 있어서 악용하려는 사람이 있다면 앱 사용자에게 악의적인 푸시알림을 보낼 가능성이 생긴다.) 또는 signing 관련 파일, 비밀번호가 저장된 파일이 그럴 수 있다. remote 에 push가 되지 않으면 베스트이지만 push된 상황에서는 이렇게 하면 된다. 첫번째로 ".gitignore"로 해당 파일/폴더가 github에 푸시되지 않도록 한다. 이미 푸시한 상태라면 github의 history를 통해 관련 내역을 볼 수 있기 때문에 아래와 같이 깃헙에서 완전히 삭제하는것이 안전하다. 두번째로 filter-branch 를 이용하여 ..

Programming/Github 2021.11.17

[Android] App 코드 난독화와 Gson으로 json 파싱이 안되는 이슈

코드 난독화를 하면 디컴파일, reverse engineering 을 어렵게 하여 보안상의 안정성을 높힐 수 있다. release앱에는 난독화를 하는 것은 좋은 방법이지만 debug모드에서는 굳이 해야할 필요는 없을 것 같다. (난독화를 하면서 빌드 시간이 증가한다고 한다.) 아무튼! Android Studio 에서 BuildType 별로 바라보는 서버 url 과 아이콘 등 분리할 것이 있었다. (Debug용, Release용) release 버전에서는 코드 난독화를 위해 모듈단의 build.gradle 에 minifyEnabled false 설정을 했는데 이상하게 앱을 실행시키고 통신 작업이 제대로 안되고 있다는 것을 알게 되었다. 구체적으로 어디서 문제가 발생한 것인지 찾아보니 minifyEnable..

Programming/Android 2021.11.16

'Open Source License' Activity plugin 적용하기

앱을 배포할 때, 오픈소스 라이선스는 Apache Lisence 2.0에도 고지의 의무가 있고 이를 무시하면 법적인 이슈를 받을 수도 있다. 이를 위해서 사용한 오픈 소스를 검토하고, 이를 앱 내에서 리스트로 보여주는 것은 여간 귀찮은 일이 아니다. 이를 위해 Google Play services에서 매우 쉽게 구현할 수 있는 plugin을 제공한다. (oss licenses plugin) 원문 링크 : https://developers.google.com/android/guides/opensource Include open source notices | Google Play services | Google Developers Google Play services sometimes includes, or..

Programming/Android 2021.10.14

RxJava + Retrofit 으로 통신 모듈 구현하기

RxJava3와 Retrofit2 를 사용하여 통신 모듈을 만들어보자 추가로 여기서 DI는 hilt를 사용했다. api는 ITunes Api를 사용하겠다. 샘플 코드로 적당한 api인 것 같다. 만들 클래스는 아래와 같다.(당장 api 통신을 하기에는 약간의 부가적인 것도 있지만 확장성을 생각해서 전부 설명하겠다.) - ITunesService - ITunesClient - NetworkModule ITunesService 이다. 반환형이 Single으로 둔 이유는 RxJava의 Observable중 Single이 한 번의 이벤트에서 사용될때 쓰이기 때문이다. 참고로 나는 여기서 한번 @Query의 어노테이션을 깜박하고 빼먹었는데 `No Retrofit annotation found. (parameter..

Programming/Android 2021.10.03

RxJava 적용기

RxJava는 러닝커브가 다소 있는 것으로 알려져 있다. coroutine+suspend fun 와 비교해서 높은 수준의 작업을 실시간으로 처리할 수 있고, coroutine Flow 와 비교해서 더 안정적인 프로그래밍을 할 수 있다는 장점으로 인해 배울 가치는 충분한 것 같다. 배워야할 개념도 많고 빠른 기간 내에 전부 이해할 것은 기대하지 않지만 LiveData에서의 observe, Flow에서의 일부 오퍼레이터 경험(맛보기) 이 있으니 어느정도는 유리하게 시작할 수 있지 않을까?ㅎㅎ 차근차근 시작해보자 중요한 개념 Observable / Observer RxJava에서는 Observable을 구독하는 Observer가 존재하고, Observable이 순차적으로 발행하는 데이터에 대해서 반응한다. o..

Programming/Android 2021.10.03

2021 Droid Knights 컨퍼런스 후기

2021 9월 25일 드로이드 나이츠 온라인 컨퍼런스에 참가했다. 작년에 참가했을 땐 무슨말인지 너무 어려워서 뛰쳐나갔는데, 이번엔 끝까지 들었다 ㅎㅎ;; 작년과 달라진 점은 참가료(만원)이 있다는 것과 개더타운으로도 접속할 수 있다는 것이 있다. 컨퍼런스 일정은 아래와 같다. Track1과 Track2가 동시에 실시간으로 유튜브 스트리밍 방송되며, 취향에 따라 선택해서 들을 수 있다. 각 강의가 끝나면 짧으면 5분? 길면20분? 정도의 쉬는 시간이 있는데 이때 개더타운으로 QnA를 받기도 했다. 개더타운 내에는 토스, 헤이딜러, 카카오페이에서 채용 관련 홍보, 문의도 하고 있었다.(경력자들 대상인 것 같다) 이제 본론으로 들어가서 내가 들은것 요약+느낀점을 적어보겠다. 우선 나는 Track 2개를 동시..

Programming/Android 2021.09.25

Android Studio에서 Profiler 적용기

BC 앱을 리팩토링하면서 몇몇 성능 개선을 해왔다고 생각했다. 실제 수치로도 티가 나는지 확인해보았다. Android Studio를 설치하면 제공되는 Profiler에서 이것저것 관찰해봤다. 우선 Profiler를 써보면서 신기했던 점은 이렇다. - CPU, Memory, Network, Energy 에 대한 정보를 `간략하게` 또는 `클릭해서 상세하게` 볼 수 있다. - 현재 어떤 activity를 보는지 알려준다.(처음보는 앱 분석할 때 유용할지도..?) - 같은 앱이라도 킬 때마다 사용 메모리 크기는 매번 달랐다. 테스트한 것은 아래와 같다. 1. CPU 성능 (RecyclerView에서) Jetpack Paging vs ListAdapter ListView 와 Paging+RecyclerView를..

Programming/Android 2021.09.04

Android Jetpack Paging 3 적용하기

아래는 공식문서의 Paging 3 개요 일부이다. `Repository` 에서는 PagingSource와 RemoteMediator 둘 중 하나를 쓰면 된다고 이해했다. 이중에서 나는 PagingSource를 사용했다. 하지만 만약 네트워크 연결이 불안정하거나 오프라인 상태에서도 데이터를 로드하기 위해서라면 RemoteMediator가 적절하다. `ViewModel`에서는 Pager() 를 통해 PagingSource 객체를 생성하고 이를 UI(Activity등) 에서 반응할 수 있게 한다. 'PagingDataAdapter`는 RecyclerView에서의 Adapter + ListAdapter 를 상상하면 된다. 1. PagingSource 코드는 아래와 같다. load()에서는 네트워크 통신을 포함한..

Programming/Android 2021.09.03

코루틴은 race condition이 발생하지 않는 것일까?

C, JAVA의 멀티 쓰레드에서 비동기 처리에서는 공유변수에 대한 접근제어를 해왔었다.(세마포어, 뮤텍스, synchronized , etc.) 동기화 제어를 제대로 하지 않으면 원자성에 위배되어, 변경된 데이터의 손실이 일어날 수 있다. 그런데 코틀린 코루틴에 대해 배우면서 아직까지 race condition에 대한 언급은 한 번도 못봤던 것 같다. 서로 다른 coroutineScope에서 공유 변수에 대한 update가 동시에 발생할 때 문제가 생길 가능성은 전혀 없는 것일까? 결론부터 말하자면 멀티스레드와 마찬가지로 동기화 제어를 해주어야 한다. 각 쓰레드는 JVM의 Stack 영역을 차지하고, 코루틴은 각각의 작업이 Object로 할당되어 JVM의 Heap에 적재된다. 하지만 Heap영역이라고 해..

Programming/Android 2021.06.16