프로그래밍 358

Mastering Android ViewModels: init {} 블록에서 상태를 초기화하는 것을 피하라

ViewModel의 init {} 블록에서 상태를 초기화하는 것은 편리해보인다.나도 프로젝트에서 종종 그렇게 해 오고는 했는데, 그렇게 하지말라는 이유는 다음과 같다. 1. ViewModel 생성과 강하게 커플링됨데이터를 가져오는 타이밍이 ViewModel 생성시에 있기 때문에, 새로고침 등 사용자 상호작용이나 기타 이벤트에 따라 데이터 로딩시점을 제어하기 어렵게 만든다.  2. 테스트하기 어려움ViewModel이 생성되자마자 데이터 로드가 시작되므로 1번의 이유로 인해 테스트하기 어려워진다.  3. 리소스 낭비의 가능성앱이나 화면에 진입하자마자 데이터를 필요로 하지 않을 경우, 자원의 비효율적인 사용으로 이어질 수 있음. 4. UI 응답성init {} 블록은 최대한 가볍게 유지해야한다. 여기에서 메인 ..

Mastring Android ViewModels: 필요하다면, 생성자에 의존성을 Lazy하게 주입하라

ViewModel의 생성자에 있는 모든 의존성들을 Lazy Inject하라는 것은 아니지만, 드물게 사용하는 것들은 Lazy로 바꿈으로서 초기화 성능을 개선할 수 있다. 의존성이 실제로 필요할때만 주입되므로 이로인한 이점은 다음과 같다. 1. 빠른 시작2. 더 낮은 메모리 점유율3. CPU 부하 감소 Lazy Initialization을 사용해야하는 경우- 규모가 큰 의존성- 드물게 사용되는 의존성- 조건부 의존성 케이스 스터디@HiltViewModelclass BookViewModel @Inject constructor( @IoDispatcher private val ioDispatcher: CoroutineDispatcher, private val bookmarkUseCase: dagger..

[Java] Timer의 Fixed-rate Execution의 함정

앱에서 정확한 시간마다 작업을 수행해야할때 Timer.scheduledAtFixedRate를 사용하던 중, 기이한 로그가 발견되었다. 바로 아주 짧은 시간에 여러번 호출되는 현상! 문서를 보면 메소드에 대한 대략적인 설명은 이렇다. scheduleAtFixedRate(TimerTask task, Date firstTime, long period)Schedules the specified task for repeated fixed-rate execution, beginning at the specified time.지정된 시간부터 고정된 간격으로 반복적으로 작업을 수행하도록 예약한다. 이 "Fixed-rate execution"에는 함정이있다.메소드를 눌러 문서를 더 자세히 살펴보면 다음과 같은 문단을 발..

의존성을 가지는 Initializer 만들기

Android Jetpack 라이브러리 중 하나인 App Startup은 안드로이드 앱 구동에 필요한 초기 설정들을 체계적으로 초기화하는데 유용한 라이브러리다. 아래는 App Startup의 사용 예시 코드인데, dependencies 함수를 보면 예시 코드의 로거 Initializer는 WorkManagerInitializer에 의존하고 있음을 알 수 있다.// Initializes ExampleLogger.class ExampleLoggerInitializer : Initializer { override fun create(context: Context): ExampleLogger { // WorkManager.getInstance() is non-null only after ..

[안드로이드] MyMavenRepo로 Private Repository 라이브러리 무료 배포하기

Jitpack에서 MyMavenRepo로...안드로이드 SDK 프로토 타입을 개발중인데, 개발한 SDK를 프로덕트에 붙이려니 aar 파일로 직접 배포하는 방식은 아무래도 귀찮았다. 처음엔 자료가 많은 jitpack으로 시작을 했었는데 jitpack은 Private Repository에 대해서는 요금을 부과한다. 무료체험이 끝나니 최소 월 $12를 지불해야했다. 회사에 청구할까 고민했지만 이런 문제를 해결하는 것도 재미있겠다 싶어서 짧게 서치하니 MyMavenRepo라는 무료 플랜이있는 MavenRepository를 발견했다. Step 1. 가입하고 인증하기 먼저 Register를 눌러 유효한 이메일 주소와 MyMavenRepo에서 사용할 Password를 입력해서 가입한다.비밀번호 확인? ..

DASHI - 챕터와 속도 개선 업데이트

R2 도입 얼마전, DASHI의 스트리밍 소스를 트위치에서 치지직으로 변경했다. 이미 다른 사람들이 치지직 API를 가지고 만들어 둔 소스를 참고해서 구현한 터라 크게 이슈는 없었지만 한가지 마음에 걸리는 부분이 생겼다. 바로...우리집 인터넷 속도! 영상 서빙을 하면서 100mbps 인터넷을 쓰는 건 애초에 걱정했던 바였지만, 그래도 트위치때는 720p 30프레임이라 세그먼트당 파일 크기가 아주 못볼수준은 아니었다. 하지만 치지직은 60프레임이라 거의 1.5x~2.0x가량 용량이 뛰었고 시청에도 불편함을 줄 정도가 되었다. 이를 해결할 방법을 여러 생각해보았는데... Plan1. 500mbps 인터넷을 가입한다 500메가 인터넷을 가입한다는 플랜을 떠올렸으나, 하루 이용자 7명 정도의 서비스 때문에 월..

[Java] Buffer의 구조와 주요 메소드 다루기

Java NIO Buffer는 Channel과 상호작용할때 사용된다. Channel에서 Buffer로 데이터를 읽어들일 수 있고, 다시 Channel로 쓰여질 수 있다. Channel을 통하지 않고 Buffer를 직접 다룰 수도 있는데, Buffer의 구조와 주요 메소드들을 살펴보면서 알아보도록 하겠다. Buffer의 구조 Buffer는 데이터를 읽고, 쓸 수 있는 메모리 블록이다. 그리고 커서 역할을 하는 다음 3개의 속성 값들을 가지고 있다. capacity: 버퍼의 사이즈 position limit Buffer는 읽기, 쓰기 모드로 나뉘어지는데 각 모드에 따라 커서가 하는 일을 살펴보자. 쓰기 모드 (Write Mode) [ ][ ][ ][ ][ ]. ⭡ ⭡ position limit, capaci..

유한상태머신(FSM)으로 텍스트 젤다의 전설 만들기

유한상태머신이란? 유한 상태 기계(finite-state machine, FSM) 또는 유한 오토마톤(finite automaton, FA; 복수형: 유한 오토마타 finite automata)는 컴퓨터 프로그램과 전자 논리 회로를 설계하는 데에 쓰이는 수학적 모델이다. 간단히 '상태 기계'라고 부르기도 한다. 유한 상태 기계는 유한한 개수의 상태를 가질 수 있는 오토마타, 즉 추상 기계라고 할 수 있다. 이러한 기계는 한 번에 오로지 하나의 상태만을 가지게 되며, 현재 상태(Current State)란 임의의 주어진 시간의 상태를 칭한다. 이러한 기계는 어떠한 사건(Event)에 의해 한 상태에서 다른 상태로 변화할 수 있으며, 이를 전이(Transition)이라 한다. 특정한 유한 오토마톤은 현재 상..

Coil 인터셉터를 활용한 이미지 로딩 최적화 방법

Coil의 이미지 파이프라인은 아래 5가지의 메인 파트로 이루어져 있는데, Interceptor는 그 중 첫번째로 실행되는 녀석이다. Interceptor -> Mapper > Keyer -> Fetcher -> Decoder 커스텀 Interceptor를 이용하면 일종의 캐시 레이어(Cache Layer)를 만들 수 있다. 요청을 가로채서 요청 파라미터를 수정하거나...HTTP Request를 했지만 휴대폰 내에 파일이 있다면 File로 돌려버리거나 말이다. 또, 앱에서 정의한 커스텀 스키마로 이미지를 불러오는 것도 가능해진다. 어찌되었건 지금 간단히 예시로 볼 것은 Unsplash 이미지를 불러올때 이미지 사이즈를 최적화 시켜주는 Interceptor다. (Github에 많이 떠돌아다니는 코드다 ㅋㅋ..