안드로이드

개발/트러블슈팅

[안드로이드] Circular dependency 오류

* Exception is: org.gradle.api.CircularReferenceException: Circular dependency between the following tasks: :app:processDebugResources \--- :presentation:processDebugResources \--- :app:processDebugResources (*) 클린 아키텍처를 적용한 멀티모듈 프로젝트에서 발생한 에러 메시지이다. 계층 간 분리를 위해 모듈을 나눈 뒤 고수준에서 저수준으로 의존성을 추가해주었고, 안드로이드 진입점과 의존성 주입을 위해 app 모듈이 data/domain/presentation 계층을 모두 참조하도록 설정했다. 하지만 프로젝트 설정 과정에서 presentati..

개발/트러블슈팅

[안드로이드] by viewModels() 종속성 추가

0. ktxAndroid Jetpack과 기타 Android 라이브러리에 포함된 Kotlin 확장 프로그램 세트이다. Jetpack, Android , 기타 API 등과 Kotlin을 사용하기 위해 사용한다. 1. by viewModels() 코틀린의 by는 위임(deligate) 패턴을 구현하는데에 사용되는 키워드이다. 그로 인해 ViewModelProvider를 사용하지 않아도 by viewModels 함수를 사용하여 viewModel을 지연 생성할 수 있다. 2. 종속성 추가 viewmodel 관련 ktx 종속성을 추가했는데도 by viewModels 함수가 제공되지 않아 당황한 사람들이 있을 것이다. viewmodel의 초기화를 위한 함수들은 Activity/Fragment에 포함되어 있어 그런 ..

개발/Android

[안드로이드] AAC ViewModel과 MVVM ViewModel

안드로이드 개발자라면 MVVM이 대세라는 말들과 그에 대한 여러 정보를 어렵지 않게 많이 접해봤을 것이다. 많은 기업들이 MVVM 패턴을 사용하고 있고, 여러 채용 공고들에도 아키텍처에 대한 이해나 MVVM 실무 경험 등이 푸함되어 있기 때문이다. 그래서 오히려 무지성으로 ViewModel에 대한 이해 없이 겉핥기식 MVVM 패턴을 사용하는 사람도 많아진 것 같다. 0. ViewModel이 왜 두가지로 나뉘게 되었는가 구글이 Jetpack을 내놓기 이전부터 개발자들은 MVVM 패턴을 적용하여 개발을 하고 있었다. 그러다 구글이 Jetpack을 내놓으면서 그 당시 개발자들에겐 낯익은 ViewModel도 포함되어 있어 다들 기존의 MVVM 구조에서 사용하던 ViewModel을 구글에서 다듬어 내놨으리라 기대..

개발/Android

[안드로이드] Glide를 알아보자

안드로이드에서의 이미지 처리는 꽤나 중요하고 골치아픈 영역이다. 이미지 로딩, 리소스 해제, 캐싱 등 고려해야할 여러 요소들이 많고, 이미지는 보통 한 두개가 들어가기보다 목록형으로 나열되는 경우가 많다보니 성능에 큰 영향을 미치기 때문이다. 이 포스팅에서는 다루지 않지만, 서버에서 이미지를 로드해야하는 경우에도 굉장히 좋은 퍼포먼스를 준다고 하는데 추후에 실무에서 사용하게 된다면 그때 추가로 작성할 생각이다. 1. Glide란 무엇인가 Glide는 Google에서 만든 이미지 로딩 라이브러리이다. (인수했으니까 아무튼 구글꺼) 처음 경험하는 사람도 쉽게 사용할 수 있을 정도로 직관적이고 효율적이라는 것이 큰 장점이다. 여기서, 어떤 이미지를, 어디에, 사이즈는 얼마로, 캐싱은 어떻게, 이런식으로 설정할..

개발/Kotlin

Singleton 패턴이란?

1. Singleton 패턴이란? 객체의 인스턴스를 최초 1번만 생성하고 이후에는 기존 인스턴스를 호출해서 사용하는 패턴을 말한다. 우린 일반적으로 인스턴스를 생성할 때 new 연산자를 사용하는데, 이 때 메모리에 객체의 인스턴스를 할당하게 된다. 물론 최초 1번의 할당까지는 아무런 문제가 되지 않는다. 하지만 여러 곳에서 필요할 때마다 인스턴스를 생성하고 호출한다면, 이는 메모리를 엄청나게 낭비하는 '비효율적인' 행위가 될 것이다. 따라서 객체가 유일해야할 경우에 싱글톤 패턴을 사용하여 기존에 생성된 인스턴스를 호출해서 사용한다. 2. 언제 사용하는 것이 적절할까? 싱글톤을 적용하지 않고 필요할 때마다 객체를 생성해서 사용한다면 매 생성마다 메모리를 할당받게 되고, 이는 성능 저하를 일으킨다. 하지만 ..

개발/Android

RxJava SubscribeOn & ObserveOn

0. 시작하기 전에 RxJava의 연산자를 제대로 이해하기 위해서는 마블 다이어그램에 대해 알아야 한다. 아래 마블 다이어그램을 한 번 보자. 위 마블 다이어그램에 대해 완벽하게 이해하고 있다면 이 포스팅을 읽지 않아도 된다. 만약 그렇지 않다면, 이 포스팅을 읽고 난 뒤에는 완벽하게 이해할 수 있을 것이다. 1. 연산자 소개 (1) subscribeOn() subscribeOn 연산자는 observableSource가 subscribe 되었을 때, 데이터를 다음 스트림으로 전달하는 액션을 수행하는 스케줄러를 지정한다. 간단하게 말해서, subscribeOn 연산자는 "Observable이 동작을 시작할 스레드"를 지정한다. 추가적으로 subscribeOn 연산자를 사용할 때 알아둬야 할 사항 몇가지에 ..

개발

RxJava를 알아보자

0. RxJava를 공부하게 된 계기🐥🐥🐥 코딩을 하다보면 여러 난관에 부딪히게 된다. 알고 있는 지식의 범위 안에서 쉽지만 오래걸리고 비효율적인 방법으로 처리가 가능했으나, 🌟추후에 규모 있는 프로젝트를 진행하게 된다면 이 부분에 있어 불편함을 겪게 될 것이라 생각했다🌟 ex) 콜백 지옥 물론 다른 여러 회사들이 요구하는 대표적인 기술 스택 중 하나라서 공부를 시작한 것도 있다. 그래서 더 궁금하기도 했고. 이게 대체 뭐하는 녀석이길래 다들 그렇게 사용할까? 1. RxJava란 무엇인가? 그에 앞서, 리액티브 프로그래밍에 대해 알고 가야 한다. 리액티브 프로그래밍이란, "데이터의 흐름과 전달에 관한 프로그래밍 패러다임"이다. p.s 우리가 흔히 알고 있는 객체지향 프로그래밍도 하나의 프로그래밍 패러다임..

개발/트러블슈팅

[안드로이드] ViewModelProvider gradle 오류

오늘 "아키텍처를 알아야 앱 개발이 보인다" 라는 책을 공부하던 중, 한가지 이슈에 직면했다. ViewModel 파트 실습중이였는데, gradle 설정을 완료하였음에도 ViewModel 생성을 위한 ViewModelProvider 클래스가 생성되지 않는 이슈였다. 수정을 거쳐도 이미 deprecated된 ViewModelProviders가 나오거나 아예 엉뚱한 HasDefaultViewModelProvideFactory 였나? 뭔가 하는 이상한 클래스가 나왔다. 아래 코드는 developers에서 제공하는 최신 버전의 gradle이다. dependencies { def lifecycle_version = "2.6.0-alpha01" def arch_version = "2.1.0" // ViewModel ..

개발

레거시에 대하여

얼마전에 한 테크블로그에서 Legacy에 대해 포스팅한 글을 읽었다. 다른 분야 못지 않게 Legacy에 대해 민감할 수 밖에 없는 안드로이드 개발자로서, 오늘은 Legacy에 대하여 이야기해보고자 한다. Legacy는 종종 게임, 드라마/영화, 영어 공부 책에도 심심치 않게 등장하는 단어이기 떄문에 그리 생소하게 느껴지는 단어는 아닐 것이다. # 사전적 의미 Legacy 1. (죽은 사람이 남긴) 유산 (=inheritance) 2. (과거의) 유산 출처: 네이버 영어 사전 # 개발자에게 Legacy란? Legacy system - 낡은 기술이나 방법론, 컴퓨터 시스템, 소프트웨어 등을 말한다. - 더 이상 쓰이지 않더라도 현대의 기술에 영향을 주는 경우도 포함한다. # 안드로이드 개발자에게 Legac..

개발/Android

[안드로이드] START_STICKY & START_NOT_STICKY

🎈 안드로이드 서비스 오늘 알아볼 것은 안드로이드 서비스에서 주로 사용되는 세가지 시작 방법에 대한 정보입니다. START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT가 있으며, 각각에 대해 자세히 알아보겠습니다. ✔️ START_STICKY 서비스가 강제로 종료되었을 때 시스템이 자동으로 다시 시작하도록 하는 방식입니다. 서비스가 다른 추가적인 작업 없이도 계속 실행되어야 하는 경우에 주로 사용됩니다. 시스템에 의해 재시작되면 onStartCommand()가 호출되지만 Intent는 Null이 전달됩니다. ✔️ START_NOT_STICKY 서비스가 강제로 종료되었을 때 시스템이 자동으로 다시 시작하지 않도록 하는 방식입니다. 이 방식은 서비스가 특정 작업을 ..

최선의 최선
'안드로이드' 태그의 글 목록 (3 Page)