전체 글 21

[Android] 코루틴 Dispatchers, 하드코딩하지 말고 주입하자

개요 구글의 Codelab의 예제나 안드로이드 공식 문서, 블로그의 코루틴 예시들을 보면 아래의 코드처럼 새로운 코루틴을 생성하거나 withContext를 호출할 때 Dispatchers를 하드코딩하는 경우를 많이 찾아볼 수 있습니다. 하지만 Android의 코루틴 권장사항 문서를 보면 Don't hardcode Dispatchers when creating new coroutines 라는 내용이 제일 먼저 등장합니다. // DO inject Dispatchers class NewsRepository( private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default ) { suspend fun loadNews() = withCont..

Android 2022.08.17

[Android] BottomNavigationView의 탭을 눌러도 선택되지 않는 문제

문제 개인 프로젝트로 개발 중인 앱에서 별다른 버그가 없는가 밥을 먹으며 이리저리 클릭하던 중 특정 상황에 하단 탭의 선택 효과가 동작하지 않는 문제를 발견하여 이를 해결하면서 공부한 내용을 정리했습니다. 문제의 화면과 프로젝트의 내비게이션 그래프의 구성은 아래와 같습니다. 화면 및 탭 구성 BottomNavigationView에는 홈, 즐겨찾기, 설정 총 3개의 탭이 존재 설정 화면의 버튼을 통해 다크 모드 설정 또는 테마 설정 화면으로 이동 가능 버그 내용 설정의 하위에 속하는 다크 모드 설정을 선택하여 화면을 띄운다. 설정 탭 이외의 다른 탭인 즐겨찾기 탭을 선택한다. 다시 설정 탭을 선택하면 화면은 이전에 띄워놓았던 다크 모드 설정 화면이지만 탭은 설정 탭이 아니라 즐겨찾기 탭이 선택되어 있다. ..

Android 2022.07.21

[Kotlin] 코루틴의 취소와 예외 처리 파고들기

코루틴을 막 학습한 사람에게 코루틴은 매우 간단하고 자바스크립트의 async, await와 비슷하게 보이기도 해서 비동기 프로그래밍을 위한 아주 쉽고 훌륭한 도구로 보일 수 있습니다. 실제로 쉽고 훌륭한 도구이긴 하지만요. 하지만 코루틴을 더 깊게 살펴보면 실제로 걸리기 쉬운 함정들이 많이 존재합니다. 예외 처리나 취소를 try-catch 블록을 통해 간단히 할 수 있으리라 생각하지만 실제로는 복잡한 매커니즘으로 동작하고 있기에 많은 것들이 잘못될 수도 있습니다. 본문에서는 유튜브의 In-Depth Guide to Coroutine Cancellation & Exception Handling 영상을 바탕으로 다음의 내용을 다룹니다. 코루틴에서 어떻게 예외를 잡고 처리해야 하는지 코루틴에서 예외 처리가 일..

Kotlin/Coroutines 2022.07.15

Android Navigation에서 chrome의 의미

요약 chorme은 사용자에게 화면의 콘텐츠(해당 콘텐츠의 일부가 아님)에 대한 정보 또는 작업 명령을 제공하는 시각적 디자인 요소입니다. 이 디자인 요소는 운영체제, 웹사이트, 애플리케이션과 같은 기본 시스템에서 제공되며 사용자 데이터를 둘러싸고 있습니다. 용어 이해하기 안드로이드의 Navigation 관련 문서들을 보다보면 chrome이라는 단어가 종종 등장합니다. NavigationUI Class which hooks up elements typically in the chrome of your application such as global navigation patterns like a navigation drawer or bottom nav bar with your NavController. ..

Android 2022.07.14

제어의 역전(Inversion of Control, IoC) 파헤치기

Inversion of Control(IoC), 제어의 역전이라고도 번역되는 이 개념은 Dependency Injection(DI)에 대한 개념을 찾아보면 반드시 등장하는 개념입니다. 처음 접했을 땐 여러 블로그의 설명을 읽어도 확실하게 이해가 되지 않아서 사전적인 정의와 예시 코드 정도만 정리하고 넘어갔었는데 안드로이드의 DI 라이브러리인 Hilt에 대해 복습을 하던 중 IoC를 간단명료하게 설명해주는 유튜브 영상을 발견하여 스스로 IoC에 대해 다시 한 번 정리하고자 글을 작성합니다. 게임 엔진은 라이브러리가 아니라 왜 프레임워크로 분류하는 것이 적절한 지 IoC에 대한 개념을 함께 설명하는 2분도 안되는 짧은 영상인데, 이 영상에 대해 고마움을 표현하는 댓글들을 읽어보는 재미가 있습니다. 대충 과거..

Android 2022.07.06

[Kotlin] suspend 함수의 실행 원리: 콜백에서 코루틴으로

Coroutines: Replace callbacks & Main safety 코루틴은 콜백 스타일의 코드를 순차적 프로그래밍으로 변경해주고 안드로이드에서 우리의 코드를 main safe하게 만들어준다. main safe하다는 것은 예시로 네트워크 요청을 만드는 코루틴 기반의 함수를 작성할 수 있게 해주고, 그냥 메인 스레드에서 호출해도 아무런 문제가 없다는 것을 뜻한다. 어떻게 코루틴이 이것을 가능하게 해주는지 네트워크 요청을 생성하기 위한 예제 코드를 통해 알아보자. Blocking 스타일 코드 메인 스레드에서 result를 networkRequest()부터 직접 리턴받는 블로킹(blocking) 스타일로 작성한 코드를 보자. 위의 코드에서 networkRequest()는 메인 스레드를 블로킹할 것이..

Kotlin/Coroutines 2022.07.03

[Android] Context의 정의와 종류, 예시

안드로이드 개발에서 Context는 Context.getString(…)을 통해 strings.xml의 문자열 리소스를 가져올 때나 View와 관련된 작업을 별도의 클래스나 함수로 분리하기 위해 파라미터로 Context를 넘기는 등 애플리케이션 내에서 매우 광범위하게 사용된다. 광범위하게 사용된다는 말은 라이프 사이클을 고려해야 된다는 것과 이어질 수 있는데, Context는 잘못 사용하면 애플리케이션의 메모리 누수를 발생시킬 수 있으므로 매우 주의해야 한다! Context가 필요한데 이것을 어디에서 땡겨와야할지 고민하다가 잘못된 Context를 참조하는 경우가 발생할 수 있는데, 이 글을 통해 Context의 개념에 대해 정의하고 내가 개발하면서 어떤 Context를 참조해야할지 고민되었던 코드를 예시..

Android 2022.04.15

Android Dependency Injection(DI, 의존성 주입) 정리

의존성 주입(Dependency injection, DI) 외부에서 하나의 객체가 다른 객체의 의존성을 제공하는 디자인 패턴 의존성(dependency): 클래스가 참조를 필요로 하는 다른 클래스를 의존성이라 한다. 주입(injection): 외부에서 객체를 생성해서 사용하려는 객체에게 전달하는 것 의존성 주입의 의도: 객체 생성과 사용의 관심을 분리하는 것 객체 사이의 결합도를 느슨하게 하고 의존 관계 역전 원칙과 단일 책임 원칙을 따르도록 하여 객체의 생성에 대한 부분을 객체의 사용(행위)와 분리하도록 한다. 단일 책임 원칙(Single Responsibility Principle, SRP) : 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 한다. 의존 관계 역전 원칙(D..

Android 2022.03.21

Android Navigation 관련 용어 정리

NavHost 호스트는 single context 또는 NavController를 통해 탐색하기 위한 컨테이너이다. NavHost를 위한 추가 API들을 제공하는 NavHostController를 인스턴스화하여 nav controller를 구성하는 것이 좋다. NavHostController는 NavHostController로 직접 노출되지 않고 외부에서 NavController로만 액세스할 수 있어야 한다. 내비게이션 호스트는 반드시 컨트롤러의 상태의 저장 및 복원을 처리해야 한다. 호스트의 루트 뷰에서 Navigation.setViewNavController를 호출해야 한다. NavController.popBackStack을 수동으로 호출하거나 NavController를 구성할 때 NavHostCon..

Android 2022.03.07

[Kotlin] Scope function (let, run, with, apply, also) 정리

코틀린 표준 라이브러리는 객체 컨텍스트 내에서 코드 블럭을 실행하는 것이 유일한 목적인 함수들을 포함하고 있다. 이 함수들을 람다식을 이용해서 호출하면 일시적인 범위(scope)가 생성되는데, 이 범위 내에서는 이름이 없어도 객체에 접근할 수 있다. 이 함수들을 Scope Function(범위 지정 함수)이라 부르며, let, run, with, apply, also 5가지가 존재한다. Function selection 함수 객체 참조 리턴 값 확장 함수 여부 let it Lambda Result O run this Lambda Result O run - Lambda Result X with this Lambda Result X apply this Context Object O also it Contex..

Kotlin 2022.03.02