본문 바로가기

전체 글310

navHostController vs navController 배경 Compose를 개발하다보면 Navigation을 구현할 때 NavController와 NavHostController를 혼용해서 사용하기도 합니다. NavController NavController는 NavHost 내부에서 app navigation을 관리합니다. 여기서 NavHost를 확인해보면 interface로 내부에 NavController를 가지고 있는 것을 볼 수 있습니다. 코드와 같이 주석도 확인해보면 NavController와 NavHostController가 같이 설명되고 있는 것을 볼 수 있습니다. A host is a single context or container for navigation via a NavController. host는 NavController를 통한 탐색.. 2023. 9. 20.
[Android] Compose랑 Hot Stream은 어울릴까? 배경 스낵바나 토스트처럼 매번 노출되어야 하는 컴포넌트들을 위해서 SharedFlow를 사용했었는데 Compose에서 collect되지 않는 문제가 발생했습니다. 그 이유를 하나하나 파악해 보고자 합니다. 원인을 파악하기에 전에 잠깐! 제가 앞으로 테스트하는 환경의 ViewModel은 다음과 같이 통일하겠습니다 class MainViewModel : ViewModel() { private val _testFlow = MutableSharedFlow(replay = 1) val testFlow = _testFlow.asSharedFlow() fun inputTest(value: String) { viewModelScope.launch { _testFlow.emit(value) } } } XML + Shar.. 2023. 9. 19.
[Android] Multi-Module 구조에서 Navigation을 구현하자 (with DeepLink) 배경 이번에는 Multi-Module구조에서 Navigation을 적용하는 방법에 대해 정리해볼까 합니다. 제가 모듈화를 적용하면서 feature 단위로 모듈을 나눴을 때 2개의 feature 간의 의존성이 없기 때문에 어떻게 이동해야하는지 막막했던 경험이 있습니다. 다른 포스팅을 참고하려고 해도 이게 뭔소린가 싶은 내용도 있었고, 따라 적용해봤지만 좀 더 좋은 구조를 찾고 싶다는 마음이 생긴 적도 있었기에 제가 직접 구현하고 정리해서 이 글을 통해 다른 분들이 조금이나마 쉽게 Navigation을 적용하셨으면 합니다! ※ Compose가 아닌 일반 XML을 활용한 방식입니다. 만약에 Compose Navigation을 원하시면 댓글로 남겨주세요 ㅎㅎ 빠른 시일 내로 정리해보도록 하겠습니다! Naviga.. 2023. 9. 19.
[Android] 'excludes' is deprecated Android 컴포즈 프로젝트를 생성했을 때 build.gradle에서 'excludes' is deprecated Warning이 발생했을 때는 다음과 같이 수정해주시면 됩니다. // 수정 전 packaging { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } // 수정 후 packagingOptions { resources { excludes += '/META-INF/{AL2.0,LGPL2.1}' } } 참고 https://stackoverflow.com/questions/75172062/how-to-replace-deprecated-packagingoptions-in-android-gradle-build-files 2023. 9. 19.
[Intelij][Android][Git] 변경된 코드들을 관리하기 힘들 때 ChangeList를 활용해보자 정리 배경 이번 드로이드 나이츠 2023에 참여해서 Track1 Marton Braun 님이 발표하신 "Git Good with Android Studio"을 듣게 되었습니다. 그 중에서도 Intelij에서 제공되는 "New ChangeList"가 굉장히 편리해보여서 어떻게 활용할 수 있는지 정리해보고자 합니다. New ChangeList란?? Intelij 기반 IDE에서 commit 탭을 열어주면 Changes라는 항목이 있습니다. 해당 항목의 옵션을 열어보면 다음과 같이 New ChangeList, Delete ChangeList가 나오는 것을 보실 수 있습니다. Intelij에 따르면 ChangeList를 다음과 같이 설명합니다. Changelists are displayed in the Chan.. 2023. 9. 15.
[Android] implementation과 testImplementation의 차이 배경 현재 프로젝트에 테스트 코드를 도입하려고 여러 자료를 공부하는 와중에 nowinandroid testing 모듈에 대한 의존성 설정에 대한 의문점이 들었습니다. A -> B, B -> A에 대한 의존성을 가질 때 순환참조가 발생하게 되는데 왜 발생하지 않을까? 라는 의문이 들었고 한번 내용을 정리해보고자 합니다. 순환참조에 대한 개념은 이 링크를 참고해주세요! implementation의 종류 implementation의 종류에는 implementation, testImplementation, androidTestImplementation, debugImplementation이 있습니다. 앞에 붙은 이름은 각 라이브러리들이 적용될 범위를 뜻합니다. 애플리케이션을 개발할 때 릴리즈, 디버그, 테스트 .. 2023. 9. 2.
DNS란 무엇일까? DNS란 무엇일까? 도메인 이름 시스템(Domain Name System)은 사람이 읽을 수 있는 도메인 이름(ex: www.naver.com)을 읽을 수 있는 IP 주소 (ex: 192.0.2.44)로 변환합니다. 스마트폰이나 노트북부터 대규모 소매 웹 사이트의 콘텐츠를 서비스하는 서버에 이르기까지 인터넷 상의 모든 컴퓨터는 숫자를 사용하여 서로를 찾고 통신합니다. 이러한 숫자를 IP 주소 라고 합니다. 웹 브라우저를 열고 웹 사이트로 이동할 때 긴 숫자를 기억해 입력할 필요가 없습니다. 그 대신 example.com과 같은 도메인 이름을 입력해도 원하는 웹 사이트로 갈 수 있습니다. 인터넷의 DNS 시스템은 이름과 숫자 간의 매핑을 관리하여 마치 전화번호부와 같은 기능을 합니다. DNS 서버는 이름을.. 2023. 8. 19.
CDN이란 무엇일까요? CDN (Content Delivery Network: 콘텐츠 전송 네트워크)란 무엇일까? AWS 공식 문서에 의하면 다음과 같습니다. 콘텐츠 전송 네트워크 (cdn)는 데이터 사용량이 많은 애플리케이션의 웹 페이지 로드 속조를 높이는 상호 연결된 서버 네트워크입니다. 사용자가 웹 사이트를 방문할 때 해당 웹 사이트 서버의 데이터는 사용자의 컴퓨터에 도달하기 위해 인터넷을 통해 이동해야 합니다. 사용자는 해당 서버에서 멀리 떨어져 있는 경우 도영상 또는 웹 사이트 이미지와 같은 대용량 파일을 로드하는 데 시간이 오래 걸립니다. 대신 웹 사이트 컨텐츠는 지리적으로 사용자와 가까운 CDN 서버에 저장되며 훨씬 빨리 도달합니다. 즉, CDN은 최종 사용자와 가까운 곳에 콘텐츠를 캐시하는 지리적으로 분산된 서버.. 2023. 8. 15.
[Android] Compose Navigation + Stateflow를 쓰는데 왜 리컴포지션이 계속 발생하지..? (1) 문제 배경 이번에는 제가 경험 했던 Compose Navigation과 Stateflow를 같이 사용했을 때 발생했던 문제에 대해서 작성해보려 합니다. 저는 Android Developer에서 제공되는 Compose Navigation의 NavHost를 참고했습니다. ViewModel의 경우 간단하게 다음과 같이 구성하겠습니다. class MyViewModel : ViewModel() { private val _test = MutableStateFlow(null) val test = _test.asStateFlow() fun update(check: Boolean?) { _test.value = check } } 화면 구성의 경우 StartScreen, A, B 화면을 두고 StartScreen에서 Vi.. 2023. 8. 7.