본문 바로가기
Updates.

✅ Kotlin 2.1.10 → 2.2.0 & KSP 2.0.20-1.0.25 → 2.2.0-2.0.2 대응 완전 정리

by h4r3 2025. 6. 30.
반응형

Kotlin 2.2.0과 KSP 2.2.0-2.0.2는 새로운 K2 컴파일러를 기본으로 적용하며, DSL 구성과 코드 생성 환경을 크게 개선합니다. 이 가이드에서는 변경사항 요약은 물론, Jetpack Compose + MVVM + Hilt + Clean Architecture 구조에서의 연동 방법까지 실무 관점에서 상세히 설명합니다.


✅ 1. Kotlin 2.2.0 주요 변경사항

항목 이전 버전 최신 버전 릴리즈일
Kotlin 2.1.10 2.2.0 2024.06.19

 


🔧 변경사항 요약

변경 일자 변경 내용 차이즘 적용 방법 활용 예시
2024.06.19 data object 정식 지원 object + data class 기능 통합 data object 키워드 사용 data object Loading : UiState
2024.06.19 context receiver 정식 지원 실험적 기능 → 안정화됨 context(Type) 문법 사용 context(UserSession) fun greet()
2024.06.19 K2 컴파일러 JVM 기본 적용 -Xuse-k2 없이 자동 적용 JVM 빌드 시 자동 사용 IDE 성능 및 컴파일 속도 개선

✅ 2. KSP 2.2.0-2.0.2 주요 변경사항

항목 이전 버전 최신 버전 릴리즈일
KSP 2.0.20-1.0.25 2.2.0-2.0.2 2024.06.21

🔧 변경사항 요약

변경 일자  변경 내용 차이점 적용방법 황용 예시 
2024.06.21 K2 대응 ResolverV2, CodeGeneratorV2 추가 기존 Resolver, CodeGenerator 사용 불가 K2 전용 API로 마이그레이션

📘 주요 기능 상세 설명

1️⃣ data object

sealed interface UiState
data object Loading : UiState
  • 싱글턴이면서 equals, hashCode 자동 제공
  • 기존 object에서 상태 비교 가능하도록 진화

2️⃣ context receiver

context(UserSession)
fun greet() {
    println("Hi, $userName")
}

fun main() {
    val session = UserSession("minzy")
    with(session) { greet() }
}
  • DSL 문법, DI, Scoped 함수 등에 강력하게 활용 가능

3️⃣ CodeGeneratorV2 & ResolverV2 예시

class MyProcessor(
    private val codeGenerator: CodeGeneratorV2,
    private val logger: KSPLogger
) : SymbolProcessor {

    override fun process(resolver: ResolverV2): List<KSAnnotated> {
        val file = codeGenerator.createNewFile(
            dependencies = Dependencies(false),
            packageName = "com.example.generated",
            fileName = "GeneratedClass"
        )
        file.write("class GeneratedClass {}".toByteArray())
        return emptyList()
    }
}

✅ 3. 실제 프로젝트에 적용하기 (Compose + Hilt + Clean Architecture 연동 예시)

🧱 1. Kotlin context receiver를 활용한 유저 세션 처리

// domain/session/UserSession.kt
data class UserSession(val userName: String)

// domain/usecase/GreetUserUseCase.kt
context(UserSession)
class GreetUserUseCase {
    fun execute(): String = "Hello, $userName"
}
// presentation/viewmodel/UserViewModel.kt
@HiltViewModel
class UserViewModel @Inject constructor() : ViewModel() {

    fun greet(): String {
        val session = UserSession("보람")
        return with(session) {
            GreetUserUseCase().execute()
        }
    }
}

⚙️ 2. KSP 기반 코드 생성기 적용

// processor/annotation/UserAnnotation.kt
@Target(AnnotationTarget.CLASS)
annotation class AutoSerializable
// processor/processor/UserProcessor.kt
class UserProcessor(
    private val codeGenerator: CodeGeneratorV2,
    private val logger: KSPLogger
) : SymbolProcessor {

    override fun process(resolver: ResolverV2): List<KSAnnotated> {
        resolver.getSymbolsWithAnnotation(AutoSerializable::class.qualifiedName!!)
            .filterIsInstance<KSClassDeclaration>()
            .forEach { classDecl ->
                val className = "${classDecl.simpleName.asString()}_AutoGenerated"
                val file = codeGenerator.createNewFile(
                    Dependencies(false), classDecl.packageName.asString(), className
                )
                file.write("class $className {}".toByteArray())
            }
        return emptyList()
    }
}

☑️ AutoSerializable이 붙은 클래스에 대해 자동으로 보조 클래스를 생성하는 예제입니다.


🧩 3. build.gradle.kts 설정

plugins {
    kotlin("jvm") version "2.2.0"
    id("com.google.devtools.ksp") version "2.2.0-2.0.2"
}

dependencies {
    implementation(kotlin("stdlib"))
    ksp("com.yourcompany.ksp:auto-serializer-processor:1.0.0")
}

✅ 4. 마이그레이션 체크리스트

항목 설명

항목 설명
✅ Kotlin 2.2.0 적용 K2 기반 문법, context receiver 사용 가능
✅ ResolverV2, CodeGeneratorV2 사용 기존 KSP API 완전 교체
✅ data object 마이그레이션 기존 sealed object → data object로 변경 가능
✅ kapt 제거 ksp() 의존성으로 완전 전환 권장
✅ Gradle clean 버전 변경 시 캐시 재빌드 필수

🔚 마무리 요약

변경 항목 핵심 요약
Kotlin 2.2.0 K2 기본 적용 + DSL 문법 강화 (data object, context)
KSP 2.2.0 ResolverV2, CodeGeneratorV2 적용 필수
실무 적용 Compose + Clean Architecture에서 context receiver, KSP 코드 생성기 적극 활용 가능
마이그레이션 팁 모든 Processor는 ResolverV2 기반으로 재작성 필요

🔗 관련 문서

반응형