Kotlin 2.3.x 호환성 가이드

Kotlin 2.3.x 호환성 가이드

"언어를 현대적으로 유지하기(Keeping the Language Modern)"와 "편안한 업데이트(Comfortable Updates)"는 코틀린 언어 설계의 근본 원칙 중 하나예요. 전자는 언어 진화를 방해하는 구성을 제거해야 한다는 뜻이고, 후자는 코드 마이그레이션이 최대한 매끄럽도록 그 제거를 사전에 잘 공지해야 한다는 뜻이에요.

대부분의 언어 변경은 업데이트 체인지로그나 컴파일러 경고 같은 다른 채널을 통해 이미 공지됐지만, 이 문서가 그것들을 모두 정리해 Kotlin 2.2에서 Kotlin 2.3로 마이그레이션하기 위한 완전한 참고 자료를 제공할게요. 이 문서에는 도구 관련 변경 사항 정보도 포함돼요.

출처: 공식문서 - Compatibility guide for Kotlin 2.3.x

기본 용어

이 문서에서는 여러 종류의 호환성을 소개해요.

  • 소스(source): 소스 비호환 변경은 (오류나 경고 없이) 잘 컴파일되던 코드가 더 이상 컴파일되지 않게 만드는 변경이에요.
  • 바이너리(binary): 두 바이너리 산출물을 서로 교체해도 로딩이나 링크 오류가 생기지 않으면 두 바이너리가 바이너리 호환된다고 말해요.
  • 동작(behavioral): 같은 프로그램이 변경 전과 후에 서로 다른 동작을 보이면 그 변경은 동작 비호환(behavioral-incompatible)이라고 해요.

이 정의들은 순수한 코틀린에만 적용된다는 점을 기억하세요. 다른 언어(예컨대 자바) 관점에서의 코틀린 코드 호환성은 이 문서의 범위 밖이에요.

언어 (Language)

-language-version에서 1.8과 1.9 지원 제거

  • 이슈: KT-76343, KT-76344.
  • 컴포넌트: Compiler
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3부터 컴파일러는 -language-version=1.8을 더 이상 지원하지 않아요. -language-version=1.9 지원도 비-JVM 플랫폼에서는 제거돼요.

폐기 주기(Deprecation cycle):

  • 2.2.0: 1.8과 1.9 버전을 -language-version으로 쓸 때 경고를 보고.
  • 2.3.0: 1.8 버전은 모든 플랫폼에서, 1.9 버전은 비-JVM 플랫폼에서 -language-version으로 쓸 때 경고를 오류로 승격.

타입 별칭(typealias)이 있는 추론된 타입에 대해 상한 경계 위반 오류 보고

  • 이슈: KTLC-287
  • 컴포넌트: Core language
  • 비호환 변경 유형: source

간단 요약: 이전에는 컴파일러가 추론된 타입의 상한 경계(upper-bound) 위반 제약에 대해 오류를 보고하지 않았어요. Kotlin 2.3.0에서 이 문제가 수정되어, 모든 타입 매개변수에 걸쳐 일관되게 오류가 보고돼요.

폐기 주기:

  • 2.2.20: 암시적 타입 인자(implicit type arguments)의 경계 위반에 대해 폐기 경고를 보고.
  • 2.3.0: 암시적 타입 인자에 대한 UPPER_BOUND_VIOLATED 경고를 오류로 승격.

inlinecrossinline 람다에 @JvmSerializableLambda 애너테이션 금지

  • 이슈: KTLC-9
  • 컴포넌트: Core language
  • 비호환 변경 유형: source

간단 요약: inline 또는 crossinline 람다에는 더 이상 @JvmSerializableLambda 애너테이션을 적용할 수 없어요. 이런 람다는 직렬화할 수 없으므로 @JvmSerializableLambda를 적용해도 효과가 없었어요.

폐기 주기:

  • 2.1.20: @JvmSerializableLambdainlinecrossinline 람다에 적용될 때 경고를 보고.
  • 2.3.0: 경고를 오류로 승격; 이 변경은 progressive 모드에서 활성화할 수 있어요.

제네릭 시그니처가 일치하지 않을 때 코틀린 인터페이스를 자바 클래스에 위임(delegate)하는 것 금지

  • 이슈: KTLC-267
  • 컴포넌트: Core language
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 제네릭 인터페이스 메서드를 비-제네릭 오버라이드로 구현하는 자바 클래스에 위임하는 것을 금지해요. 이전에는 이 동작을 허용하면 타입 불일치와 런타임 ClassCastException이 발생했어요. 이 변경은 오류를 런타임에서 컴파일 시점으로 옮겨요.

폐기 주기:

  • 2.1.20: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

명시적 반환 타입이 없는 표현식 본문(expression-bodied) 함수에서 return 사용 폐기

  • 이슈: KTLC-288
  • 컴포넌트: Core language
  • 비호환 변경 유형: source

간단 요약: 함수의 반환 타입이 명시적으로 선언되지 않았는데 표현식 본문 안에서 return을 사용하는 것이 이제 폐기됐어요.

폐기 주기:

  • 2.3.0: 경고를 보고.
  • 2.4.0: 경고를 오류로 승격.

타입 별칭을 통해 도입된 nullable 슈퍼타입으로부터의 상속 금지

  • 이슈: KTLC-279
  • 컴포넌트: Core language
  • 비호환 변경 유형: source

간단 요약: 코틀린은 이제 nullable 타입 별칭으로부터 상속하려 할 때 오류를 보고해요. 이는 직접 nullable 슈퍼타입을 이미 처리하던 방식과 일관된 동작이에요.

폐기 주기:

  • 2.2.0: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

최상위 람다와 호출 인자의 제네릭 시그니처 생성 통일

  • 이슈: KTLC-277
  • 컴포넌트: Reflection
  • 비호환 변경 유형: behavioral

간단 요약: Kotlin 2.3.0은 최상위 람다에 호출 인자로 전달된 람다와 동일한 타입 검사 로직을 사용해서, 두 경우에 걸쳐 일관된 제네릭 시그니처 생성을 보장해요.

폐기 주기:

  • 2.3.0: 새 동작 도입; progressive 모드에서는 적용되지 않음.

reified 타입 매개변수가 교차 타입(intersection types)으로 추론되는 것 금지

  • 이슈: KTLC-13
  • 컴포넌트: Core language
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 reified 타입 매개변수가 교차 타입으로 추론되는 상황을 금지해요. 이는 잘못된 런타임 동작으로 이어질 수 있기 때문이에요.

폐기 주기:

  • 2.1.0: reified 타입 매개변수가 교차 타입으로 추론될 때 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

타입 매개변수 경계를 통한 덜 가시적인 타입 노출 금지

  • 이슈: KTLC-275
  • 컴포넌트: Core language
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 함수나 선언 자체보다 더 제한적인 가시성을 가진 타입을 노출하는 타입 매개변수 경계 사용을 금지해요. 이것은 클래스에 이미 적용된 규칙을 함수에도 맞추는 작업이에요.

폐기 주기:

  • 2.1.0: 문제가 되는 타입 매개변수 경계에 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

표준 라이브러리 (Standard library)

Char-숫자 변환 폐기 및 명시적 digit·code API 도입

  • 이슈: KTLC-321
  • 컴포넌트: kotlin-stdlib
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 숫자 타입에 대한 Char.toX()X.toChar() 변환을 폐기하고, 문자의 code와 digit 값을 접근하는 새 명시적 API를 도입해요.

폐기 주기:

  • 1.4.30: 새 함수를 Experimental로 도입.
  • 1.5.0: 새 함수를 Stable로 승격; 대체를 제안하면서 기존 함수에 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

Number.toChar() 함수 폐기

  • 이슈: KT-56822
  • 컴포넌트: kotlin-stdlib
  • 비호환 변경 유형: source

간단 요약: Number.toChar() 함수가 폐기됐어요. toInt().toChar() 또는 Char 생성자를 대신 사용하세요.

폐기 주기:

  • 1.9.0: Number.toChar() 함수를 쓸 때 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

String.subSequence(start, end) 함수 폐기

  • 이슈: KTLC-282
  • 컴포넌트: kotlin-stdlib
  • 비호환 변경 유형: source

간단 요약: String.subSequence(start, end) 함수가 폐기됐어요. String.subSequence(startIndex, endIndex) 함수를 대신 사용하세요.

폐기 주기:

  • 1.0: String.subSequence(start, end)를 쓸 때 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

kotlin.io.createTempDirectory()kotlin.io.createTempFile() 함수 폐기

  • 이슈: KTLC-281
  • 컴포넌트: kotlin-stdlib
  • 비호환 변경 유형: source

간단 요약: kotlin.io.createTempDirectory()kotlin.io.createTempFile() 함수가 폐기됐어요. kotlin.io.path.createTempDirectory()kotlin.io.path.createTempFile() 함수를 대신 사용하세요.

폐기 주기:

  • 1.4.20: kotlin.io.createTempDirectory()kotlin.io.createTempFile() 함수를 쓸 때 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.

InputStream.readBytes(Int) 함수 숨기기

  • 이슈: KTLC-280
  • 컴포넌트: kotlin-stdlib
  • 비호환 변경 유형: source

간단 요약: 오랫동안 폐기됐던 InputStream.readBytes(estimatedSize: Int = DEFAULT_BUFFER_SIZE): ByteArray 함수가 이제 숨겨져요.

폐기 주기:

  • 1.3.0: 경고를 보고.
  • 1.5.0: 경고를 오류로 승격.
  • 2.3.0: 함수를 숨김.

다른 플랫폼과 Kotlin/Native 스택 트레이스 출력 통일

  • 이슈: KT-81431
  • 컴포넌트: Kotlin/Native
  • 비호환 변경 유형: behavioral

간단 요약: 예외 스택 트레이스를 포맷할 때, 같은 예외 원인(cause)이 이미 출력됐다면 추가 원인들을 출력하지 않아요.

폐기 주기:

  • 2.3.20: 다른 코틀린 플랫폼과 Kotlin/Native 예외 스택 트레이스 포맷을 통일.

Iterable<T>.intersect()Iterable<T>.subtract() 동작 수정

  • 이슈: KTLC-268
  • 컴포넌트: kotlin-stdlib
  • 비호환 변경 유형: behavioral

간단 요약: Iterable<T>.intersect()Iterable<T>.subtract() 함수는 이제 각 수신자(receiver) 요소를 결과 집합에 추가하기 전에 그 요소의 포함 여부를 검사해요. 결과 집합은 Any::equals로 요소를 비교하므로, 인자 컬렉션이 참조 동등성(referential equality)을 사용할 때(예: IdentityHashMap.keys)도 올바른 결과를 보장해요.

폐기 주기:

  • 2.3.0: 새 동작을 활성화.

도구 (Tools)

kotlin-dslkotlin("jvm") 플러그인을 함께 쓸 때 미지원 KGP 버전 경고

  • 이슈: KT-79851
  • 컴포넌트: Gradle
  • 비호환 변경 유형: behavioral

간단 요약: Kotlin 2.3에서 Gradle 프로젝트에 kotlin-dslkotlin("jvm") 플러그인을 둘 다 사용하면, 미지원 Kotlin Gradle 플러그인(KGP) 버전에 대한 Gradle 경고가 보일 수 있어요.

마이그레이션 단계:

일반적으로 같은 Gradle 프로젝트에서 kotlin-dslkotlin("jvm") 플러그인을 둘 다 사용하는 것은 권장하지 않아요. 이 조합은 지원되지 않아요.

컨벤션 플러그인, 사전 컴파일된 스크립트 플러그인, 또는 어떤 형태로든 공개되지 않은 빌드 로직에는 세 가지 옵션이 있어요.

  1. kotlin("jvm") 플러그인을 명시적으로 적용하지 마세요. 대신 kotlin-dsl 플러그인이 호환되는 KGP 버전을 자동으로 제공하게 하세요.

  2. kotlin("jvm") 플러그인을 명시적으로 적용하고 싶다면 embeddedKotlinVersion 상수를 사용해 내장된 코틀린 버전을 지정하세요.

    내장된 코틀린 및 언어 버전을 업그레이드하려면 Gradle 버전을 업데이트하세요. 호환되는 Gradle 버전은 Gradle 문서의 Kotlin용 Compatibility Notes에서 찾을 수 있어요.

  3. kotlin-dsl 플러그인을 사용하지 마세요. 특정 Gradle 버전에 묶이지 않은 바이너리 플러그인에는 이 편이 더 적합할 수 있어요.

마지막 수단으로 프로젝트가 언어 버전 2.1 이상을 사용하도록 설정할 수 있어요. 그러면 kotlin-dsl 플러그인의 상충하는 동작을 덮어써요. 다만 그렇게 하는 것은 강하게 권장하지 않아요.

마이그레이션 중 어려움을 겪는다면 우리 Slack의 #gradle 채널에서 지원을 요청하세요.

폐기 주기:

  • 2.3.0: kotlin-dsl 플러그인이 호환되지 않는 컴파일러 언어 또는 API 버전과 함께 사용될 때 이를 감지하는 진단을 도입.

AGP 9.0.0 이상 버전에서 kotlin-android 플러그인 폐기

  • 이슈: KT-81199
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0에서 org.jetbrains.kotlin.android 플러그인은 Android Gradle 플러그인(AGP) 9.0.0 이상 버전을 쓸 때 폐기돼요. AGP 9.0.0부터 AGP가 코틀린을 내장 지원하므로 kotlin-android 플러그인은 더 이상 필요 없어요.

폐기 주기:

  • 2.3.0: kotlin-android 플러그인이 AGP 9.0.0 이상과 함께, 그리고 android.builtInKotlinandroid.newDsl=false Gradle 속성 둘 다 false로 설정된 채 사용될 때 경고를 보고.

testApi 설정(configuration) 폐기

  • 이슈: KT-63285
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 testApi 설정을 폐기해요. 이 설정은 테스트 의존성과 소스를 다른 모듈에 노출했지만, Gradle은 이 동작을 지원하지 않아요.

마이그레이션 옵션: testApi() 인스턴스를 testImplementation()으로 바꾸고, 다른 변형(variants)에도 같은 작업을 해요. 예를 들어 kotlin.sourceSets.commonTest.dependencies.api()kotlin.sourceSets.commonTest.dependencies.implementation()으로 바꾸세요.

Kotlin/JVM 프로젝트에서는 Gradle의 테스트 픽스처(test fixtures) 사용을 고려해 보세요. 멀티플랫폼 프로젝트에서 테스트 픽스처 지원을 보고 싶다면 YouTrack에 사용 사례를 공유해 주세요.

폐기 주기:

  • 2.3.0: 경고를 보고.

createTestExecutionSpec() 함수 폐기

  • 이슈: KT-75449
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 더 이상 사용되지 않는 KotlinJsTestFramework 인터페이스의 createTestExecutionSpec() 함수를 폐기해요.

폐기 주기:

  • 2.2.20: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: 함수 제거.

closureTo(), createResultSet(), KotlinToolingVersionOrNull() 함수 제거

  • 이슈: KT-64273
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 더 이상 사용되지 않는 closure DSL의 closureTo(), createResultSet() 함수를 제거해요. 또한 KotlinToolingVersionOrNull() 함수도 제거돼요. KotlinToolingVersion() 함수를 대신 사용하세요.

폐기 주기:

  • 1.7.20: 오류를 보고.
  • 2.3.0: 함수 제거.

ExtrasProperty API 폐기

  • 이슈: KT-74915
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.0.0부터 폐기됐던 ExtrasProperty API는 Kotlin 2.3.0에서 내부화(internalize)돼요. 대안으로 Gradle의 ExtraPropertiesExtension API를 사용하세요.

폐기 주기:

  • 2.0.0: 경고를 보고.
  • 2.1.0: 경고를 오류로 승격.
  • 2.3.0: API를 internal로 만듦.

KotlinCompilationHasKotlinDependencies 폐기

  • 이슈: KT-67290
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 KotlinCompilationHasKotlinDependencies 인터페이스를 폐기해요. 의존성 관련 API는 이제 KotlinSourceSet 인터페이스를 통해 노출돼요.

폐기 주기:

  • 2.3.0: 경고를 보고.

npm과 Yarn 패키지 매니저 내부 함수·속성 폐기

  • 이슈: KT-81009
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: npm과 Yarn 패키지 매니저와 관련된 다음 함수·속성들이 폐기돼요.

  • CompositeDependency.dependencyName, CompositeDependency.dependencyVersion, CompositeDependency.includedBuildDir.
  • KotlinNpmInstallTask.Companion.NAME.
  • LockCopyTask.Companion.STORE_PACKAGE_LOCK_NAME, LockCopyTask.Companion.RESTORE_PACKAGE_LOCK_NAME, LockCopyTask.Companion.UPGRADE_PACKAGE_LOCK.
  • Npm.npmExec().
  • NpmProject.require(), NpmProject.useTool().
  • PublicPackageJsonTask.jsIrCompilation.
  • YarnBasics.yarnExec().
  • YarnPlugin.Companion.STORE_YARN_LOCK_NAME, YarnPlugin.Companion.RESTORE_YARN_LOCK_NAME, YarnPlugin.Companion.UPGRADE_YARN_LOCK.
  • YarnSetupTask.Companion.NAME.

폐기 주기:

  • 2.2.0 및 2.2.20: 이 함수·속성들을 쓸 때 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: 함수·속성 제거.

PhantomJS 지원 폐기

  • 이슈: KT-76019
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: PhantomJS가 더 이상 유지보수되지 않으므로, Kotlin 2.3.0은 NpmVersions API의 karmaPhantomjsLauncher 속성을 폐기해요.

폐기 주기:

  • 2.3.0: 경고를 보고.

테스트 실행이나 JavaScript 런타임을 설정하는 클래스의 서브클래싱 금지

  • 이슈: KT-75869, KT-81007
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 다음 클래스의 서브클래싱을 금지해요.

  • KotlinTest
  • KotlinNativeTest
  • KotlinJsTest
  • KotlinJsIrTarget
  • KotlinNodeJsIr
  • KotlinD8Ir
  • KotlinKarma
  • KotlinMocha
  • KotlinWebpack
  • TypeScriptValidationTask
  • YarnRootExtension

이 클래스들은 처음부터 서브클래싱되도록 설계된 적이 없어요. 서브클래싱의 모든 사용 사례는 이제 Kotlin Gradle 플러그인 DSL이 제공하는 설정 블록으로 커버돼야 해요. 테스트 실행이나 JavaScript 런타임 설정에 기존 API로 부족하다면 YouTrack에 피드백을 공유하세요.

폐기 주기:

  • 2.2.0: 이 클래스들에서 서브클래스를 만드는 코드에 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: API 제거.

ExperimentalWasmDsl 애너테이션 클래스 폐기

  • 이슈: KT-81005
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: 기능이 kotlin-plugin-annotations 모듈로 옮겨갔으므로 ExperimentalWasmDsl 애너테이션 클래스가 폐기돼요.

폐기 주기:

  • 2.0.20: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: 애너테이션 클래스 제거.

ExperimentalDceDsl 애너테이션 클래스 폐기

  • 이슈: KT-81008
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: ExperimentalDceDsl 애너테이션 클래스는 더 이상 사용되지 않으므로 폐기됐어요.

폐기 주기:

  • 2.2.0: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: 애너테이션 클래스 제거.

JavaScript 유틸리티 폐기

  • 이슈: KT-81010
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: 다음 함수·속성들은 내부적으로만 사용되므로 폐기됐어요.

  • JsIrBinary.generateTs
  • KotlinJsIrLink.mode
  • NodeJsSetupTask.Companion.NAME
  • Appendable.appendConfigsFromDir()
  • ByteArray.toHex()
  • FileHasher.calculateDirHash()
  • String.jsQuoted()

폐기 주기:

  • 2.2.0: KotlinJsIrLink.mode 속성이 사용될 때 경고를 보고.
  • 2.2.0: NodeJsSetupTask.Companion.NAME 속성과 함수가 사용될 때 경고를 보고.
  • 2.2.20: JsIrBinary.generateTs 속성이 사용될 때 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: API 제거.

마이그레이션된 D8 및 Binaryen 속성 폐기

  • 이슈: KT-81006
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: 다음 속성들은 org.jetbrains.kotlin.gradle.targets.js 패키지에서 org.jetbrains.kotlin.gradle.targets.wasm 패키지로 마이그레이션됐으므로 폐기됐어요.

  • binaryen.BinaryenEnvSpec
  • binaryen.BinaryenExtension
  • binaryen.BinaryenPlugin
  • binaryen.BinaryenRootPlugin
  • BinaryenSetupTask.Companion.NAME
  • d8.D8EnvSpec
  • d8.D8Plugin
  • D8SetupTask.Companion.NAME

폐기 주기:

  • 2.2.0: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: 속성 제거.

NodeJsExec DSL의 create() 함수 폐기

  • 이슈: KT-81004
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: NodeJsExec DSL의 컴패니언 객체에 있는 create() 함수가 폐기됐어요. register() 함수를 대신 사용하세요.

폐기 주기:

  • 2.1.20: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: 함수 제거.

kotlinOptions DSL의 속성 폐기

  • 이슈: KT-76720
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: kotlinOptions DSL과 관련 KotlinCompile<KotlinOptions> 태스크 인터페이스를 통해 컴파일러 옵션을 설정하는 기능은 Kotlin 2.2.0부터 새 compilerOptions DSL을 위해 폐기됐어요. Kotlin 2.3.0은 kotlinOptions 인터페이스의 모든 속성에 대한 폐기 주기를 계속 이어가요. 마이그레이션하려면 compilerOptions DSL을 사용해 컴파일러 옵션을 설정하세요. 마이그레이션 지침은 "Migrate from kotlinOptions {} to compilerOptions {}" 문서를 참고하세요.

폐기 주기:

  • 2.0.0: kotlinOptions DSL에 대해 경고를 보고.
  • 2.2.0: 경고를 오류로 승격하고 kotlinOptions의 모든 속성을 폐기.
  • 2.3.0: kotlinOptions의 모든 속성에 대해 경고를 오류로 승격.

kotlinArtifacts API 폐기

  • 이슈: KT-77066
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: 실험적인 kotlinArtifacts API가 폐기됐어요. 최종 네이티브 바이너리를 빌드하려면 코틀린 Gradle 플러그인에서 제공되는 현재 DSL을 사용하세요. 마이그레이션에 부족하다면 이 YouTrack 이슈에 코멘트를 남겨 주세요.

폐기 주기:

  • 2.2.0: kotlinArtifacts API가 사용될 때 경고를 보고.
  • 2.3.0: 이 경고를 오류로 승격.
  • 2.4.0: API 제거.

kotlin.mpp.resourcesResolutionStrategy Gradle 속성 제거

  • 이슈: KT-74955
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: 이전에 kotlin.mpp.resourcesResolutionStrategy Gradle 속성은 사용되지 않아서 폐기됐어요. Kotlin 2.3.0에서 이 Gradle 속성은 완전히 제거돼요.

폐기 주기:

  • 2.2.0: 설정 시점 진단(configuration-time diagnostic)을 보고.
  • 2.3.0: Gradle 속성 제거.

멀티플랫폼 IDE 임포트의 옛 모드 폐기

  • 이슈: KT-61127
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0 이전에는 여러 멀티플랫폼 IDE 임포트 모드를 지원했어요. 이제 옛 모드는 폐기되어 한 가지 모드만 남았어요. 이전에 옛 모드는 kotlin.mpp.import.enableKgpDependencyResolution=false Gradle 속성으로 활성화됐어요. 이 속성을 쓰면 이제 폐기 경고가 발생해요.

폐기 주기:

  • 2.3.0: kotlin.mpp.import.enableKgpDependencyResolution=false Gradle 속성이 사용될 때 경고를 보고.

정밀 컴파일 백업(backup)을 비활성화하는 속성 제거

  • 이슈: KT-81038
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 1.9.0은 정밀 컴파일 백업(precise compilation backup)이라는 증분 컴파일용 실험적 최적화를 도입했어요. 테스트가 성공한 후 이 최적화는 Kotlin 2.0.0에서 기본으로 활성화됐어요. Kotlin 2.3.0은 이 최적화를 옵트아웃하는 kotlin.compiler.preciseCompilationResultsBackupkotlin.compiler.keepIncrementalCompilationCachesInMemory Gradle 속성을 제거해요.

폐기 주기:

  • 2.1.20: 경고를 보고.
  • 2.3.0: 속성 제거.

CInteropProcessdestinationDir 폐기

  • 이슈: KT-74910
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: CInteropProcess 태스크의 destinationDir 속성이 폐기됐어요. CInteropProcess.destinationDirectory.set() 함수를 대신 사용하세요.

폐기 주기:

  • 2.1.0: destinationDir 속성이 사용될 때 경고를 보고.
  • 2.2.0: 이 경고를 오류로 승격.
  • 2.3.0: destinationDir 속성을 숨김.

CInteropProcesskonanVersion 폐기

  • 이슈: KT-74911
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: CInteropProcess 태스크의 konanVersion 속성이 폐기됐어요. CInteropProcess.kotlinNativeVersion을 대신 사용하세요.

폐기 주기:

  • 2.1.0: konanVersion 속성이 사용될 때 경고를 보고.
  • 2.2.0: 이 경고를 오류로 승격.
  • 2.3.0: konanVersion 속성을 숨김.

KotlinCompile.classpathSnapshotProperties 속성 제거

  • 이슈: KT-76177
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: kotlin.incremental.useClasspathSnapshot Gradle 속성은 Kotlin 2.2.0에서 제거됐어요. Kotlin 2.3.0에서는 다음 속성들도 제거돼요.

  • KotlinCompile.classpathSnapshotProperties.useClasspathSnapshot
  • KotlinCompile.classpathSnapshotProperties.classpath

폐기 주기:

  • 2.0.20: kotlin.incremental.useClasspathSnapshot 속성을 경고와 함께 폐기.
  • 2.2.0: kotlin.incremental.useClasspathSnapshot 속성 제거.
  • 2.3.0: KotlinCompile.classpathSnapshotProperties.useClasspathSnapshotKotlinCompile.classpathSnapshotProperties.classpath 속성 제거.

getPluginArtifactForNative() 함수 폐기

  • 이슈: KT-78870
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.2.20에서 getPluginArtifactForNative() 함수가 폐기됐어요. getPluginArtifact() 함수를 대신 사용하세요.

폐기 주기:

  • 2.2.20: 경고를 보고.
  • 2.3.0: 경고를 오류로 승격.
  • 2.4.0: 함수 제거.

생성된 소스를 등록하는 방식 변경

  • 이슈: KT-45161
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.0은 KotlinSourceSet 인터페이스에 Gradle 프로젝트에서 생성된 소스를 등록할 수 있는 새 Experimental API를 도입해요. 이전에는 kotlin 속성으로 모든 생성된 소스에 접근할 수 있었어요. Kotlin 2.3.0부터 플러그인이나 빌드 로직이 모든 생성된 소스에 접근해야 한다면 allKotlinSources 속성을 대신 사용하세요.

마이그레이션 조언:

  • 생성된 소스를 등록하려면 generatedKotlin 속성을 사용하세요.
  • 생성되지 않은 소스를 포함한 모든 소스에 접근하려면 allKotlinSources 속성을 사용하세요.

kotlin.publishJvmEnvironmentAttribute 속성 폐기

  • 이슈: KT-83678
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: Kotlin 2.3.20에서 kotlin.publishJvmEnvironmentAttribute 속성이 폐기돼요. 이 속성은 멀티플랫폼 라이브러리에 대해 org.gradle.jvm.environment 속성 게시를 비활성화했어요. Kotlin 2.0.20부터 org.gradle.jvm.environment는 관례적인(conventional) 의존성 해석을 보장하기 위해 기본으로 게시돼요.

폐기 주기:

  • 2.3.20: 경고를 보고.
  • 2.4.0: 속성 제거.

CleanableStore 인터페이스와 CleanDataTask 클래스 폐기

  • 이슈: KT-78104
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: CleanableStore 인터페이스와 CleanDataTask 클래스는 더 이상 사용되지 않으므로 폐기됐어요.

폐기 주기:

  • 2.3.20: 경고를 보고.
  • 2.4.20: 경고를 오류로 승격.

kotlin.kmp.isolated-projects.support Gradle 속성 폐기

  • 이슈: KT-79257
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: 멀티플랫폼 프로젝트가 기본적으로 isolated projects와 호환되고 다른 옵션이 없으므로, kotlin.kmp.isolated-projects.support Gradle 속성이 폐기돼요.

폐기 주기:

  • 2.3.20: 경고를 보고.

kotlin.mpp.enableKotlinToolingMetadataArtifact Gradle 속성 폐기

  • 이슈: KT-79924
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: kotlin-tooling-metadata.json 산출물이 이제 멀티플랫폼 프로젝트에 항상 생성되므로, kotlin.mpp.enableKotlinToolingMetadataArtifact Gradle 속성이 폐기돼요.

폐기 주기:

  • 2.3.20: 경고를 보고.
  • 2.4.0: 지원 제거.

LanguageSettings.enableLanguageFeature DSL 폐기

  • 이슈: KT-82323, KT-82847
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: LanguageSettings.enableLanguageFeature DSL은 코틀린 컴파일러 테스트를 위해서만 의도된 내부 컴파일러 설정을 노출했어요. 그래서 이 DSL이 폐기됐어요.

폐기 주기:

  • 2.3.20: LanguageSettings.enableLanguageFeature를 쓸 때 경고를 보고.
  • 2.4.0: 경고를 오류로 승격.

"out of process" 컴파일러 실행 전략 폐기

  • 이슈: KT-83125
  • 컴포넌트: Gradle
  • 비호환 변경 유형: source

간단 요약: "out of process" 컴파일러 실행 전략은 Build tools API에서 지원되지 않고, 사용 가능한 전략 중 가장 느려요. Kotlin 2.3.20에서 이 전략은 "daemon"과 "in process" 컴파일러 실행 전략을 위해 폐기돼요.

폐기 주기:

  • 2.3.20: 경고를 보고.
  • 2.4.0: "out of process" 컴파일러 실행 전략 제거.

빌드 도구 제거 (Build tool removal)

Ant 지원 제거

  • 이슈: KT-75875
  • 컴포넌트: Ant

간단 요약: Kotlin 2.3.0은 빌드 도구로서의 Ant 지원을 제거해요. Gradle이나 Maven을 대신 사용하세요.

폐기 주기:

  • 2.2.0: 경고를 보고.
  • 2.3.0: 지원 제거.

더 알아보기 (Learn more)