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 기반으로 재작성 필요 |
🔗 관련 문서