- 최근 내가 구성한 클린 아키텍처의 레이어는 프레젠테이션 - 도메인 - 데이터 레이어로 구성된다. - 여기서 도메인이란 무엇일까? 바로 비즈니스 로직과 함께 앱의 핵심적인 규칙을 정의하는 레이어다. - UseCase가 포함되며 UseCase는 애플리케이션의 구체적인 비즈니스 규칙을 캡슐화한 것이다. - 앱의 기능적인 부분이 변경된다? 이 도메인 레이어를 수정하게 된다. - 여기서 기능을 명확히 보자1. 사용자에게 스켈레톤 효과를 보여준다.2. 사용자에게 유저 데이터 조건 처리를 통해 이벤트 목록을 추천한다.3. 사용자가 선택한 이벤트를 로컬 DB에 저장한다. - 1번의 경우에는 순수 UI 동작이다. 안쪽 레이어로 들어올 이유가 없다. - 3번의 경우에는 로컬 DB에 저장하는 순수 서비스의 기능이다. 데..
Kotlin
- 코틀린 개발자라면 정말 매일 사용하는 Scope Function. - 그 목적과 의미를 알고 사용하면 더 낭비를 줄일 수 있다. 블로그에 정리된 내용이 없어 보이길래.. 남겨봄.Scope Function객체의 Context내에서 코드의 블록을 실행하는 것이 유일한 목적인 함수.코드의 기능을 정리하고 표현하여 가독성을 높인다.Apply객체 확장 함수, 객체의 초기화에 사용하며, this 생략 가능 val person = Person().apply { firstName = "Lee" lastName = "Park" }Also객체를 파라미터를 통해 전달 (기본 파라미터 : it)해당 파라미터는 Lambda의 입력 값으로 지정//1~100까지의 함수를 랜덤으로 추출하여 그 값을..
- 결제 모듈 라이브러리를 업데이트하라는 알림이 와서 업데이트했더니 코틀린 버전도 2.0으로 업그레이드해야 호환이 된다고 한다. - 그래서 프로젝트 수준 Gradle에 선언해 둔 코틀린 버전을 일단 2.0.0으로 업그레이드했다.buildscript { ext.kotlin_version = '2.0.0' ... - 코틀린 버전 업그레이드에 따라 Compose 컴파일러 버전에 대해서도 변경해주어야 한다.- Compose 컴파일러가 Gradle plugin 방식으로 변경되었다. - 원래는 버전 카탈로그를 통해 다음 링크에 나온 것처럼 업데이트를 할 수 있는데, 현재 프로젝트 상태가 많이 상이하여 임시 대응했다.https://developer.android.com/develop/ui/compose/c..
- Hilt를 기반으로 Network Module을 만들고, Retrofit provide 함수를 생성했을 때, 다음과 같이 baseUrl을 고정해 놓았었다.@Singleton@Providesfun provideRetrofit( okHttpClient: OkHttpClient): Retrofit { return Retrofit.Builder() .client(okHttpClient) .baseUrl(ServerStatus.API_URL_PRFIX) .addConverterFactory(GsonConverterFactory.create()) .build()} - 하지만 가끔 다른 Base URL을 요구하는 api를 사용해야 하는 경우도 있다. -..
- 이전에 Image 컴포저블을 활용하여 중첩된 원형 프로필 이미지를 구현했었다. - 하지만 프로필 이미지가 기본 drawable이 아니고, File이나 네트워크로부터 수신받아야 하는 경우가 있다. - 이 경우에 Coil의 AsyncImage를 활용하여 보여주도록 처리했다.//A composable that executes an ImageRequest asynchronously and renders the result.@Composablefun AsyncImage( model: Any?, contentDescription: String?, modifier: Modifier = Modifier, transform: (State) -> State = DefaultTransform, ..

- 이미지를 중첩시키고 싶다면 Box 컴포저블을 사용하면 된다. Z 축으로 쌓이는 컨테이너 구조이다. - Image 말고 다른 컴포저블들도 중첩된다.@Composablefun Avatar(~~) { Box( modifier = Modifier.wrapContentSize() ) { Image(~~~) Image( painter = painterResource(id = R.drawable.abc), contentDescription = "Profile", modifier = Modifier .size(size.dp) .padding(3.5.dp) ..
- Hilt 기반으로 Network Module을 구성했는데, 갑자기 제목과 같은 오류가 발생했다. - 다음 함수가 문제였다.@Provides@Singletonfun provideApiService(retrofit: Retrofit, service: Class): T = retrofit.create(service)- Hilt는 DI 그래프를 컴파일 타임에 생성하기 때문에, 어떤 타입을 주입할지 명확히알아야 한다.그런데 위처럼 로 제네릭을 쓰면 어떤 타입인지 컴파일 시점에 알 수 없기 때문에 에러가 발생한 것. - 아래처럼 Api 호출 관련 함수가 하나로 정리된 Interface를 지정해 주면 된다.@Provides@Singletonfun provideApiService(retrofit: Retro..

- 위와 같은 형태의 동적 가이드를 Compose 기반으로 구현했다. - 애니메이션을 제공하는 JSON 파일의 경우, 디자이너분으로부터 제공받은 점 참고. - JSON 파일의 경우 res - raw 폴더를 생성하여 넣어주면 된다. (압축하지 않고, 변형 없이 앱에 들어가야 하는 파일들) - 영상을 보면, JSON 애니메이션이 바로 나타나는게 아니라 서서히 페이드인 되면서 나타난다. - 이를 위해 Compose의 AnimatedVisibility를 활용한다.AnimatedVisibility( visible = showGuide, enter = fadeIn(animationSpec = tween(1500)), exit = ExitTransition.None) { ...- 뷰의 가시성을 조정할..
https://seyoungcho2.github.io/CoroutinesKoreanTranslation/undefined-1.html 일시중단 함수 구성하기 · GitBook이 섹션은 일시 중단 함수를 구성하기 위한 다양한 접근 방식을 다룬다. 일종의 원격 서비스 호출이나 계산 같은 두 유용한 일시 중단 함수들이 서로 다른 위치에 정의되어 있다고 가정해보자.seyoungcho2.github.io- 위 문서를 참고하여 작성했습니다.기본적인 순차 처리- 아래와 같은 코드를 실행하면 기본 순차적 실행으로 인해 42가 반환된다.suspend fun doSomethingUsefulOne(): Int { delay(1000L) // 여기서 유용한 작업을 실행한다고 가정한다. return 13}suspen..
Coroutine 실행 취소- launch를 통해 반환되는 job의 cancel로 코루틴의 실행을 취소할 수 있다.fun main() = runBlocking { val job = launch { repeat(1000) { i -> println("job: I'm sleeping $i ...") delay(500L) } } delay(1300L) // 약간의 시간 동안 delay 한다. println("main: I'm tired of waiting!") job.cancel() // Job을 cancel한다. job.join() // Job의 실행이 완료될 때까지 기다린다. println("main: ..