์ฝํ๋ฆฐ์ ํ๋กํผํฐ ์์ ์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ํ๋กํผํฐ ์์์ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ธ ํ๋กํผํฐ์ ํ์๋ฅผ ์ถ์ถํด์ ์ฌ์ฌ์ฉํ ์ ์๋ค. Observable ๋ฐ์ดํฐ์ ๋ณ๊ฒฝ์ด ์์ ๋ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ callback์ผ๋ก ์ํ๋ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. Delegates.observable ํจ์๋ฅผ ๋ณด๋ฉด 2๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ผ๋ฉฐ ์ด๊ธฐ๊ฐ๊ณผ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ์์ ๋ ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์ (onChange) ๋ก ์ด์ฐ๋ฌ์ ธ์๋ค. public inline fun observable(initialValue: T, crossinline onChange: (property: KProperty, oldValue: T, newValue: T) -> Unit): ReadWriteProperty = object : ObservableProperty(i..
collections API ์ค ํ๋๋ก ์ปฌ๋ ์ ์ Map ํํ๋ก ๋ณํ์์ผ์ฃผ๋ API ์ด๋ค. associateBy ํจ์์ groupBy ํจ์๋ ์ง์ ๋ key์ ์ํด ์ธ๋ฑ์ฑ๋ ์ปฌ๋ ์ ์ ์์๋ก๋ถํฐ Map์ ๋ง๋ค์ด์ค๋ค. associateBy public inline fun Iterable.associateBy(keySelector: (T) -> K): Map { val capacity = mapCapacity(collectionSizeOrDefault(10)).coerceAtLeast(16) return associateByTo(LinkedHashMap(capacity), keySelector) } ๋งค๊ฐ๋ณ์์๋ T๋ฅผ ์ ๋ฌํ๊ณ key๋ฅผ ๋ฆฌํดํ๋ ๋๋คํจ์ keySelector๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค. ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ key..
Coroutine Context ์ฝ๋ฃจํด์ ํญ์ Coroutine Context๋ก ๊ตฌ์ฑ๋ ์ฝํ ์คํธ ์์์ ์คํ๋๋๋ฐ, ์ด ์ฝํ ์คํธ๋ Dispatchers์ Job์ผ๋ก ๊ตฌ์ฑ๋๋ค. Dispatchers๋ ์ฝ๋ฃจํด์ด ์คํ๋ ์ค๋ ๋๋ฅผ ์ง์ ํ๋ ์ญํ Default : CPU์์ ๋ง์ ์ฐ์ฐ์ด ํ์ํ ์ฒ๋ฆฌ ๋์์์ ๊ฐ๋ฅํ ์ต๋ ๊ฐ์๋ CPU ์ฝ์ด ์์ ๊ฐ๋ค. IO : ํ์ผ ์ ์ถ๋ ฅ, ๋คํธ์ํฌ ์ฝ ๋ฑ ์ค๋ ๋๊ธฐํ๋ ์ํฉ์ผ ๋ Blocking IO์ฉ ๊ณต์ ์ค๋ ๋ํ์์ ๋์ Default์ ์ค๋ ๋๋ฅผ ๊ณต์ ํ๋ฏ๋ก withContext์์ Dispatcher ๋ณ๊ฒฝ ์, ์ปจํ ์คํธ ์ค์์นญ ํ์ง ์๊ณ ๋์ผํ ์ค๋ ๋์์ ์คํ๋จ Main: ์ฝ๋ฃจํด์์ ์ฒ๋ฆฌ๋ ๊ฐ์ UI์ ๋ฐ์ํ ๋ ๋ฉ์ธ์ค๋ ๋์์ ๋์ UnConfined ๋ฉ์ธ์ค๋ ๋์์ ๋์ C..
Reified ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋ค๋ฆญ ํจ์์์ Runtime์ ํ์ ์ ๋ณด๋ฅผ ์ ์ ์๋ค. (๋ณดํต์ ์ปดํ์ผ ์์๋ง ํ์ ์ ์ ์ ์๊ณ ๋ฐํ์์์ ํ์ ์ ๋ณด๋ ์กด์ฌํ์ง ์๊ฒ ๋๋ค.) ์ฆ, ๋ฐํ์์์๋ ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ฅผ ์ฐพ๊ธฐ๊ฐ ์ฝ๋ค. reified ๋ inline fun๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ ํจ์์ ๋งค๊ฐ๋ณ์๋ก T ํ์ ํด๋์ค๋ฅผ ๋ฐ๋ ๊ฒ์ ์๋ตํ ์ ์๋ค. ์ถ๊ฐ์ ์ผ๋ก T ํด๋์ค๋ฅผ ๋๊ฒจ์ค ํ์๊ฐ ์๋ค๋ ์ ์ด ์ข์ ๊ฒ ๊ฐ๋ค. ๋ค์์ R2dbcEntityTemplate ์ฟผ๋ฆฌ ์คํ์ ์ํ ํจ์์ด๋ค. ๊ธฐ์กด ์ฝ๋) private fun executeQuery(build: Select, entityClass: KClass): Flow = r2dbcEntityTemplate.query( QueryBuil..