본문 바로가기

전체 글

(271)
[Kotlin] 코틀린 공식 문서 - Composing suspending functions 개요 해당 게시글은 Composing suspending functions | Kotlin (kotlinlang.org)을 번역한 을 번역한 게시글 입니다. Composing suspending functions 이번 섹션에서는 suspending 함수 구성에 대한 다양한 접근법을 다룬다. Sequential by default API를 호출하거나 연산하는 것과 같은 용도로 사용되는 두 개의 suspend 함수가 있다고 가정해보자. 단순히 유용할 것이라 생각했지만 이 예제에서는 각 함수는 1초씩 지연된다. suspend fun doSomethingUsefulOne(): Int { delay(1000L) // pretend we are doing something useful here return 13 }..
[Kotlin] Introduction to Coroutines and Channels-7 개요 해당 게시글은 Welcome to Kotlin hands-on (kotlinlang.org)을 번역한 게시글 입니다. Testing Coroutines 코루틴으로 작성된 코드를 어떻게 테스트하는지 확인해보자. Concurrent 코루틴을 실행하는 솔루션이 suspend 함수를 활용한 솔루션 보다 빠른지 확인하고, 채널이 있는 솔루션이 단순한 "progress" 솔루션 보다 빠른지 확인하는게 좋다. 이런 솔루션의 총 실행 시간을 비교하는 방법에 대해 살펴보자. Gihub service를 mocking하고 아래 주어진 시간에 리턴하도록 구현하자. repos request - returns an answer within 1000 ms delay repo-1 - 1000 ms delay repo-2 - 1..
[Kotlin] Introduction to Coroutines and Channels-6 개요 해당 게시글은 을 번역한 Welcome to Kotlin hands-on (kotlinlang.org)게시글 입니다. Channels 가변적인 상태를 공유하는 코드를 작성하는 것은 매우 까다롭고 에러가 자주 발생하는 지점이다. 공통 가변 가능한 상태를 사용하는 대신 커뮤니케이션으로 정보를 공유하는 것은 이를 쉽게 해결할 수 있다. 코루틴은 Channel을 통해 서로가 통신할 수 있다. Channel은 서로 다른 코루틴 사이에서 데이터를 전달하기 위한 통신 원시형이다. 하나의 코루틴에서 어떤 정보를 Channel로 전송하면 다른 코루틴은 Channel에서 해당 정보를 수신할 수 있다. 정보를 송신하는 코루틴을 생산자, 그리고 정보를 수신하는 코루틴을 소비자라고 부르기도 한다. 필요할 때는 많은 코루틴..
[Kotlin] Introduction to Coroutines and Channels-5 개요 해당 게시글은 Welcome to Kotlin hands-on (kotlinlang.org)을 번역한 게시글입니다. Showing Progress 일부 레포지토리에 대한 정보는 꽤 빠르게 로딩됨에 불구하고 유저는 모든 데이터가 로딩된 후에 결과 목록을 볼 수 있게 구현하려 한다. 그때까지 로딩 아이콘이 실행되어 진행상황을 보여주지만 현재 상태나 어느 contributors까지 로딩되었는지 등의 정보는 존재하지 않는다. 중간 결과를 일찍 보여주고 모든 contributors 정보는 각 레포지토리 데이터가 로딩된 후에 표시할 수 있다. 이런 기능을 구현하기 위해서 콜백으로 UI를 업데이트하기 위한 로직을 추가하여 각 중간 상태마다 호출되도록 해야 한다. suspend fun loadContributor..
[Kotlin] Introduction to Coroutines and Channels-4 개요 해당 게시글은 Welcome to Kotlin hands-on (kotlinlang.org)을 번역한 게시글입니다. Structured Concurrency(구조화된 동시성) Coroutine scope은 서로 다른 코루틴 사이에서 구조(structure)를 담당하고 부모-자식 관계를 맺는다. Scope 내부에서 언제는 코루틴을 생성할 수 있는 것을 확인했다. Coroutine context는 담당하는 코루틴이 동작하는데 사용되는 기술적인 정보를 저장한다. (코루틴 이름, 코루틴이 스케쥴링 되어야 하는 스레드를 명시한 dispatcher 등) 새로운 코루틴을 시작할 때 launch, async, runBlocking을 사용하고 자동적으로 상응하는 scope을 생성하게 된다. 이들은 리시버를 인자로 ..
[Kotlin] Introduction to Coroutines and Channels-3 개요 해당 게시글은 Welcome to Kotlin hands-on (kotlinlang.org)을 번역한 게시글입니다. Concurrency 코루틴은 스레드에 비해 매우 비용이 저렴하다. 새로운 연산을 비동기적으로 시작하기 원할 때마다 코루틴을 만들 수 있다. 새로운 코루틴을 시작하기 위해 launch, async, runBlocking 같은 "Coroutine Builder"를 사용한다. 코틀린의 코루틴 외 다른 라이브러리는 다른 코루틴 빌더가 존재할 수도 있다. async는 새로운 코루틴을 시작하고 Deferred 객체를 반환한다. Deferred는 다른 이름으로 Future/Promise 등의 개념으로 알려져있다. 이는 연산을 저장하지만 최종적인 결과를 얻는 순간을 지연시킨다. 즉 미래(futur..
[Kotlin] Introduction to Coroutines and Channels-2 개요 해당 개시글은 Welcome to Kotlin hands-on (kotlinlang.org)를 번역한 게시글입니다. Using Suspend Function Retrofit은 코루틴을 지원하고 이를 활용할 것이다. Call를 반환하는 대신 API 호출을 suspend 함수로 정의한다. interface GitHubService { @GET("orgs/{org}/repos?per_page=100") suspend fun getOrgRepos( @Path("org") org: String ): List } 이면에 있는 메인 아이디어는 요청을 수행하는데 suspend function을 사용한다는 것이고 스레드가 차단되지 않는다는 것이다. 이게 어떻게 동작하는지는 나중에 논의할 것이다. 지금은 getOrg..
[Kotlin] Introduction to Coroutines and Channel-1 개요 해당 개시글은 Welcome to Kotlin hands-on (kotlinlang.org)를 번역한 게시글입니다. Introduction 이번 핸즈 온 튜토리얼을 통해 코루틴의 개념에 친숙해질 것이다. 코루틴은 비동기 및 넌블러킹 처리 과정에서 이점이 있으며 가독성도 해치지 않는다. 네트워크 요청에서 블러킹, 콜백 없이 어떻게 코루틴을 사용해야 하는지 확인할 수 있을 것이다. 배울 내용은: 왜 그리고 어떻게 suspend function을 네트워크 요청에 사용하는가 어떻게 코루틴을 이용해서 동시 요청을 보내는가 어떻게 서로 다른 코루틴 사이에서 채널(channels)을 활용해서 정보를 공유하는가 또한 어떻게 코루틴이 다른 비동기 솔루션들과 다른 지 확인할 것이다. 네트워크 요청에는 코루틴을 서포팅..