전체 글

개발/트러블슈팅

[안드로이드] FragmentContainerView NullPointerException 해결

defaultNavHost 설정, navGraph 설정, NavHostFragment, NavController 모두 잘 작성된 코드인데도 종종 아래 오류와 같이 NavHostFragment NullPointerException이 발생하는 경우가 있습니다. java.lang.RuntimeException: Unable to start activity ComponentInfo{com.sample.yolo/com.sample.presentation.view.MainActivity}: java.lang.NullPointerException: null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment 아래 오류 코드를 보면 ..

개발/Android

[안드로이드] 클린 아키텍처 - (3) 멀티 모듈 패키지 구조

이번 포스팅에서는 안드로이드 스튜디오에서 클린 아키텍처 구조를 적용한 멀티모듈 프로젝트를 생성하는 예제를 설명하도록 하겠습니다.계층별, 클래스별 세부적인 코드들은 들어있지 않으니 우선 전체적인 구조를 이해한다는 마음으로 읽어주시면 감사하겠습니다.다음 포스팅에서는 간단한 실습 앱을 만들면서 각 클래스별 역할/세부 코드와 전체적인 플로우에 대해 알아보겠습니다. 프로젝트 설정우선 전체적인 구조로 보면 기본으로 있는 app 모듈은 Application 클래스가 위치하며, 사용하는 DI에 따라 모든 Module들이 이곳에 존재할 수도, 또는 각 계층에 존재할 수도 있습니다. ✔️ 좌측 상단 File - New - New Module을 선택합니다. ✔️ 좌측 메뉴들 중에서 Android Library를 선택한 뒤,..

개발/Android

[안드로이드] 클린 아키텍처 - (2) 의존성 역전

클린 아키텍처 첫번째 포스팅에서 Domain 계층이 외부에 의존성을 가지지 않도록 하는 의존성 규칙(DIP)을 적용하기 위해 추상화된 인터페이스를 사용했다. 하지만 클린 아키텍처는 비교적 러닝커브가 가파른 개념이라 세부사항들에 대한 설명이 중요할 것 같아서 DIP를 사용하는 이유와 적용했을때/적용하지 않았을 때의 구조적 차이점에 대해 알아보고자 한다. 이번 포스팅은 Project level(Module Level이라고 해야하나? 몰?루)에서의 계층간 의존도와 Source code level에서의 계층간 의존도 이렇게 크게 두 파트로 나뉘어진다. 프바프라서 모든 프로젝트에 해당되지 않을 수도 있지만, 내가 진행중인 프로젝트에서는 Data 계층의 Mapper에서 해당 계층의 데이터 클래스를 Domain 계층..

개발/Android

[안드로이드] 클린 아키텍처 - (1) 개념

오늘의 주제는 로버튼 마틴 형님의 "클린 아키텍처"라는 개념이다. 많은 기업들이 해당 아키텍처 구조를 사용하고 있으며, 비즈니스 로직 덩어리가 클수록 장점이 부각되는 구조이다. 하지만 기존의 "클린 아키텍처"라는 개념은 분야에 구애받지 않는 개념이라 안드로이드에서는 완벽하게 호환되지 않는다. 그래서 오늘은 안드로이드에서의 클린 아키텍처에 대해 설명하고자 한다. 구조도를 보면 컴포넌트나 의존성 구조가 조금 다르니 그 부분을 유의해서 보면 이해가 쉬울 것이다. 클린 아키텍처의 핵심적인 역할을 하는 SOLID에 대해 궁금하다면 이 포스팅을 참고하면 도움이 될 것이다. 클린 아키텍처와 SOLID클린 아키텍처는 이제 안드로이드 진영의 많은 기업들이 선호하는(?) 아키텍처가 되었다.내가 이 책을 읽었던 작년 이 맘..

개발/Android

[안드로이드] 오픈소스 라이선스 고지

개발자들은 다양한 오픈소스 라이브러리들을 사용한다.오늘은 그 중에서 내가 사용하는 여러 라이브러리들의 라이선스에 대해 알아보고, 상업적인 목적으로 사용하는 경우에 어떤 방식으로 표기하는 것이 올바른 라이브러리 사용법인지 알아보고자 한다.대부분의 라이브러리는 프로젝트의 라이선스 고지를 요구하는 경우가 많기 때문에, 이를 정확히 알아야 앱을 출시하고 운영하는데에 있어서 문제가 발생하지 않을 것이다.1. RxJava- 라이선스: Apache License 2.0- 고지 방법: 라이선스 텍스트를 포함한 복사본을 프로젝트의 라이선스 고지 문서에 포함해야 한다. 2. Retrofit- 라이선스: Apache License 2.0- 고지 방법: 라이선스 텍스트를 포함한 복사본을 프로젝트의 라이선스 고지 문서에 포함해..

개발/Android

[안드로이드] ViewModel에서 context를 사용하는 방법

우리는 보통 ViewModel을 생성할 때 ViewModel()을 상속받아 사용한다. 그래서 일반적으로 ViewModel에서는 Context에 직접 접근하지 않는다. ViewModel의 주요 목적이 UI와 비즈니스 로직을 분리하기 위한 것이기 때문이다. 이를 통해서 UI의 생명주기에 영향을 받지 않고 독립적으로 데이터를 유지할 수 있게 된다. 하지만 특정 상황에서는 ViewModel에서 Context에 접근해야하는 경우가 발생하다. 이 때 생성자 파라미터로 받거나 객체를 생성해서 받는 것은 올바른 방법이 아니다. AndroidViewModel 클래스를 사용해서 해결이 가능한데, 이는 Application Context를 파라미터로 받고 이것을 통해 리소스나 시스템 서비스를 사용할 수 있게 된다. clas..

개발/트러블슈팅

[안드로이드] is not abstract and does not implement abstract member public abstract fun getActionId() 오류

> Task :presentation:compileDebugKotlin FAILED e: file:///C:/Users/Minkyu/AndroidStudioProjects/Ratel/android/presentation/build/generated/source/navigation-args/debug/com/project/presentation/view/ListFragmentDirections.kt:9:16 Class 'ActionListFragmentToMemoFragment' is not abstract and does not implement abstract member public abstract fun getActionId(): Int defined in androidx.navigation.Nav..

CS

[CS] 동시성과 병렬성의 차이

CS 공부를 하다 보면 동시성과 병렬성에 대한 얘기를 심심치 않게 볼 수 있다. 하지만 "동시"와 "병렬"이 비슷한 결을 가지고 있어서인지 두 개념을 혼동하는 경우를 종종 볼 수 있다. 그래서 오늘 포스팅은 비슷하지만 다른 두 개념을 제대로 이해하고자 동시성, 병렬성 각각에 대한 이해와 둘의 차이, 관계에 대해 적어보고자 한다. ✔️ 동시성(1) 정의물리학의 상대성이론에서는 "동시성"의 정의에 대해,물리학에서의 동시성 > 어떤 특정 좌표계에서 어던 두 개의 사건이 같은 시간에 일어나면 그 두 사건이 동시에 일어났다이렇게 정의하고 있다. 하지만 프로그래밍에서의 동시성은 조금 다른 의미로 사용되며, 싱글/멀티코어 모두에서 구현할 수 있는 개념이다.프로그래밍에서의 동시성 > 여러 작업들이 동시에 실행되는 것처..

개발/트러블슈팅

[안드로이드] Could not resolve com.android.tools.build:gradle:7.4.2 오류

멀티모듈에다 여러 써드파티 라이브러리들까지 뭉탱이로 넣은 프로젝트 설정은 너무 힘들다.. 오늘만 열개 정도는 해결한 것 같은데, 난 보통 이런 오류를 마주할 때마다 무지성 수정을 하는 경우가 많다. 특히 하루에 열댓개씩 터져나오는 경우에는 스트레스 때문에 더더욱.. 정확히 요점을 짚어내기 보다는 조금 읽고 이 부분이 문젠가? 수정 -> 아니네 여긴가? 수정 -> 반복.. 이런식이다. 하지만 아무리 갑갑해도 에러 메시지를 꼼꼼히 읽고 가려운 부분을 정확하게 긁어줘야 금방 해결할 수 있다. 아래 에러 메시지는 그 중에서 제일 해결이 오래 걸린 오류이다. A problem occurred configuring root project 'MyApp'. > Could not resolve all files for ..

개발/트러블슈팅

[안드로이드] 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..

최선의 최선
왜?