Android 88

[안드로이드] Koin에서 Hilt로, Hilt 배워보기

단지 쉽다는 이유만으로 Koin 라이브러리를 사용하고 있었는데 최근 앱의 리팩토링 고민을 하면서, 다른 프로젝트 코드들을 읽어보다가 내가 Hilt에 대해서 너무 모르는거 아닌가라는 생각이 들었다. 참고자료에 있는 Droid Knights 2020 영상에 따르면 상위 10,000개의 안드로이드 앱 중 74%가 Dagger를 사용하고 있다고 한다... github에 올라온 많은 프로젝트들도 Dagger/Hilt를 사용하고있으니 이번기회에 확실히 짚고 넘어가면 좋을 것 같다. Koin의 특징 Koin은 확실히 쉽다. Hilt가 쉬워졌다고 하지만 Koin급은 아니다. 그리고 어노테이션을 사용하지 않고 Stub 파일을 만들지 않기 때문에 빌드 시간이 빠르다. 하지만 런타임에 바이트 코드를 생성하기 때문에 Hilt..

[안드로이드] 카카오웹툰 앱에서 쓴 오픈소스 라이브러리를 알아보자

카카오 웹툰이 처음 나왔을때, 나도 부정적인 시선으로 보는 사람들 중에 하나였다. 웹툰을 보지는 않지만 예전에 웹툰을 봤을때 요일별로 나눠져있는게 그야말로 정석이었고, 앱을 켤때도 [O요일 웹툰 봐야지!] 라는 생각으로 켜곤했다. 하지만 카카오 웹툰은 그 정석과는 다른 방향으로 개발되었다. AI 추천 웹툰이 먼저고, 요일별 웹툰은 조금 더 숨겨져있다. 새로운 것에대한 거부감일지, 정말로 유저가 원하는 것과 맞지 않아서일지는 조금 더 두고보면 알겠지만, 개발자로서 카카오 웹툰의 혁신적인 UI/UX는 분명 엄청났다! 가장 궁금한건 역시 "어떻게 만들었을까"다. 카카오 웹툰을 다운받아서 APK 파일을 추출 후 압축을 해제하면 사용한 에셋들이 나온다. 그중에서 oss_notice.html이라는 카카오 웹툰 앱을..

[안드로이드] Jetpack Compose 테마와 스타일 정의하기

Jetpack Compose를 시작하기 위한 강의는 구글에서 제공한다. 레이아웃을 어떻게 만들지는 한 번만 따라해도 어느정도 각이 나온다. 어떻게 디자인하는지 알려주는 강의는 너무 많다. 하지만 중요한건 Integration! 앞으로 블로그에서 다룰 Jetpack Compose 관련 주제가 바로 Integration이 될 것이다. 어떻게 내 프로젝트에 통합시킬 수 있을지! Theming 그 첫번째로 테마(Theme)와 스타일에 관해서 알아보려고한다. Jetpack Compose에서 아주 쉽게 Material Design을 적용시킬 수 있다고는 하지만, 디자이너들은(93% 확률로 아이폰을 이용중) 우리에게 Material Design을 던져주지 않는다. 앱 고유의 스타일을 어떻게 확립하고 적용시킬 수 있는..

[Jetpack Compose] 왜 Jetpack Compose가 나와야만 했을까?

Jetpack Compose를 눈여겨 본지 1년정도 된 것같다. 오랫동안 xml로 레이아웃을 구성하면서 큰 불편함이 없어서인지, (불편함에 길들여졌었겠지) 이 새로운 기술이 정착될지, 도태될지 지켜보기만하고 실제로 시도해보지는 않았다. 원래는 Android Studio Preview에서만 지원되었으나 이제는 정식 지원하게 되었다. 내가 Jetpack Compose와 마주할때가 된 것 같다. Seperation of concerns xml을 사용하는 UI 디자인 방식에 무슨 문제가 있길래 Jetpack Compose가 등장했을까? 그것이 가장 궁금했다. SoC(관심사의 분리, Seperation of concerns) 원칙에 대해 들어봤을 것이다. 우리 프로그램은 하나의 거대한 시스템이고, 처리해야할 부분..

[안드로이드] Retrofit2 오프라인 캐시 구현하기 (Offline cache interceptor)

캐싱의 이점 서버 대역폭 낭비를 줄일 수 있다. 응답을 받기까지 기다리는 시간을 줄일 수 있다. 서버 트래픽을 줄여준다. Cache-Control이란 무엇인가? Cache-Control은 브라우저단의 캐싱 정책을 정의하는 HTTP 캐시 헤더다. 클라이언트가 서버에게 요청을 호출하면, 브라우저는 자원 사본을 캐싱 하여 다음 번 접근 시에 서버에 처음부터 다시 파일을 요청하는 일이 없도록 할 수 있다. Cache-Control을 통해서 캐시 정책을 세울 수 있다. 자주 쓰는 Cache-Control Directives Directives를 한국말로 뭘로 하면좋을까.. 지시사항? 아무튼 그걸 살펴보려하는데, 여러 Directive들은 콤마(,)로 구분 가능하다. Directive를 이용하여 응답(Respons..

[안드로이드] adb 개념과 사용법 / 무선 디버깅 연결방법

adb 개념 안드로이드 디버그 브릿지 (adb)는 안드로이드 기반 에뮬레이터 혹은 실제 휴대기기와 통신할 수 있게 해주는 커맨드라인 툴이다. 이름 잘 지었는걸? 앱 설치 / 로그캣 명령어 확인 / 디버깅 등 앱 개발에 유용한 명령어 뿐만아니라 Unix shell에 접근할 수 있게 함으로서 기기 내 파일 관리, 프로세스 확인 등 다양한 작업을 가능하게 한다. adb는 명령어를 전송하는 클라이언트 / 각 기기에서 백그라운드 프로세스로 실행되는 데몬(adbd) / 클라이언트와 데몬간의 통신을 관리하는 서버로 이루어져있다. 안드로이드 스튜디오에서 기기가 제대로 detect되지 않을때 adb server를 재시작하는 이유가 여기에 있었다... adb 사용하기 터미널에 adb를 입력해보고, 환경변수 등록이 되지 않..

[안드로이드] WebView 사용시 "Uncaught TypeError: Cannot read property 'getItem' of null" 해결

WebView에서 웹을 띄울때 어떤 경우에는 아래 콘솔메세지가 출력되면서 제대로 작동이 안되는 경우가 있다. 나는 네이버 한자사전(https://hanja.dict.naver.com/#/main)을 띄우다가 경험했다. Uncaught TypeError: Cannot read property 'getItem' of null 웹의 JS 쪽에서 localStorage.getItem() 이나 sessionStorage.getItem() 사용시 DOM Storage를 사용할 수 없어서 나타나는 오류인데, WebView Settings에서 DOM Storage를 사용할 수 있도록 설정해주면 해결된다. webView.getSettings().setDomStorageEnabled(true);

[안드로이드] V3 구글 인앱 결제 쉽게 구현하기 2021 - 정기결제 구독 상품편

Quick Links 강의 1 편 - 설정 강의 2편 - 인앱상품 강의 3편 - 구독상품 Github 예제 코드 이번에는 정기결제 상품 인앱 결제를 구현해 보도록 하겠습니다. 어떤 앱을 만들게 될지 짧은 동영상으로 먼저 보시죠! 아래 기능들을 구현해볼겁니다. - 정기결제 상품 정보 표시 - 정기결제 상태 확인 - 정기결제 업그레이드, 다운그레이드 - 정기결제 하기 구현에 앞서 참고 사항 라이브러리 구성과 같은 부분은 이전 인앱 결제하기 포스팅에서 따라하시고 오시면됩니다. 그 밖에 결제모듈에 대한 설명들도 모두 여기에서 하고있으니 이 포스팅을 보셨다는 가정하에 글을 쓰도록 하겠습니다. 화면 구성 화면쪽은 역시 빠르게 넘어가도록 하겠습니다. activity_subscription.xml Subscriptio..

[안드로이드] WebView에서 세션 쿠키 활성화 하기 (소셜 로그인)

다른 곳에서 개발한 웹을 웹앱으로 만들다가 소셜 로그인이 안되길래 이곳 저곳 찾아보았다. 실제 브라우저에서 로그인 과정 (1) 네이버로 로그인하기 클릭 (2) 현재 창에서 팝업이 떠서 네이버 로그인 (3) 팝업이 닫히고 로그인 완료 앱 내에서 로그인 과정 (1) 네이버로 로그인하기 클릭 (2) 네이버 로그인 페이지가 열림 (3) 창이 닫힘, 로그인 페이지가 다시 보임 webView.setSupportMultipleWindows(true)가 되어있지만 팝업이 뜬다는 신호는 오지 않았다. 직접 컴퓨터 브라우저로 실행해보니 동일 증상은 '다른 탭에서 열렸을때' 발생했다. 해결방법은 다음과 같다. webViewClient = object: WebViewClient() { override fun shouldOve..

[안드로이드] Context 사용 범위 정리

오늘도 LeakCanary에서 메모리를 모니터링하다가.. 해결방법을 찾던 중 좋은 글을 봤다. 적절한 Context의 사용은 GC가 제대로 동작하게 만들어 Memory leak을 예방할 수 있다. 표 출처: sodocumentation.net/android/topic/2687/memory-leaks Application Context Activity Ctx. Service Ctx. ContentProvider Ctx. BroadcastReceiver Ctx. Dialog 보여주기 X O X X X Activity 시작 X O X X X Layout Inflation X O X X X Service 시작 O O O O O Broadcast 전송 O O O O O BroadcastReceiver 등록 O O..