- 운영 중인 서비스 로직은 서버로부터 새로운 리소스를 받으면 항상 고정된 경로의 로컬 파일 Storage 경로로 저장을 하고, Glide로 해당 이미지 리소스를 렌더링 하고 있었다. - 그런데 어느날 서버로부터 변경된 리소스를 내려받아도 렌더링 단계에서 해당 리소스가 갱신되지 않는 문제를 발견. - 분명히 로컬 저장 단계까지 변경된 리소스가 저장되는 것까지 확인했으나 원인은 Glide 동작 설정에 있었다. - Glide는 기본적으로 캐싱 기능을 가진다. 디스크 캐시와 메모리 캐시를 활용하여 이미지를 빠르게 로드하고 불필요한 네트워크 요청을 줄이는 기능을 가지고 있다.1. 메모리 캐시 (Memory Cache)이미 로드된 이미지를 RAM에 저장하여 빠르게 다시 불러올 수 있도록 함앱이 종료되거나 메모리가..
- 이런 구조의 TimePicker를 가진 Sheet가 존재하는데, TimePicker의 각 hour, minute 부분은 별도의 EditText로서 사용자의 포커스 온이 가능합니다. - 그런데, 키보드에서 '다음' 또는 '확인' 버튼을 누르지 않는 이상 전체 TimePicker에 해당 값이 전달되지 않으면 UI 및 데이터 업데이트에 문제가 있었습니다. - 사실 아래 설정을 통해 아예 사용자 입력을 비활성화시키고 스크롤만 가능하게 할 수도 있습니다. android:descendantFocusability="blocksDescendants" - 하지만 최대한 사용자의 입력을 존중(?)하기 위해 사용자가 Sheet를 닫을 시, 각 EditText의 포커스 상태를 검사하고 값을 가져오는 처리를 진행했습니다. ..
Application 클래스란?Application 클래스는 Android 애플리케이션의 전반적인 상태를 관리하는 기본 클래스입니다.앱이 실행될 때 가장 먼저 생성되며, 앱이 종료될 때까지 유지됩니다. - 싱글톤처럼 동작하며, 어디서든 접근 가능 - 앱의 생명 주기 관리- 앱 전역에서 공유해야 하는 데이터(예: SharedPreferences, DI Container, Theme, Locale 등)를 관리- 의존성 주입(Dagger/Hilt), Firebase 초기화, Crashlytics 설정 등 각종 초기설정을 여기서 진행 - 반드시 Manifest에 선언해주어야 한다.
AAC(Android Architecture Components)란?AAC는 안드로이드 앱 개발을 쉽게 만들기 위해 제공되는 아키텍처 구성 요소앱 개발 시 라이프사이클 관리, 데이터 저장, UI 상태 관리 등을 표준화MVVM 패턴과 함께 사용하면 유지보수성과 확장성이 뛰어난 앱을 개발 가능AAC 주요 구성 요소ViewModel : UI 데이터를 저장하고 라이프사이클을 관리LiveData : 데이터 변경을 감지하고 UI에 반영Room : SQLite DB를 관리하는 ORM 라이브러리LifeCycle : Activity / Fragment의 라이프사이클을 관리ViewModel- UI 데이터를 관리하고 라이프사이클을 유지하는 역할- ViewModel을 사용하면 화면 회전 시 데이터가 유지됩니다.class My..
- 앱에서 활용하던 GIF 파일들이 많아지면서 용량이 증가하고 관리 비용에도 점점 문제가 생기기 시작했습니다. - 이에 따라 애니메이션 재생에도 뒤처지지 않고, 용량도 더 적은 WebP 파일을 활용하기로 결정했습니다. - Glide를 활용해 렌더링을 진행했는데, 사실 기존 GIF 파일 재생 방법과 큰 차이가 없습니다. 같은 로직으로 두 가지 종류 파일 모두 호환 가능합니다. - WebP가 GIF보다 나은 점들은 아래와 같습니다. - raw 폴더 하위에 webp 파일을 넣고, Uri 경로를 구성해주어야합니다.val resourceUri = Uri.parse("android.resource://${context.packageName}/${R.raw.test}") - 해당 Uri 기반으로 로드해 줍니다. ur..
1. 코틀린에서의 람다 표현식이 무엇인가?- 람다 표현식은 함수를 명시적으로 선언하지 않고도 함수와 유사한 구조를 정의하는 간결한 방법입니다. - 인수로 전달하거나 변수에 저장할 수 있는 코드 블록을 만들 수 있습니다. - 람다 표현식은 간결하고 인라인 함수 동작을 제공하는 데 유용합니다.val sum = { a: Int, b: Int -> a + b } // Lambda expressionval result = sum(3, 4) // Invoking the lambda expressionprintln(result) // Output: 7 2. 코틀린에서 고차 함수란 무엇인가?- 고차 함수(High-Order Function)란 다른 함수를 인자로 받거나, 함수를 반환하는 함수를 의미합니다.- 함수를 변..
Hex Code(16진수 색상 코드)란?16진수(HEX, Hexadecimal)로 표현된 색상 값RGB(Red, Green, Blue) 색상을 조합하여 색을 나타냄웹 개발, 그래픽 디자인, 모바일 UI 등에서 자주 사용됨- 서비스에서는 이런 코드 값을 사용자 테마 등에 따라 API를 통해 다양한 값으로 클라이언트에 전달하곤 합니다.- "#FCFEF8" 형태로 수신되었다면 이것을 Color 객체로 변환하는 과정까지 확인해 보겠습니다.val color = Color(Color.parseColor("#FCFEF8"))- 정수 값으로 변환한 후, Color 객체로 감싸는 방법입니다.- 투명도를 추가하고 싶다면 #AARRGGBB 형식으로 사용 가능합니다. val color = Color.valueOf(Color...
- view는 id 외에 tag로도 접근 가능합니다.val targetView = (this as ViewGroup).findViewWithTag(number.toString())targetView?.visibility = View.GONE - XML이 아닌 코드에서 수정targetView.tag = "001"