Retrofit Internals - Retrofit In Coroutine
·
Android
이전 글에서는 Retrofit이 동적 프록시와 리플렉션을 활용해 서비스 인터페이스의 구현체를 생성하는 과정을 살펴보았습니다. 이를 통해 Retrofit이 어떻게 인터페이스 메서드 호출을 가로채고, 내부에서 HTTP 요청 처리를 위한 준비를 하는지 이해할 수 있었습니다. 이번 글에서는 코루틴을 지원하는 Retrofit의 동작 방식을 자세히 들여다보며, HttpServiceMethod가 어떻게 다양한 호출 방식(suspend 함수, 일반 함수, Response, Call)을 처리하는지, 그리고 네트워크 요청을 어떻게 수행하는지 알아보겠습니다.# ContinuationRetrofit이 코루틴을 다루는 방법을 이해하기 위해선 먼저 suspend 함수에 대한 지식이 필요합니다. 이를 위해 간단한 예시 코드를 한..
Retrofit Internals - Retrofit은 어떻게 인터페이스의 구현체를 만들까 ?
·
Android
서론Retrofit을 사용해 네트워크 요청을 만들 때 서비스 인터페이스를 구현하는 것 만드로 API 요청을 구현할 수 있습니다. 어떻게 구현체가 없는 인터페이스를 실행 가능한 형태로 만드는 걸까요? 이 글에서는 Retrofit이 내부적으로 서비스 인터페이스의 구현체를 생성하는 과정과 이를 통해 API 요청을 수행하는지를 단계별로 살펴보겠습니다.create( ) 메서드는 두 단계를 걸쳐 서비스 인터페이스의 구현체를 생성합니다. 이를 단계별로 분석해 보겠습니다.Step1. 서비스 인터페이스 검증 (validServiceInterface())Retrofit은. create()를 통해 전달된 클래스가 정상적인 인터페이스인지 먼저 확인하고 아닐 시 예외를 던집니다.private void validateServi..
Retrofit Internals - Call<T>
·
Android
서론우아한테크코스의 레벨2 마지막 미션으로 레벨 인터뷰를 기점으로 Retrofit의 내부 구현을 살펴보게 되었습니다. 기본적인 Call을 사용한 방식부터 enqueue의 내부 구현, Call 방식과 코루틴을 사용했을 때의 차이를 알아보겠습니다. 그 첫번째 장으로 Call방식 사용한 호출 방식부터 살펴보겠습니다.Retrofit Callinterface ProductService2 { @GET("/products/{id}") fun getProduct( @Path("id") id: Long, ): Call}Call은 네트워크 요청을 처리할 수 있는 객체이며, 요청을 실행하는 방법으로는 execute()와 enqueue() 두 가지를 제공합니다.📕 executeexecute는 동..
ViewModel의 One Time Event를 다루는 다양한 솔루션
·
Android
서론ViewModel에서 발생하는 이벤트를 소비하는 방법엔 Channel, SharedFlow, State 등 다양한 방법이 있습니다. 프로젝트를 Compose로 Migration 하는 과정에서 이에 대한 솔루션이 필요해 여러 자료를 통해 프로젝트에 채택한 방법을 소개하겠습니다. 해당 글은 Youtuber Phillipp Lackner님의 영상을 번역한 자료로 필자는 영어를 잘 못하기 때문에... 유튜브 영상의 스크립트를 해석한 내용으로 잘못된 내용이 있을 수 있습니다.0. 필요 조건One Time Event를 위한 API는 다음 조건이 필요합니다.Event 발생 후 앱이 백그라운드로 내려갈 시 UI에선 구독을 중지해야 한다.동일한 Event를 중복해서 발생시키지 않아야 한다.(Ex. 같은 화면을 두 ..
안드로이드에서 실시간으로 네트워크 상태를 대응해보자
·
Android
서론스마트폰에서 인터넷 연결이 끊기는 상황은 가장 흔하게 만날 수 있습니다. 저는 아이폰을 사용하고 있는데요, 아이폰은 연결 가능한 와이파이가 있다면 자동으로 연결해 주는 기능이 있습니다.  때로는 이 기능이 편하기도 하지만 연결 상태가 좋지 않은 와이파이에 연결될 경우 인터넷 사용이 불가능한 상황이 자주 일어납니다. 이렇듯 가장 흔하게 많이 일어나는 이슈인 만큼 앱에서 적절한 에러처리를 해줘야 합니다.  오늘은 다온길을 개발하면서 어떻게 네트워크 에러를  처리했는지 소개하겠습니다.실시간으로 네트워크 상태를 받아오자우선 기기의 현재 네트워크 연결 상태를 확인하기 위해서 Connectivity를 사용해야 합니다. 안드로이드에선 사용자에게 다양한 형태의 네트워크 작업을 할 수 있도록 Wi-Fi에 연결되었을 ..
안드로이드 접근성 개선기
·
Android
서론 다온길 프로젝트는 무장애 여행을 제공하는 것을 목표로 몸이 불편하신 분들도 다온길을 통해 일반인들과 똑같이 여행할 수 있게 하는 것을 목표로 하고 있습니다. 이를 위한 가장 중요한 요소는 바로 접근성입니다. 오늘은 안드로이드에서 제공하는 다양한 접근성 도구들과 이를 활용해 저희 프로젝트의 접근성을 어떻게 향상했는지 알아보겠습니다.접근성 검사기를 사용해보자 접근성 검사기는 어플리케이션의 화면을 스캔하고 앱의 접근성을 개선하기 위한 제안을 제공하는 앱입니다. 콘텐츠 레이블, 클릭 가능한 항목, 대비 등을 검사하여 구체적인 개선 방안을 제시합니다. 가장 먼저 접근성 검사기를 실행하면 툴바 메뉴에 설정에서 접근성 검사에 사용될 텍스트와 이미지의 대비율, 터치할 대상 크기를 설정할 수 있습니다. 기존에 설정..
안드로이드 리사이클러뷰 성능 개선 일지 4편
·
Android
서론오늘은 3편에 이어 리사이클러뷰의 성능을 개선하기 위해 시도했던 다양한 방법들에 대해서 소개해볼까 합니다. 3편 마지막에 짧게 언급한 GPU 렌더링 프레임부터 시작해서 레이아웃 평탄화 등등 제가 시도한 과정들을 소개해드리고 결과를 한번 리뷰해보겠습니다.1. 렌더링 측정 도구들에 대해 알아보자1.1 프로필 GPU 렌더링안드로이드 스마트폰의 개발자 옵션에서 설정할 수 있는 프로필 GPU 렌더링은 현재 화면에서 실행중인 어플리케이션의 렌더링 시간을 막대 형태로 보여줍니다. 각각의 수직 막대는 한 프레임인데 높이가 높을수록 렌더링에 오랜 시간이 소요됐음을 뜻합니다. 하단에 수평으로된 하나의 녹색선이 있습니다. 이 라인은 16.67ms를 나타냅니다. 초당 60 프레임이 되려면 이 수직 막대들이 16ms 라인..
안드로이드 리사이클러뷰 성능 개선 일지 3편
·
Android
서론오늘은 2편에서 알아본 DiffUtil을 사용해 프로젝트를 마이그레이션 해보겠습니다. 모든 작업이 완료된 시점에서 글을 작성하다 보니 결론부터 말하자면 DiffUtil을 사용함으로써 성능은 끌어올렸겠지만 UI/UX 측면에서 큰 이점을 끌어올리진 못했습니다. 그 이유는 DiffUtil의 특성상 데이터가 변경된 뷰홀더를 재바인딩 하면서 화면을 다시 그리게 됩니다. 이 과정에서 일반 사용자가 보기엔 화면이 깜빡이는 현상이 일어났습니다. 그래서 오늘은 DiffUtil 어떻게 적용했는지부터 시작해 왜 이런 현상이 발생하는지 알아보겠습니다.1. 필요한 데이터 클래스를 만들자 가장 먼저 할 일은 ListAdapter를 쉽게 사용할 수 있도록 RecyclerView.Adapter를 상속하고 있던 Adapter ..