목록Kotlin (18)
디지안의 개발일지
코틀린 코루틴 취소 이 문서는 Kt.Academy를 보고 배운 내용을 작성하였습니다. 코틀린 코루틴을 취소하는 방법에 대해서 설명합니다. 코틀린 코루틴을 취소하는 것은 코루틴에서 매우 중요한 기능입니다. 훌륭한 취소 메커니즘은 그만큼 가치가 있습니다. 단지 스레드를 죽이는 것은 좋지 않은 해결법입니다. 스레드를 죽이기 전에 스레드에서 활용 중이던 어떤 연결이 리소스를 해제 해줘야 합니다. 그러면 코루틴은 어떻게 취소하는지 살펴보도록 하겠습니다. 기본 취소 방법 Job 인터페이스는 취소를 할 수 있는 cancel 함수가 존재합니다. 코루틴의 취소는 다음과 같은 특징을 가지고 있습니다. 취소 시점으로부터 첫 번째 중단 지점으로부터 취소가 이루어집니다. 하위 Job이 있는 경우 모두 취소합니다. 한번 Job을..
이 문서는 Kt.Academy를 보고 배운 내용을 작성하였습니다. suspendCoroutine을 이해하고 코틀린에서 어떤 방식으로 지연 - 재개가 이루어지는 살펴봅니다. suspendCoroutine 특징 살펴보기 아래와 같이 코루틴 코드를 작성하면 순차적으로 실행이 되면서 결과가 나옵니다. fun main() = runBlocking { launch { println("1") println("2") println("3") println("4") } } // 결과 1, 2, 3, 4 중간에 suspendCoroutine을 넣으면 supendCoroutine을 선언한 부분에서 실행이 멈추게 됩니다. fun main() = runBlocking { launch { println("before") suspe..
Inline functions 들어가기 전에 이 글은 코틀린 공식 홈페이지의 글을 보고 배운 내용을 작성하였습니다. 람다식의 문제점 고차함수를 통해서 람다식을 사용하면 Runtime에 패널티가 부과될 수도 있다. 람다식 자체가 하나의 오브젝트고 클로저를 캡처하기 때문이다. 쉽게 말하면 람다식은 문법적으로 함수형 인터페이스의 구상 익명 객체이기 때문에 결과적으로 객체가 되고 람다식을 사용한 만큼 객체가 증가하기 때문에 메모리를 더 사용하게 된다. Inline 함수 그렇기 때문에 등장한 것이 inline 함수다. inline 함수는 컴파일 시점에 람다식을 마치 원래 그 자리에 해당 블록 구문들이 존재하는 것처럼 변경해준다. 예시로 아래와 같은 코드를 보자. 코틀린 코드 fun main() { var a: S..

들어가기 전에 이 글에서는 코루틴의 취소와 시간초과에 대해서 다룬다. Cancelling coroutine execution 긴 시간 운영하는 애플리케이션에서는 백그라운드 코루틴을 세밀하게 제어하는 것이 필요하다. 예를 들어, 유저가 페이지를 닫았을 때 실행 중이던 코루틴과 그 결과가 더 이상 필요하지 않으면 취소되어야 한다. launch 함수는 Job을 반환하는데 Job을 통해서 취소 할 수 있다. fun main() = runBlocking { val job = launch { repeat(1_000) { i -> println("job: I'm sleeping $i ...") delay(500L) } } delay(1_300L) println("main: I'm tried of waiting!") ..

들어가기 전에 이 글은 기본적인 coroutine의 개념을 설명한다. Your first coroutine coroutine은 일시중지하는 계산이 가능한 인스턴스다. 개념적으로는 스레드와 유사한다. 이 의미는 코루틴에 해당하는 코드 블록이 다른 코드와 동시적으로 일을 수행한다는 의미다. 그러나 코루틴이 어떤 특별한 스레드를 의미하는 것은 아니다. 코루틴은 하나의 스레드 안에서 코루틴 자체의 실행을 지연하고 또 다른 스레드에서 실행을 재개한다. 코루틴은 경량의 스레드로 생각할 수 있으나 실제로 사용하는데 있어서 스레드와 중요한 차이가 있다. 다음 코드를 실행해보자. fun main() = runBlocking { launch { delay(1_000L) println("World!") } println("..

들어가기 전에 코틀린 코루틴에 대해 잘 알고 있다고 생각하였으나 며칠 전에 인턴 분들의 질문에 대답을 잘 못하여 내가 정말 잘 알고 있는건가? 라는 의구심이 들었다. 그래서 공식 문서를 다시 보고 싶은 욕구가 생겼고 다시 보는 김에 구글 번역기의 도움을 받아서 번역을 하려고 한다. Coroutine Guide 코틀린은 언어에서 다양한 다른 라이브러리가 표준 라이브러리로부터 코루틴을 활용할 수 있도록 로우 레벨의 API를 제공한다. 비슷한 기능을 가진 다른 언어와 달리 async와 await이 코틀린의 키워드가 아니고 심지어 표준 라이브러리에 속해 있지도 않다. 또, 코틀린에서의 supending function의 개념은 안전하고 비동기 기능에 대해 futures와 promises보다 오류가 발생하기 쉬운..

R2DBC란? 현재 Java 진영에서 주로 사용하고 있는 데이터베이스 연결 드라이버는 JDBC다. JDBC는 완벽한 블록킹 API이므로 아무리 비동기식으로 서버를 구성하더라도 결국 JDBC에서 동기적으로 동작을 하게 된다. 그래서 나온게 R2DBC다. 공식 문서를 보면 다음과 같은 구절이 있다. Part of the answer as to why R2DBC was created is the need for a non-blocking application stack to handle concurrency with a small number of threads and scale with fewer hardware resources. This need cannot be satisfied by reusing s..

들어가기 전에 이번 글의 목적은 프로토콜 버퍼와 JSON 그리고 gRPC와 HTTP를 비교하는 것이다. 프로토콜 버퍼가 메시지를 어떻게 경량화하는지는 프로토콜 버퍼 원리을 읽기 바란다. gRPC와 HTTP가 어떻게 다른지 알고 싶다면 gRPC vs HTTP를 확인하기 바란다. 테스트로 사용할 메시지 정의 사용자 목록을 조회하는 API로 비교를 해보자. 새로운 rpc와 message를 정의한다. syntax = "proto3"; package me.dgahn.account.v1; import "me/dgahn/account/v1/SignUpV1.proto"; import "me/dgahn/account/v1/GetProfileStreamV1.proto"; import "me/dgahn/account/v1/..