Kotlin

Kotlin 1.4.0-RC ๋ฆด๋ฆฌ์ฆˆ

Read this post in other languages:

Kotlin์˜ ๋‹ค์Œ ๋ฒ„์ „๊นŒ์ง€ ์–ผ๋งˆ ์•ˆ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค! ๋‹ค์Œ ์ฃผ์š” ๋ฒ„์ „์œผ๋กœ ๊ณต๊ฐœ๋  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ฆด๋ฆฌ์Šค ํ›„๋ณด์ธ Kotlin 1.4.0-RC๊ฐ€ ๋ฆด๋ฆฌ์ฆˆ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ธ€์—์„œ Kotlin 1.4.0-RC์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ณ  Kotlin 1.4.0 ๊ณต์‹ ์ถœ์‹œ ์ „ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.

์ฃผ์š” ๋ฆด๋ฆฌ์Šค ๋ฒ„์ „(1.4-M1, 1.4-M2, 1.4-M3)์„ ์‚ฌ์šฉํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ๊ณต์œ ํ•˜์—ฌ ์ด๋ฒˆ Kotlin ๋ฒ„์ „์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ํŠน๋ณ„ํ•œ ๊ฐ์‚ฌ๋ฅผ ์ „ํ•ฉ๋‹ˆ๋‹ค!

์ด๋ฒˆ ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” Kotlin 1.4.0-RC ์‹ ๊ทœ ๊ธฐ๋Šฅ ๋ฐ ํ•ต์‹ฌ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ค‘์ ์ ์œผ๋กœ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

ํ–ฅ์ƒ๋œ *.gradle.kts IDE ์ง€์›

Kotlin 1.3.70์—์„œ ์ œ๊ณต๋œ Gradle Kotlin DSL ์Šคํฌ๋ฆฝํŠธ(*.gradle.kts ํŒŒ์ผ)์˜ IDE ์ง€์›์„ ๋Œ€ํญ ๊ฐœ์„ ํ•˜์˜€์œผ๋ฉฐ Kotlin 1.4.0-RC์—์„œ๋„ ๊ณ„์† ๊ฐœ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์— ํฌํ•จ๋œ ๊ธฐ๋Šฅ์„ ์•„๋ž˜์—์„œ ์‚ดํŽด๋ณด์„ธ์š”.

์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋กœ๋“œ

์ด์ „์—๋Š” build.gradle.kts์˜ buildscript ๋˜๋Š” plugins ๋ธ”๋ก์— ์ƒˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ƒˆ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์ž๋™์œผ๋กœ ๋กœ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹ค์Œ์—, ๊ตฌ์„ฑ์ด ์ ์šฉ๋œ ํ›„์—์•ผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ฝ”๋“œ ์ง€์›์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ์ž…๋ ฅ ์‹œ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ์ž๋™ ๋™์ž‘์ด ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Gradle 6.0 ์ด์ƒ ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Load Gradle Changes(Gradle ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋กœ๋“œ)๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ Gradle ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ตฌ์„ฑ์— ๋ช…์‹œ์ ์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Gradle ์ด์ „ ๋ฒ„์ „์˜ ๊ฒฝ์šฐ ์—๋””ํ„ฐ์—์„œ Load Configuration(๊ตฌ์„ฑ ๋กœ๋“œ)๋ฅผ ํด๋ฆญํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Gradle 6.0+์ด ํฌํ•จ๋œ IntelliJ IDEA 2020.1์— Load Script Configurations(์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ ๋กœ๋“œ)๋ผ๋Š” ์•ก์…˜์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ์•ก์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ ๋„ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋‹จ์ถ•๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ณด๊ณ  ๊ธฐ๋Šฅ ๊ฐœ์„ 

์ด์ „์—๋Š” Gradle Daemon(๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ ๋ชจ๋“  Gradle ๊ด€๋ จ ์ž‘์—… ๋ฐ ํ™œ๋™์„ ๋‹ด๋‹นํ•˜๋Š” ํ”„๋กœ์„ธ์Šค) ์˜ค๋ฅ˜๋Š” ๋ณ„๋„์˜ ๋กœ๊ทธ ํŒŒ์ผ์—์„œ๋งŒ ํ™•์ธ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Gradle 6.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Gradle Daemon์—์„œ ๋ชจ๋“  ์˜ค๋ฅ˜ ์ •๋ณด๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๊ณ  Build(๋นŒ๋“œ) ๋„๊ตฌ ์ฐฝ์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜๊ณ  ๋ฒˆ๊ฑฐ๋กœ์›€๋„ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์˜ ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ

Kotlin Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๊ฐœ์„  ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜์–ด Gradle ๋นŒ๋“œ ํŒŒ์ผ์—์„œ ์ฝ”๋“œ๋ฅผ ๋” ์ ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ๋””ํดํŠธ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋””ํดํŠธ ์ข…์† ์š”์†Œ๋กœ ์ง€์›

์ˆ˜๋งŽ์€ ํ”„๋กœ์ ํŠธ์— Kotlin ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 1.4.0-RC ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ๊ฐ ์†Œ์Šค ์ง‘ํ•ฉ์—์„œ stdlib ์ข…์† ์š”์†Œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋””ํดํŠธ๋กœ ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์€ Kotlin Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๋™์ผํ•œ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฒ„์ „๋„ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ์—์„œ 1.4 ๋ฒ„์ „ ์ด์ „์˜ Android, iOS ๋ฐ JavaScript๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์† ์š”์†Œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Kotlin 1.4-M2์—์„œ ๊ณต๊ฐœ๋œ ๊ณ„์ธต ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์ง€์›์ด ์žˆ์œผ๋ฏ€๋กœ ๊ธฐํƒ€ ์ข…์† ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Gradle ๋นŒ๋“œ ํŒŒ์ผ์ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์›Œ ์ง‘๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ ์†Œ์Šค ์ง‘ํ•ฉ ๋ฐ ๋ฐฑ์—”๋“œ ๊ณต์œ  ์†Œ์Šค ์ง‘ํ•ฉ์— ํ•ด๋‹น ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ , ๋‚จ์€ ๋ถ€๋ถ„์— ์ผ๋ฐ˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. Kotlin Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์€ kotlinOptions.jvmTarget ์„ค์ •์— ๋”ฐ๋ผ ์ ํ•ฉํ•œ JVM ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์† ์š”์†Œ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•œ ๊ฒฝ์šฐ(์˜ˆ: ๋‹ค๋ฅธ ๋ฒ„์ „์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ), Kotlin Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์žฌ์ •์˜ํ•˜๊ฑฐ๋‚˜ ๋‘ ๋ฒˆ์งธ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ Gradle ์†์„ฑ์— ์„ ํƒ ํ•ด์ œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kotlin/Native

๊ฐ„์†Œํ™”๋œ CocoaPods ์ข…์† ์š”์†Œ ๊ด€๋ฆฌ

์ด์ „์—๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ข…์† ์š”์†Œ ๊ด€๋ฆฌ์ž CocoaPods๊ณผ ํ†ตํ•ฉํ•˜๊ณ  ๋‚˜์„œ, ๋ฉ€ํ‹ฐํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ํ”„๋กœ์ ํŠธ์˜ iOS, macOS, watchOS ๋˜๋Š” tvOS ๋ถ€๋ถ„์€ Xcode์—์„œ๋งŒ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ IntelliJ IDEA์—์„œ ๋นŒ๋“œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฟ ์•„๋‹ˆ๋ผ CocoaPods(Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์— ์ €์žฅ๋œ Objective-C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์† ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค IntelliJ IDEA์—์„œ Xcode๋กœ ์ „ํ™˜ํ•˜๊ณ  pod install ์ž‘์—…์„ ์‹คํ–‰ํ•œ ํ›„ Xcode ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ IntelliJ IDEA์—์„œ ๋ฐ”๋กœ Pod ์ข…์† ์š”์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋™์‹œ์— ์ฝ”๋“œ ๊ฐ•์กฐ ํ‘œ์‹œ ๋ฐ ์ฝ”๋“œ ์™„์„ฑ ๋“ฑ์˜ ์ฝ”๋”ฉ ์ง€์› ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Xcode๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š๊ณ ๋„ Gradle๋กœ ์ „์ฒด Kotlin ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Swift/Objective-C ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ๋˜๋Š” ๊ธฐ๊ธฐ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” Xcode๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋กœ์ปฌ์— ์ €์žฅ๋œ Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ข…์† ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Kotlin ํ”„๋กœ์ ํŠธ ๋ฐ CocoaPods ์ €์žฅ์†Œ์˜ Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
  • Kotlin ํ”„๋กœ์ ํŠธ ๋ฐ ๋กœ์ปฌ์—์„œ ์ €์žฅ๋œ Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.
  • Kotlin Pod(CocoaPods ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” Kotlin ํ”„๋กœ์ ํŠธ) ๋ฐ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋Œ€์ƒ์ด ํฌํ•จ๋œ Xcode ํ”„๋กœ์ ํŠธ.

์ดˆ๊ธฐ ๊ตฌ์„ฑ์„ ์™„๋ฃŒํ•˜๊ณ  CocoaPods์— ์ƒˆ ์ข…์† ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ํ”„๋กœ์ ํŠธ๋ฅผ IntelliJ IDEA์— ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ์ข…์† ์š”์†Œ๊ฐ€ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜๋ฉฐ ์ถ”๊ฐ€์ ์ธ ์ ˆ์ฐจ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์—์„œ CocoaPods ์ €์žฅ์†Œ์˜ Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ข…์† ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kotlin 1.4 ๋ฌธ์„œ๋Š” ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

CocoaPods ํ†ตํ•ฉ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

CocoaPods ์ข…์† ์š”์†Œ ๊ด€๋ฆฌ์ž ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜
  1. cocoapods ์ข…์† ์š”์†Œ ๊ด€๋ฆฌ์ž๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค(sudo gem์œผ๋กœ cocoapods ์„ค์น˜).
  2. cocoapods-generate ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜(sudo gem์œผ๋กœ cocoapods-generate ์„ค์น˜).
  3. ํ”„๋กœ์ ํŠธ์˜ build.gradle(.kts) ํŒŒ์ผ์— kotlin("native.cocoapods")์„ ์‚ฌ์šฉํ•ด์„œ CocoaPods ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
CocoaPods ์ €์žฅ์†Œ์˜ Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ข…์† ์š”์†Œ ์ถ”๊ฐ€
  1. pod()์„ ์‚ฌ์šฉํ•˜์—ฌ CocoaPods ์ €์žฅ์†Œ์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ข…์† ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ข…์† ์š”์†Œ๋ฅผ subspecs๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    Kotlin ์ฝ”๋“œ์—์„œ ์ข…์† ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์œ ํ•œ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›๊ฒฉ CocoaPods ์ €์žฅ์†Œ์— ๊ทธ๋ฆฌ๊ณ  ๋กœ์ปฌ์— ์ €์žฅ๋œ Pod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ข…์† ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

Apple ํƒ€๊นƒ์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ๋ฆด๋ฆฌ์Šค .dSYM ์ƒ์„ฑ

๋งŽ์€ ๊ฒฝ์šฐ iOS ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ถฉ๋Œ ๋””๋ฒ„๊ทธ ๊ณผ์ •์—๋Š” ์ถฉ๋Œ ๋ณด๊ณ ์„œ ๋ถ„์„์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ถฉ๋Œ ๋ณด๊ณ ์„œ๊ฐ€ ์ ์ ˆํ•œ ๊ฐ€๋…์„ฑ์„ ๊ฐ–์ถ”๋ ค๋ฉด ์‹ฌ๋ณผํ™” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Kotlin์œผ๋กœ ์ž‘์„ฑ๋œ ์ฃผ์†Œ๋ฅผ ์‹ฌ๋ณผํ™”ํ•˜๋ ค๋ฉด Kotlin ์ฝ”๋“œ์šฉ .dSYM ๋ฒˆ๋“ค์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. 1.4-M3 ๋ฒ„์ „๋ถ€ํ„ฐ Kotlin/Native ์ปดํŒŒ์ผ๋Ÿฌ๋Š” Darwin ํ”Œ๋žซํผ์˜ ๋ฆด๋ฆฌ์Šค ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํ•„์š”ํ•œ .dSYM์„ ๋””ํดํŠธ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ -Xadd-light-debug=disable ์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋ž˜๊ทธ๋กœ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”Œ๋žซํผ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์˜ต์…˜์ด ๋””ํดํŠธ๋กœ ๋น„ํ™œ์„ฑํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Gradle์—์„œ ์ด ์˜ต์…˜์„ ํ† ๊ธ€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์„ฑ๋Šฅ ๊ฐœ์„  ์‚ฌํ•ญ

์ €ํฌ ํŒ€์€ Kotlin/Native ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์˜ ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๊พธ์ค€ํžˆ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • 1.3.70 ๋ฒ„์ „์—์„œ๋Š” Kotlin/Native ์ปดํŒŒ์ผ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ์‹ ๊ทœ ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ํ”„๋กœ์ ํŠธ ์ข…์† ์š”์†Œ ์บ์‹ฑ ๋ฐ Gradle Daemon์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์‹คํ–‰ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๋Ÿฌ ์ด์Šˆ๋ฅผ ์ˆ˜์ •ํ•˜์˜€์œผ๋ฉฐ ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ์ „๋ฐ˜์ ์ธ ์•ˆ์ •์„ฑ๋„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ ์ง€์†์ ์œผ๋กœ ๋…ธ๋ ฅํ•ด ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จํ•œ ๊ฐœ์„  ์‚ฌํ•ญ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜) ์ตœ์ ํ™”๋กœ ์ „๋ฐ˜์ ์ธ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์žฅ๊ธฐ๊ฐ„ ์กด์žฌํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ํ™•์‹คํžˆ ์ด๋Ÿฌํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๋Š๋ผ์‹ค ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ์ด์ œ ์ค‘๋ณต ๋ฐ•์‹ฑ์„ ์ด์Šค์ผ€์ดํ”„ํ•˜์—ฌ HashMap ๋ฐ HashSet ์ปฌ๋ ‰์…˜์ด ๋” ๋น ๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

Kotlin/JS

Kotlin 1.4.0-RC์—์„œ๋Š” @JsExport ์–ด๋…ธํ…Œ์ด์…˜์ด ๋””ํดํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ npm ์ข…์† ์š”์†Œ ๊ด€๋ฆฌ ๋ฐ Gradle ํ”„๋กœ์ ํŠธ์˜ Dukat ํ†ตํ•ฉ์„ ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์„ธ๋ถ„ํ™”ํ•˜์—ฌ ์ œ๊ณตํ•˜๊ณ  CSS ์ง€์›์„ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋”๋ถˆ์–ด Node.js API์™€ ํ†ตํ•ฉ์„ ์ฒ˜์Œ์œผ๋กœ ๋„์ž…ํ•˜๋Š” ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋””ํดํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ์šฉ @JsExport ์–ด๋…ธํ…Œ์ด์…˜

Kotlin 1.4 ์ด์ „ ๋ฆด๋ฆฌ์Šค์—์„œ @JsExport ์–ด๋…ธํ…Œ์ด์…˜์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ƒˆ IR ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ JavaScript ๋˜๋Š” TypeScript์—์„œ ์ง€์›๋˜๋Š” ์ตœ์ƒ์œ„ ์„ ์–ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Kotlin 1.4-M3 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์„ ์ตœ์‹  ๋””ํดํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋””ํดํŠธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ @JsExport๋กœ ์ตœ์ƒ์œ„ ์„ ์–ธ์— ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ ์–ธ์˜ ์ด๋ฆ„ ๋งน๊ธ€๋ง์ด ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ ์–‘์ชฝ์— ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ํฌํ•จ๋  ๊ฒฝ์šฐ ์ตœ์ƒ์œ„ ์„ ์–ธ์„ ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐฑ์—”๋“œ ๊ฐ„ ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, TypeScript ์ •์˜ ์ƒ์„ฑ์€ ์ƒˆ IR ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm ์ข…์† ์š”์†Œ ๊ด€๋ฆฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ

์ข…์† ์š”์†Œ ์„ ์–ธ์— ํ•„์š”ํ•œ ๋ช…์‹œ์  ๋ฒ„์ „ ์š”๊ตฌ ์‚ฌํ•ญ

๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ  npm ํŒจํ‚ค์ง€ ์ข…์† ์š”์†Œ๋ฅผ ์„ ์–ธํ•˜๋ฉด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์•ž์œผ๋กœ๋Š” ์ข…์† ์š”์†Œ์— ๋Œ€ํ•œ npm์˜ semver ๊ตฌ๋ฌธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฒ„์ „ ๋˜๋Š” ๋ฒ„์ „ ๋ฒ”์œ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ Gradle DSL์—์„œ ์—ฌ๋Ÿฌ ์ข…์† ์š”์†Œ ๋ฒ”์œ„๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ์—์„œ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๋ฒ„์ „์„ ์ •ํ™•ํ•˜๊ฒŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

npm ์ข…์† ์š”์†Œ ์ถ”๊ฐ€ ์œ ํ˜•

dependencies ๋ธ”๋ก ๋‚ด๋ถ€์— npm(...)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ npm ์ข…์† ์š”์†Œ ์™ธ์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„ธ ๊ฐ€์ง€ ์ด์ƒ์˜ ์ข…์† ์š”์†Œ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ ์œ ํ˜•์˜ ์ข…์† ์š”์†Œ๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด npm์—์„œ ์—ฐ๊ฒฐ๋œ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.

npm ์ดํ–‰ ์ข…์†์„ฑ์˜ ์ž๋™ ํฌํ•จ ๋ฐ ํ™•์ธ

์ด์ „์—๋Š” ์ž‘์„ฑ์ž๊ฐ€ ์•„ํ‹ฐํŒฉํŠธ์— package.json ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜์กดํ•ด์•ผ ํ•  ๊ฒฝ์šฐ npm ์ข…์† ์š”์†Œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kotlinx.serialization์˜ ๊ฒฝ์šฐ ํŒจํ‚ค์ง€๊ฐ€ Kotlin/JS์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก Gradle ๋นŒ๋“œ ํŒŒ์ผ์— ์ข…์† ์š”์†Œ๋กœ text-encoding ๋ฐ abort-controller๋ฅผ ํฌํ•จํ•ด์•ผ ํ–ˆ์ฃ .

์ด์ œ Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— package.json ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์„ jar ๋˜๋Š” klib ์•„ํ‹ฐํŒฉํŠธ์— ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํฌํ•จํ•  ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ํŒŒ์ผ ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ํ•„์š”ํ•œ ์ข…์† ์š”์†Œ๊ฐ€ ์ž๋™์œผ๋กœ ํฌํ•จ๋˜๋ฏ€๋กœ Gradle ๋นŒ๋“œ ํŒŒ์ผ์— ์ข…์†์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

CSS ์ง€์› ๋ณ€๊ฒฝ ์‚ฌํ•ญ

Kotlin 1.4-M2 ๋ฒ„์ „์€ cssSettings๋ฅผ ํ†ตํ•ด Gradle์—์„œ webpack์˜ CSS ๋ฐ ์Šคํƒ€์ผ ๋กœ๋”๋ฅผ ๋ฐ”๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ž‘์—… ๋ฐ ํšจ๊ณผ๋ฅผ ๋”์šฑ ์—„๋ฐ€ํžˆ ๋ฐ˜์˜ํ•˜๊ณ ์ž ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์„ cssSupport์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋Š” 1.4-M2์˜ ์‹คํ—˜์  ์„ค์ •๊ณผ ๋‹ฌ๋ฆฌ Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ CSS ์ง€์›์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ์Šคํƒ€์ผ ์‹œํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฐฉ์‹์— ์ž์ฒด ์„ค์ •์„ ํฌํ•จํ–ˆ๋˜ ๋ถ„๋“ค์˜ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: Sass ๋˜๋Š” Less ๋กœ๋” ์‚ฌ์šฉ). ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋””ํดํŠธ ๊ตฌ์„ฑ์—์„œ ์ถฉ๋Œ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” CSS ์„ค์ •์„ ์ด๋ฏธ ์‚ฝ์ž…ํ•œ ๊ฒƒ์ด ์ฆ‰์‹œ ๊ตฌ๋ถ„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ CSS ์ง€์›์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด webpackTask, runTask, testTask ์ „์šฉ Gradle ๋นŒ๋“œ ํŒŒ์ผ์— cssSupport.enabled ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”. IntelliJ IDEA์— ํฌํ•จ๋œ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ์ƒ์„ฑํ•œ build.gradle(.kts) ํŒŒ์ผ์— ๋‹ค์Œ ์„ค์ •์ด ์ž๋™์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์ €ํฌ ํŒ€์€ ๊ฐ๊ฐ์˜ ์ž‘์—…๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์ธ ์„ค์ • ์กฐ์ •์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์ด ๋ณ„๋กœ ํŽธ๋ฆฌํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ DSL์— cssSupport ๊ตฌ์„ฑ ์ค‘์•™ ํฌ์ธํŠธ๋ฅผ ์ถ”๊ฐ€ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค(์ง„ํ–‰ ์ƒํ™ฉ์„ ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

Dukat ํ†ตํ•ฉ ๊ฐœ์„ 

Kotlin/JS Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Dukat ํ†ตํ•ฉ์— ๋ณด๋‹ค ์„ธ๋ถ„ํ™”๋œ ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. Dukat์€ TypeScript ์„ ์–ธ ํŒŒ์ผ(.d.ts)์„ Kotlin ์™ธ๋ถ€ ์„ ์–ธ์œผ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด์ œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ Dukat์˜ ์„ ์–ธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ ์‹œ์ ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋นŒ๋“œ ์‹œ์ ์— ์™ธ๋ถ€ ์„ ์–ธ ์ƒ์„ฑ

์ด์ œ npm ์ข…์† ์š”์†Œ ํ•จ์ˆ˜์—์„œ ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๋ฐ ๋ฒ„์ „ ๋’ค์— ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ generateExternals๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Dukat์ด ํŠน์ • ์ข…์† ์š”์†Œ์— ๋Œ€ํ•œ ์„ ์–ธ์„ ์ƒ์„ฑํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ gradle.properties ํŒŒ์ผ์—์„œ kotlin.js.generate.externals flag(์‹คํ—˜์ ์œผ๋กœ ์ œ๊ณต๋˜์—ˆ์„ ์‹œ ๊ธฐ์กด ์ด๋ฆ„์€ kotlin.js.experimental.generateKotlinExternals)๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“  npm ์ข…์† ์š”์†Œ์— ํ•„์š”ํ•œ ์ƒ์„ฑ๊ธฐ ๋™์ž‘์„ ๋™์‹œ์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ๊ฐœ๋ณ„์ ์ธ ๋ช…์‹œ์  ์„ค์ •์ด ์ผ๋ฐ˜ ํ”Œ๋ž˜๊ทธ๋ณด๋‹ค ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค.

Gradle ์ž‘์—…์„ ํ†ตํ•ด ์™ธ๋ถ€ ์„ ์–ธ์„ ์ˆ˜๋™ ์ƒ์„ฑ

Dukat์—์„œ ์ƒ์„ฑ๋œ ์„ ์–ธ์„ ์™„์ „ํžˆ ์ œ์–ดํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, ์ˆ˜๋™ ์กฐ์ •์„ ์ ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋˜๋Š” ์ž๋™ ์ƒ์„ฑ๋œ ์™ธ๋ถ€ ์„ ์–ธ ์‹คํ–‰ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์—๋Š” generateExternals Gradle ์ž‘์—…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  npm ์ข…์† ์š”์†Œ์— ๋Œ€ํ•œ ์„ ์–ธ ์ƒ์„ฑ์„ ์ˆ˜๋™์œผ๋กœ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ์ด๋ฆ„์ด externals๋กœ ์ง€์ •๋œ ๋””๋ ‰ํ† ๋ฆฌ์— ์„ ์–ธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๊ฒ€ํ† ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์„ ์†Œ์Šค ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋‹จ, ์†Œ์Šค ํด๋”์— ์™ธ๋ถ€ ์„ ์–ธ์„ ์ˆ˜๋™์œผ๋กœ ์ œ๊ณตํ•˜๊ณ  ๋™์ผํ•œ ์ข…์† ์š”์†Œ์— ๋Œ€ํ•œ ์™ธ๋ถ€ ์„ ์–ธ์„ ๋นŒ๋“œ ์‹œ์ ์— ์ƒ์„ฑํ•˜๋„๋ก ํ™œ์„ฑํ™”ํ•˜๋ฉด ํ•ด๊ฒฐ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ์— ์œ ์˜ํ•˜์„ธ์š”)

kotlin.dom ๋ฐ kotlin.browser๋ฅผ ๋ณ„๋„์˜ ์•„ํ‹ฐํŒฉํŠธ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

Kotlin/JS์šฉ ๋ธŒ๋ผ์šฐ์ € ๋ฐ DOM ๋ฐ”์ธ๋”ฉ์˜ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์–ธ์–ด ์ž์ฒด์˜ ๋ฆด๋ฆฌ์Šค ์ฃผ๊ธฐ์™€ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด kotlin.dom ๋ฐ kotlin.browser ํŒจํ‚ค์ง€์— ์œ„์น˜ํ•œ ํ˜„์žฌ์˜ API๋ฅผ ์ค‘๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค. kotlinx.dom ๋ฐ kotlinx.browser ํŒจํ‚ค์ง€์—์„œ ์ด๋Ÿฌํ•œ API์— ๋Œ€ํ•œ ๋Œ€์ฒด ํ•ญ๋ชฉ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ํ–ฅํ›„ ๋ฆด๋ฆฌ์Šค์—์„œ ๋ณ„๋„์˜ ์•„ํ‹ฐํŒฉํŠธ๋กœ ์ถ”์ถœํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด API๋กœ์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ๋งค์šฐ ์ง๊ด€์ ์ด๋ฉฐ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉ๋œ import ๋ฌธ์„ ์กฐ์ •ํ•˜์—ฌ ์ƒˆ kotlinx ํŒจํ‚ค์ง€์— ์ง€์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. IntelliJ IDEA์—์„œ Alt-Enter๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Quick-fixes(๋น ๋ฅธ ์ˆ˜์ •) ๊ธฐ๋Šฅ์ด ์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ๋ฒ„์ „: kotlinx-nodejs

Node.js API์— ๋Œ€ํ•œ ๊ณต์‹ ๋ฐ”์ธ๋”ฉ์ธ kotlinx-nodejs ํ…Œ์ŠคํŠธ ๋ฒ„์ „์ด ์ถœ์‹œ๋˜์—ˆ๋‹ค๋Š” ๊ธฐ์œ ์†Œ์‹์„ ์ „ํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์˜ค๋žซ๋™์•ˆ Kotlin์„ ํ†ตํ•ด Node.js๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ, ๋Œ€์ƒ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ API์— ํƒ€์ž… ์•ˆ์ •์ ์ธ ์•ก์„ธ์Šค๋ฅผ ๋ณด์œ ํ•  ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. GitHub์—์„œ kotlinx-nodejs ๋ฐ”์ธ๋”ฉ์„ ์ฒดํฌ์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kotlinx-nodejs๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด jcenter ()๊ฐ€ ์ €์žฅ์†Œ์— ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ๋‹ค์Œ์œผ๋กœ ๊ฐ„๋‹จํžˆ ์•„ํ‹ฐํŒฉํŠธ์— ์ข…์† ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Gradle ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋กœ๋“œํ•œ ํ›„ Node.js๋กœ ์ œ๊ณต๋œ API๋ฅผ ์‹คํ—˜์ ์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, DNS ํ™•์ธ ํŒจํ‚ค์ง€๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ง ํ…Œ์ŠคํŠธ ๋ฒ„์ „์— ๋ถˆ๊ณผํ•˜๋ฏ€๋กœ kotlinx-nodejs๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๊ณ , ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๊ฒฝ์šฐ ์ €์žฅ์†Œ์˜ ์ด์Šˆ ํŠธ๋ž˜์ปค์— ๋ณด๊ณ ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

kotlin2js ๋ฐ kotlin-dce-js Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์ค‘๋‹จ

Kotlin 1.4๋ถ€ํ„ฐ Kotlin/JavaScript๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ธฐ์กด์˜ Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ(kotlin2js ๋ฐ kotlin-dce-js)์€ ๊ณต์‹์ ์œผ๋กœ ์‚ฌ์šฉ์ด ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฉฐ kotlin.js Gradle ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋Œ€์‹  ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
(์ด๋ฏธ ์‚ฌ์šฉ์ด ์ค‘๋‹จ๋œ) kotlin-frontend-plugin๊ณผ ๋”๋ถˆ์–ด ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ ์ง€์›ํ•˜๋˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ์ƒˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์••์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Kotlin/Multiplatform ํ”„๋กœ์ ํŠธ์™€ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ ํ†ตํ•ฉ DSL์„ ์‚ฌ์šฉํ•˜์—ฌ Kotlin/JS ๋Œ€์ƒ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kotlin 1.3.70 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์ตœ์ ํ™”๋œ ํ”„๋กœ๊ทธ๋žจ ๋ฒˆ๋“ค์„ ์‹คํ–‰ ๋ฐ ์ƒ์„ฑํ•˜๋Š”browserProductionRun ๋ฐ browserProductionWebpack ์ž‘์—…์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—๋„ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ(DCE) ๊ธฐ๋Šฅ์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. (ํ˜„์žฌ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ๋Š” Node.js ๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ ์ƒ์„ฑ ์ถœ๋ ฅ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋Œ€์ƒ์ธ ๊ฒฝ์šฐ์—๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฒ˜๋ฆฌ๋˜๊ธธ ๋ฐ”๋ผ๋Š” ๊ธฐํƒ€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์–ธ์ œ๋“  ์ €ํฌ ํŒ€์— ์•Œ๋ ค์ฃผ์„ธ์š”.)

์‚ถ์˜ ์งˆ์„ ๋†’์ด๋Š” ์ถ”๊ฐ€ ๊ฐœ์„  ์‚ฌํ•ญ ๋ฐ ์ฃผ์š” ์ˆ˜์ • ์‚ฌํ•ญ

  • @JsExport ์–ด๋…ธํ…Œ์ด์…˜์ด ๊ธˆ์ง€๋œ ์‚ฌ์šฉ ์œ„์น˜์— ๋” ๋งŽ์€ ์ปดํŒŒ์ผ๋Ÿฌ ์˜ค๋ฅ˜๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • IR ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ klib์— ๋Œ€ํ•œ ์ฆ๋ถ„ ์ปดํŒŒ์ผ์„ ํฌํ•จํ•˜๋Š” ์ƒˆ๋กœ์šด ์ „๋žต๋žต์ด ํ™œ์„ฑํ™” ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์กฐ์น˜๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๊ฐœ์„ ์„ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค.
  • webpack ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜์—ฌ Hot Reload ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ ENOENT: ํ•ด๋‹น ํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์—†์Œ ์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ง„ํ™”ํ•˜๋Š” Kotlin ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API

Kotlin ๋ฐœ์ „์˜ ๊ด€์ ์—์„œ Kotlin 1.4๋Š” ๊ธฐ๋Šฅ ๋ฆด๋ฆฌ์Šค์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ด์ „ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์ด๋ฏธ ์†Œ๊ฐœํ•ด๋“œ๋ฆฐ ๋‹ค์–‘ํ•œ ์‹ ๊ทœ ๊ธฐ๋Šฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ๋ฆด๋ฆฌ์Šค์˜ ๋‹ค๋ฅธ ์ค‘์š” ์ธก๋ฉด์€ ๊ธฐ์กด API์— ์ค‘์š”ํ•˜๊ณ  ํ˜์‹ ์ ์ธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. 1.4 ๋ฆด๋ฆฌ์Šค์—์„œ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

์‹คํ—˜์  API ์•ˆ์ •ํ™”

์‚ฌ์šฉ์ž๊ฐ€ Kotlin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ธฐ๋Œ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์ œ๊ณตํ•˜๊ณ ์ž ์‹คํ—˜์  ๋ฒ„์ „์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํƒœ๋Š” API ๊ฐœ๋ฐœ์ด ์•„์ง ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ํ–ฅํ›„ ํ˜ธํ™˜์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ํ–ฅํ›„์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹คํ—˜์  API๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๊ฒฝ๊ณ ํ•˜๊ณ  ์‚ฌ์ „ ๋™์˜๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค(@OptIn ์–ด๋…ธํ…Œ์ด์…˜).

๊ธฐ๋Šฅ ๋ฆด๋ฆฌ์Šค์—์„œ ์‹คํ—˜์  API๋Š” ์•ˆ์ • ์ƒํƒœ๋กœ ๊ฐœ์„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ˆ์ • ์ƒํƒœ์— ์ด๋ฅด๋ฉด ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ํ˜•์‹๊ณผ ๋™์ž‘์ด ๋ณ€๊ฒฝ๋  ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค(๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ ์ ˆํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ์ฃผ๊ธฐ์— ๋”ฐ๋ผ์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค). API๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ์•ˆ์ •ํ™”๋˜๋ฉด ๊ฒฝ๊ณ ๋‚˜ ์‚ฌ์ „ ๋™์˜ ์—†์ด API๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1.4 ๋ฒ„์ „์˜ ๊ฒฝ์šฐ Kotlin ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋‹ค์–‘ํ•œ ์‹คํ—˜์  ๊ธฐ๋Šฅ์ด ์•ˆ์ • ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ์ผ๋ถ€ ์˜ˆ์‹œ ๋ฐ ๋„์ž…๋œ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

1.4 ๋ฒ„์ „์—์„œ ๋” ๋งŽ์€ ํ•จ์ˆ˜ ๋ฐ ํด๋ž˜์Šค๊ฐ€ ์•ˆ์ • ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๋ฒ„์ „(1.4.0-RC)๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ์—์„œ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์‹œ @OptIn ์–ด๋…ธํ…Œ์ด์…˜์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์ค‘๋‹จ ์ฃผ๊ธฐ

๊ธฐ๋Šฅ ๋ฆด๋ฆฌ์Šค์—๋Š” ๊ธฐ์กด ์‚ฌ์šฉ ์ค‘๋‹จ ์ฃผ๊ธฐ์— ๋Œ€ํ•œ ๊ฐœ์„  ์‚ฌํ•ญ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ฆ๋ถ„ ๋ฆด๋ฆฌ์Šค์—์„œ WARNING ์ˆ˜์ค€์˜ ์ƒˆ๋กœ์šด ์‚ฌ์šฉ ์ค‘๋‹จ ์ฃผ๊ธฐ๋กœ ์‹œ์ž‘๋˜์—ˆ์ง€๋งŒ ๊ธฐ๋Šฅ ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ERROR ์ˆ˜์ค€์œผ๋กœ ํ•œ์ธต ๊ฐ•ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฏธ ERROR ์ˆ˜์ค€์œผ๋กœ ์ง€์ •๋œ API ์š”์†Œ๋Š” ์ฝ”๋“œ์˜ ์‹ ๊ทœ ์‚ฌ์šฉ ์œ„์น˜์—์„œ ์™„์ „ํžˆ ์ˆจ๊น€ ์ฒ˜๋ฆฌ๋˜๋ฉฐ ์ด๋ฏธ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์™€ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด 2์ง„ ํ˜•์‹์œผ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด์™€ ๊ฐ™์€ ๋‹จ๊ณ„๊ฐ€ ๊ฒฐํ•ฉ๋˜์–ด ์‚ฌ์šฉ ์ค‘๋‹จ๋œ API ์š”์†Œ๊ฐ€ ์ ์ง„์ ์œผ๋กœ ์ œ๊ฑฐ ๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ ์ค‘๋‹จ ์ˆ˜์ค€์ด WARNING์ธ API ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค. Kotlin 1.4.0-RC๋กœ ์—…๋ฐ์ดํŠธํ•  ๊ฒฝ์šฐ ์ผ๋ถ€ ๊ฒฝ๊ณ ๊ฐ€ ์˜ค๋ฅ˜ ์ˆ˜์ค€์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. IDE์—์„œ ํ‘œ์‹œ๋˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ ์‚ฌ์šฉ์„ ์ œ๊ณต๋œ ๋Œ€์•ˆ ์š”์†Œ๋กœ ๋Œ€์ฒดํ•˜๊ณ  ์ฝ”๋“œ๊ฐ€ ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Kotlin ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API์˜ ํ˜ธํ™˜์„ฑ ์†์ƒ ๋ณ€๊ฒฝ๊ณผ ๊ด€๋ จํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Kotlin 1.4 ํ˜ธํ™˜์„ฑ ๊ฐ€์ด๋“œ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ ์ž‘์—…

์ด์ „ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๋ช‡ ๊ฐœ์—์„œ ์ด ์„น์…˜์ด ์ƒ๋žต๋˜์—ˆ์ง€๋งŒ 1.4 ๋ฒ„์ „์˜ Kotlin ์Šคํฌ๋ฆฝํŠธ ์ž‘์—…์„ ๋”์šฑ ์•ˆ์ •์ ์ด๊ณ  ๋น ๋ฅด๊ณ  ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฐœ์„ ํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์€ ์ง€์†๋˜์—ˆ์Šต๋‹ˆ๋‹ค. RC ๋ฒ„์ „์—๋Š” ๋‹ค์–‘ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ ๋ฐ ๊ธฐ๋Šฅ ๊ฐœ์„  ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋˜์–ด ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„ํ‹ฐํŒฉํŠธ ์ด๋ฆ„ ๋ณ€๊ฒฝ

์•„ํ‹ฐํŒฉํŠธ ์ด๋ฆ„์˜ ํ˜ผ๋ž€์„ ๋ฐฉ์ง€ํ•˜๊ณ ์ž kotlin-scripting-jsr223-embeddable ๋ฐ kotlin-scripting-jvm-host-embeddable ์•„ํ‹ฐํŒฉํŠธ์˜ ์ด๋ฆ„์„ kotlin-scripting-jsr223 ๋ฐ kotlin-scripting-jvm-host๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค(-embeddable ์‚ญ์ œ). ์ด๋Ÿฌํ•œ ์•„ํ‹ฐํŒฉํŠธ๋Š” ์‚ฌ์šฉ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ˆจ๊น€ ์ฒ˜๋ฆฌํ•˜๋Š” kotlin-compiler-embeddable ์•„ํ‹ฐํŒฉํŠธ์— ์ข…์†๋ฉ๋‹ˆ๋‹ค. ์ด๋ฆ„ ๋ณ€๊ฒฝ์„ ํ†ตํ•ด kotlin-compiler-embeddable(์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์•ˆ์ „ํ•จ) ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ์ž‘์—… ์‹œ ๋””ํดํŠธ๋กœ ์‚ฌ์šฉ๋˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์ˆจ๊น€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์€ kotlin-compiler์— ์ข…์†๋œ ์•„ํ‹ฐํŒฉํŠธ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ kotlin-scripting-jsr223-unshaded์™€ ๊ฐ™์ด -unshaded ์ ‘๋ฏธ์–ด๊ฐ€ ํฌํ•จ๋œ ์•„ํ‹ฐํŒฉํŠธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ์ง์ ‘ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์ž‘์—… ์•„ํ‹ฐํŒฉํŠธ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ๋‹ค๋ฅธ ์•„ํ‹ฐํŒฉํŠธ ์ด๋ฆ„์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

CLion IDE ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์ค‘๋‹จ

CLion IDE ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์ค‘๋‹จ ์ฃผ๊ธฐ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์— ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Kotlin/Native ์‹คํ–‰ ํŒŒ์ผ ๋””๋ฒ„๊ทธ์šฉ์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ IntelliJ IDEA Ultimate์—์„œ ํ˜ธํ™˜์ด ๋˜๋ฏ€๋กœ 1.4 ๋ฆด๋ฆฌ์Šค ์ดํ›„ CLion IDE ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถœ์‹œ๋Š” ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด ์ค‘๋‹จ์œผ๋กœ ์ธํ•ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ €ํฌ ํŒ€์œผ๋กœ ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”. ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ˜ธํ™˜์„ฑ

๋ชจ๋“  ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด์ „์— ๊ณต๊ฐœํ–ˆ๋˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์ผ๋ถ€ ์ง€์› ์ค‘๋‹จ ์ฃผ๊ธฐ๊ฐ€ Kotlin 1.4์—์„œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ๋ก€๋Š” ์–ธ์–ด ์œ„์›ํšŒ์—์„œ ๋ชจ๋‘ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ฒ€ํ† ํ•œ ํ›„ Kotlin 1.4 ํ˜ธํ™˜์„ฑ ๊ฐ€์ด๋“œ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ YouTrack์—์„œ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค ํ›„๋ณด ์•ˆ๋‚ด

Kotlin 1.4์˜ ์ตœ์ข… ๋ฆด๋ฆฌ์Šค ํ›„๋ณด๊ฐ€ ๊ฒฐ์ •๋˜์—ˆ์œผ๋ฉฐ ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์ด ์ปดํŒŒ์ผํ•˜๊ณ  ๊ฒŒ์‹œํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค! ๊ธฐ์กด ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์™€๋Š” ๋‹ฌ๋ฆฌ Kotlin 1.4.0-RC์—์„œ ์ƒ์„ฑ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” Kotlin 1.4.0๊ณผ ํ˜ธํ™˜์„ฑ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

์ตœ์‹  ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ play.kotl.in์—์„œ Kotlin์„ ์˜จ๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IntelliJ IDEA ๋ฐ Android Studio์—์„œ Kotlin ํ”Œ๋Ÿฌ๊ทธ์ธ์„ 1.4.0-RC ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ ๋ฐฉ๋ฒ• ๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ์ƒ์„ฑ๋œ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์—…ํ•˜๋ ค๋ฉด Gradle ๋˜๋Š” Maven์—์„œ ํ…Œ์ŠคํŠธ ๋ฒ„์ „์— ๋Œ€ํ•œ ๋นŒ๋“œ๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ํ…Œ์ŠคํŠธ ๋ฒ„์ „๊ณผ๋Š” ๋‹ฌ๋ฆฌ Kotlin 1.4.0-RC๋Š” Maven Central์—์„œ๋„ ๋ฐ”๋กœ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋นŒ๋“œ ํŒŒ์ผ์— kotlin-eap ์ €์žฅ์†Œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์ค„ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” GitHub ๋ฆด๋ฆฌ์Šค ํŽ˜์ด์ง€์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋ฒˆ ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ ๊ฒŒ์‹œ๋œ ๋‹ค์Œ ๋ฒ„์ „์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆด๋ฆฌ์Šค์— ๊ด€ํ•œ ์„ธ๋ถ€ ์ •๋ณด ๋ฐ ํ˜ธํ™˜๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชฉ๋ก์€ ์—ฌ๊ธฐ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜๊ฒฌ์„ ๊ณต์œ ํ•ด ์ฃผ์„ธ์š”


๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•˜์‹  ๊ฒฝ์šฐ ์ด์Šˆ ํŠธ๋ž˜์ปค๋กœ ๋ณด๊ณ ํ•ด ์ฃผ์‹œ๋ฉด ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์ตœ์ข… ๋ฆด๋ฆฌ์Šค ์ „์— ๋ชจ๋“  ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ Kotlin ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์‹ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์–ธ์ œ๋“  ๋‹ค์Œ ์ดˆ๋Œ€ ๋งํฌ๋ฅผ ํ†ตํ•ด Kotlin Slack์˜ #eap ์ฑ„๋„์— ์ฐธ์—ฌํ•˜์—ฌ ์งˆ๋ฌธํ•˜๊ณ  ํ† ๋ก ์— ์ฐธ์—ฌํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ๋ฒ„์ „ ๋นŒ๋“œ์— ๊ด€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์•„๋ณด์„ธ์š”.

Letโ€™s Kotlin!

์™ธ๋ถ€ ๊ธฐ์—ฌ์ž


์ด ๋ฆด๋ฆฌ์Šค์— ํฌํ•จ๋œ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹  ๋ชจ๋“  ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž๊ป˜๋„ ๊ฐ์‚ฌ์˜ ๋งˆ์Œ์„ ์ „ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒŒ์‹œ๋ฌผ์€ Sebastian Aigner๊ฐ€ ์ž‘์„ฑํ•œ Kotlin 1.4.0-RC Released๋ฅผ ๋ฒˆ์—ญํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

image description
  1. ํ–ฅ์ƒ๋œ *.gradle.kts IDE ์ง€์›
    1. ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋กœ๋“œ
    2. ์˜ค๋ฅ˜ ๋ณด๊ณ  ๊ธฐ๋Šฅ ๊ฐœ์„ 
  2. ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์˜ ์ƒ์šฉ๊ตฌ ๊ฐ์†Œ
  3. Kotlin/Native
  4. Kotlin/JS
  5. ์ง„ํ™”ํ•˜๋Š” Kotlin ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API
  6. ์Šคํฌ๋ฆฝํŠธ ์ž‘์—…
  7. CLion IDE ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ ์ค‘๋‹จ
  8. ํ˜ธํ™˜์„ฑ
  9. ์ตœ์‹  ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  10. ์˜๊ฒฌ์„ ๊ณต์œ ํ•ด ์ฃผ์„ธ์š”
  11. ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž

Discover more

Kotlin 1.4-M3 ์ถœ์‹œ: ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ

Kotlin 1.4์˜ ์ตœ์ข… ํ…Œ์ŠคํŠธ ๋ฒ„์ „์ธ 1.4-M3 ๋ฒ„์ „์„ ๊ธฐ์œ ๋งˆ์Œ์œผ๋กœ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ฒŒ์‹œ๊ธ€์—์„œ๋Š” ์ด๋ฒˆ ํ…Œ์ŠคํŠธ ๋ฒ„์ „์ด Kotlin ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€ํ•  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ด๋“œ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ M3์˜ ๊ธฐํƒ€ ๊ตฌ์„ฑ ์š”์†Œ์—๋„ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณง ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€์„ ํ†ตํ•ด Kotlin 1.4์˜ ๋งˆ์ง€๋ง‰ ๋ฒ„์ „์ด ๋  ๋ฆด๋ฆฌ์Šค ํ›„๋ณด ๋ฒ„์ „(1.4-RC)์— ๋Œ€ํ•œ ์ •๋ณด๋„ ๋‹ค๋ฃฐ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. 1.4-M3์˜ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ JVM ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ module-info ์„ค๋ช…์ž๊ฐ€ ์ง€์›๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šคโ€ฆ