반응형

분류 전체보기 216

[안드로이드] 단일 모듈에서 api/impl 구조로 리팩토링

멀티 모듈 구조로 프로젝트를 구성하면서 가장 화가났던건A feature -> B, C, D feature 모듈간 이동을 위해 A모듈에서 이동하는 모든 경로를app모듈에서 함수 형식으로 graph함수에 전달해주는 일이었다.feature모듈은 서로 독립적이기 때문에 navigator를 사용해서 직접적인 이동이 불가능하기 때문이다.fun EntryProviderScope.aNavGraph( navigator: Navigator, navigateToB: () -> Unit, navigateToC: () -> Unit, navigateToD: () -> Unit ...) { ...} 이런 경우에 위처럼 2~3개 정도면 별로 상관 없겠지만경로가 많아질수록 선언부, 호출부 모두 꼴보기..

[안드로이드] Linear Calendar에서 offset 검색 최적화

프로젝트에서 가로 선형의 달력을 최적화 해보았다. 달력이 있는 화면으로 이동시 현재 선택한 날짜가 스크롤 가장 앞에서 보여져야 하는데,데이터는 Month와 LocalDateTime리스트 형식으로 되어있고이후 현재 선택중인 날짜의 offset을 찾기위해 전체 map을 flat형태로 변환한 뒤 찾도록 되어있었다. 코드로 표현하면 아래 같은 형태fun getOffset(monthList: List, selectedDate: LocalDateTime): Int { val flatten = monthList.flatMap { it.dates } val dayOffset = flatten.indexOfFirst { it.date == selectedDate.date }.takeIf { ..

[Android] gradle 관리를 위한 build-logic 패턴

멀티 모듈 프로젝트의 경우 gradle파일이 수십개, 수백개가 될수도 있다.이 경우 모든 gradle마다 설정을 해주는건 매우 번거롭고 유지비수 비용이 많이 드는 작업이기 떄문에이를 해결하기 위해 build-logic 패턴을 사용해서 공통된 gradle 설정을 관리한다. 프로젝트 뷰 모드를 Project로 바꾸고 root 폴더에 build-logic 폴더를 새로 생성한다. 이후 프로젝트의 settings.gradle.kts에서 build-logic을 추가한다.pluginManagement { includeBuild("build-logic")}pluginManagement { repositories { google() gradlePluginPortal() }}dep..

[Android] 라이브러리 없이 직렬화/역직렬화 구현

https://angangmoddi.tistory.com/339 [Android] HttpsURLCoonection을 사용한 인터넷 통신interface HttpClient { companion object { const val DEFAULT_CONNECTION_TIMEOUT = 15_000 const val DEFAULT_READ_TIMEOUT = 15_000 } fun doRequest( method: RequestMethod, path: String, outClass: KClass, headers: List = emptyList(), body: IN? = null ): OUT funangangmoddi.tistory.com위 글에 이어서 라이브러리 없이 서버 통신에서 사용할 직렬화/역직렬화 기능을 ..

[Android] 라이브러리 없이 클라이언트에서 테스트 서버 구현

보통 네트워크 통신 테스트를 위해 OkHttp의 MockWebServer를 많이 사용하는데,해당 라이브러리 없이 테스트 서버를 구현하고 실제 테스트 코드를 작성해보도록 하겠다. private var httpsServer: HttpsServer? = nullprivate var httpServer: HttpServer? = nullfun start() { httpsServer = HttpsServer.create(InetSocketAddress(MOCK_PORT_HTTPS), 0).apply { httpsConfigurator = getTestHttpsConfigurator() createContexts() executor = null start() ..

[Android] jvmTarget 지정 방식이 deprecated 된 이유

안드로이드 gradle 설정에서 jvmTarget을 지정하는 방식은 기존에 아래처럼 사용했다.kotlinOptions { jvmTarget = "11"}하지만 이 방식은 deprecated되어 권장되는 방식이 아니다. 기존 방식은 값을 문자열로 설정하기 때문에 잘못된 값을 설정할 수 있고,잘못된 값이 들어가면 빌드중에 에러가 발생하기 때문이다반면, 툴체인 기반 jdk설정 방식은 gradle sync단계에서 이런 문제를 발견할 수 있다. 그래서 현재 권장하는 최신 방식은 아래처럼 사용한다.kotlin { jvmToolchain(11)}

[Android] Android Compose navigation 사용 시 recomposition 이슈

compose navigation과 uiState를 사용해서 A -> B로 이동하는 로직을 구현B화면이 무한으로 실행되는것을 확인 기존 코드val uiState = viewModel.uiState.collectAsStateWithLifecycle().valuevar errorAlertState by remember { mutableStateOf(ErrorAlertState()) }when (uiState) { SplashViewModel.SplashUiState.Loading -> Unit SplashViewModel.SplashUiState.Loaded -> navigateToList() is SplashViewModel.SplashUiState.Failed -> errorAlertSt..

반응형