https://seyoungcho2.github.io/CoroutinesKoreanTranslation/undefined-1.html 일시중단 함수 구성하기 · GitBook이 섹션은 일시 중단 함수를 구성하기 위한 다양한 접근 방식을 다룬다. 일종의 원격 서비스 호출이나 계산 같은 두 유용한 일시 중단 함수들이 서로 다른 위치에 정의되어 있다고 가정해보자.seyoungcho2.github.io- 위 문서를 참고하여 작성했습니다.기본적인 순차 처리- 아래와 같은 코드를 실행하면 기본 순차적 실행으로 인해 42가 반환된다.suspend fun doSomethingUsefulOne(): Int { delay(1000L) // 여기서 유용한 작업을 실행한다고 가정한다. return 13}suspen..
coroutine
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: ..
Scope Builder- 다른 builder들에서 제공하는 Coroutine Scope 외에도, Coroutine Scope 빌더를 활용하여 고유한 scope을 선언할 수 있다. - coroutineScope는 자식 Coroutine 들의 실행이 모두 완료될 때까지 종료되지 않는 Coroutine Scope을 생성한다. - runBlocking의 경우에는 대기를 위해 현재 Thread를 Block 시키는 반면, coroutineScope는 다른 작업이 수행될 수 있도록 작업 중이던 스레드의 자원 사용을 해제한다는 차이가 있다.fun main() = runBlocking { doWorld()}suspend fun doWorld() = coroutineScope { // this: Coroutine..
Coroutine이란?- Coroutine은 일시정지 연산을 위한 인스턴스이다. 이것은 코드의 나머지 부분들과 동시에 실행되는 코드 블록을 가진다는 점에서 스레드와 개념적으로 비슷하다. 하지만, 코루틴은 특정한 스레드에 종속되어 실행되지 않으며, 하나의 스레드에서 일시정지(suspend) 되었다가 다른 스레드에서 재개(resume)될 수 있다. - 일반적인 스레드와 달리 코루틴은 작은 비용으로 생성되고, 필요할 때만 작업을 실행하거나 중단할 수 있기 때문에, 리소스 효율성이 매우 뛰어나다. - 코루틴의 장점으로는 간결한 문법과 취소, 중단, 시간 초과에 대한 제어가 유연하다. Coroutine 핵심 구성 요소- 중단 가능한 suspend 함수 : Coroutine 안에서만 호출 가능suspend fun ..
- 해당 문서와 번역본을 참고했습니다.https://kotlinlang.org/docs/composing-suspending-functions.html#sequential-by-default Composing suspending functions | Kotlin kotlinlang.orghttps://seyoungcho2.github.io/CoroutinesKoreanTranslation/undefined-1.html 일시중단 함수 구성하기 · GitBook이 섹션은 일시 중단 함수를 구성하기 위한 다양한 접근 방식을 다룬다. 일종의 원격 서비스 호출이나 계산 같은 두 유용한 일시 중단 함수들이 서로 다른 위치에 정의되어 있다고 가정해보자.seyoungcho2.github.io- 간혹, 서비스를 구성하면..
- 페이징 라이브러리를 사용한 것은 아니고, 파라미터로 page: Int를 보내고 response로 hasNext: Boolean을 수신받을 수 있는 형태의 api에서 페이징을 자체 코드로 간단하게 구현한 예시다.상단 구성 - Scaffold 구조로 상단에 TopAppBar를 가지고 내부 content로 리스트를 가지는 화면에서 페이징을 구성했다.Scaffold(topBar = { TopAppBar(modifier = Modifier.padding(start = 12.dp), title = { Text() }, navigationIcon = { IconButton(modifier = Modifier .size..

Places Api (New) 활용- 사내 프로젝트에 예전부터 Places SDK가 적용되어 위치 검색 기능을 담당하고 있었는데, 어느 시점부터 아래와 같이 오류가 표시되는 지역들이 증가하기 시작했다.- Google Places API(신규)는 기존 Places API를 대체하는 서비스로, 장소 검색, 자동완성, 상세 정보 조회, 좌표 변환 등의 기능을 제공한다. 그리고 데이터가 등록된 장소 개수 자체도 훨씬 많은 것으로 알고 있다. - 기존에 사용하고 있던 API Key가 있다면 Places Api (New)를 사용으로 설정한 뒤, 제한 목록에 추가해 주면 된다.- 신규, 기존 상관없이 적어도 아래 목록은 키 제한 API 목록에 포함시켜야한다. 그렇지 않다면 권한 거부 오류가 발생한다.Places SD..

기존 프로젝트는 Retrofit을 매번 모든 Api 통신 클래스 하위에 가지고 있었습니다. 또한 통신 과정에서 예외 처리하는 부분까지 반환되는 타입이 매번 다를 뿐 거의 유사했기 때문에코드 관리 및 낭비를 줄이기 위한 정리가 필요했습니다. API 통신 클래스들이 추상 클래스를 상속받는 형태로 처리를 진행했습니다.먼저 각각의 API 통신 결과 타입은 항상 상이할 수 있기에 제네릭을 활용하여 값을 받을 Result Class를 만들어줍니다.sealed class Result { data class Success(val data: T) : Result() data class Error(val message: String? = "ERROR", val code: Int) : Result()}매번 다른 ..

자사 서비스를 개발하던 중, 대량 데이터를 가지고 있는 특정 사용자의 CS에서 화면에 보여야 할 데이터의 렌더링이 느리다는 보고를 받았습니다.화면을 넘기다가 멈추면 일정이 늦게 그려져요. 서비스의 데이터(일정)를 보여주는 화면의 구조는 ViewPager로 구성되어 있었고, 각 페이지가 Selected 될 때마다 매번 전체 데이터 중 현재 화면에 보여줘야 할 데이터들을 쿼리 하는 작업이 수행되는 구조였습니다.문제점은 빠르게 스크롤을 하면 대량의 쿼리 요청이 축적되고, 데이터 DB는 작업의 부하가 걸리면서 최종적으로 보이는 마지막 페이지의 쿼리 후 데이터 렌더링이 지연되는 것이었습니다. 해결 방안DB 작업을 취소하던지, 순서 제어를 하던지 둘 중 하나의 방법이 필요했습니다.하지만 안드로이드 SQLite에서..

Room DB 기본 설정 후, 데이터 저장 및 가져오기 Room DB 살펴보기 사내 서비스에서 기존에 사용하고 있던 Database가 SQLite, Realm DB 두 가지 종류였는데, 이번에 새로운 테이블 구성이 필요해서 Jetpack에서 제공하는 Room DB를 사용해 봤다. https://developer.android.com/training/data-storage/room?hl=ko Room을 사용하여 로컬 데이터베이스에 데이터 저장 | Android 개발자 | Android Developers Room 라이브러리를 사용하여 더 쉽게 데이터를 유지하는 방법 알아보기 developer.android.com Room DB를 그냥 사용하려는 것은 아니고, 당연히 SQLite보다 장점이 있기에 사용하게 ..