Skip to content

Instantly share code, notes, and snippets.

View hikaMaeng's full-sized avatar

hika, maeng hikaMaeng

View GitHub Profile

Chapter 4

Spring에서 코루틴으로 http2 전이중 통신 구현


4-1 배경

http2(이하 h2)는 기존과 달리 헤더 압축과 프레임 단위 전송을 도입해 성능을 크게 개선했다. 모든 데이터는 하나의 TCP 연결 위에서 다중 스트림으로 교차 처리되며, 서버는 요청을 기다리지 않고 준비된 응답을 먼저 보낼 수 있다. 이로써 클라이언트와 서버는 서로 독립적으로 데이터를 주고받는 전이중 통신을 실현한다. 스프링프레임웍은 MVC로는 이러한 전이중(duplex)의 구조를 활용할 수 없고 웹플럭스기반의 아키텍쳐에서만 사용할 수 있다. h2의 대표적인 기능 중엔 널리 알려진 SSE가 있다. 이는 http1.1의 롱폴링(long polling)과는 다르다. 확보된 TCP세션안에서 필요할 때 프레임을 전송하는 기술이다. 하지만 SSE조차 그저 응답시의 프레임을 사용할 뿐이다. 진정한 전이중은 요청과 응답을 별도로 처리할 수 있어야한다.

fun main() {
// val a = "url"
// val b = optional({ a.length > 2 } ){
// println("a > 2")
//
// }
// b()
// val iter = iterator(0, {
// if(it < 10) it + 2 else null
// }){
@file:Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE")
package kore.chromaDB
import kore.coroutine.awaitAll
import kore.net.RestAPI
import kore.net.getWebClient
import kore.savable.JSON
import kore.util.arrayListFillOf
import kore.util.uuid
package week3
fun checkMK(v:String):Pair<Int, Int>{
val split = v.split(" ")
if(split.size != 2 || split[0].isEmpty() || split[1].isEmpty()) throw Exception("invalid mk-$v-")
val m = split[0].toIntOrNull() ?: throw IllegalArgumentException("invalid int m")
if(m !in 1.. 1000) throw Throwable("out of range 1..1000 m: $m")
val k = split[1].toIntOrNull() ?: throw IllegalArgumentException("invalid int k")
return m to k
}
package week3
import kotlin.math.abs
/*
In the country of Voronoi, there are villages, located at distinct points on a straight road. Each of these villages will be represented by an integer position along this road.
Each village defines its neighbourhood as all points along the road which are closer to it than to any other village. A point which is equally close to two distinct villages
and
is in the neighbourhood of
and also in the neighbourhood of
.

Chapter 3

코루틴과 Flow


3-1 배경

코틀린의 대표적인 동시성 철학이 코루틴이다. 코루틴은 워커쓰레드패턴(Worker Thread Pattern)에 기반을 둔 구조로 동기화를 이루는 작업큐에 원하는 작업을 등록하면 여러 워커역할을 수행하는 쓰레드에서 이 큐의 작업을 가져서 처리하는 방식을 말한다. 흔히 이벤트루프(event loop)로도 알려져있으며 동기화 문제를 효과적으로 해결하면서도 비동기적인 상항을 마치 동기적인 파이프라인처럼 처리할 수 있어 동시성의 복잡성을 크게 낮춘다. 코틀린은 언어 차원과 라이브러리 차원으로 코루틴을 지원하는데 언어 차원의 지원은 suspend함수의 파싱과 컨티뉴에이션(Continuation) 객체의 자동 생성이며 kotlinx.coroutine 라이브러리로는 스코프와 Flow 등을 지원한다. 이전에는 많은 동시성 구현을 스코프를 통해 처리했다. 하지만 현 시점에서는 대부분의 동시성 처리를 Flow로 할 수 있게 되면서 둘을 혼용하거나 아예 Flow만 쓰는 패턴으로 변해가고 있다. 이 장에서는 코루틴 스코프를 완전히 배제하고 기본 코루틴 기능과 Flow만으로 전개한다.

package kore.time
enum class CountryCode(val code:String, val fullName:String) {
AD("AD", "Andorra"),
AE("AE", "United Arab Emirates"),
AF("AF", "Afghanistan"),
AL("AL", "Albania"),
AM("AM", "Armenia"),
AQ("AQ", "Antarctica"),
AR("AR", "Argentina"),
package kore.time
enum class CountryCode(val code:String, val fullName:String) {
AD("AD", "Andorra"),
AE("AE", "United Arab Emirates"),
AF("AF", "Afghanistan"),
AL("AL", "Albania"),
AM("AM", "Armenia"),
AQ("AQ", "Antarctica"),
AR("AR", "Argentina"),
package kore.time
class DstRule(
val fromYear: Int,
val toYear: Int,
val startMonth: Int,
val startDayRule: String,
val startTimeSeconds: Int,
val endMonth: Int,
val endDayRule: String,
package kore.time
enum class CountryCode(val code:String, val fullName:String) {
AD("AD", "Andorra"),
AE("AE", "United Arab Emirates"),
AF("AF", "Afghanistan"),
AL("AL", "Albania"),
AM("AM", "Armenia"),
AQ("AQ", "Antarctica"),
AR("AR", "Argentina"),