첫 SymbolProcessor 작성하기
주석이 붙은 클래스를 검색하고 기록하는 KSP 프로세서를 구현해 보세요.
첫 SymbolProcessor 작성하기은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
프로젝트 구조
KSP 처리기는 별도의 Gradle 모듈(예: :processor)에 있습니다. 사용하는 모듈에서는 KSP 플러그인을 적용하고 처리기 모듈에 대한 ksp 의존성을 선언합니다. 처리기 모듈 자체에는 KSP API에 대한 일반적인 implementation 의존성이 있습니다.
KSP 의존성 추가하기
처리기 모듈의 build.gradle.kts에서 다음을 작성합니다:
plugins { kotlin("jvm") }
dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:2.0.0-1.0.21")
}SymbolProcessor 인터페이스
SymbolProcessor를 구현합니다. 주요 진입점은 process(resolver: Resolver): List입니다. 처리하지 못한 심벌(예: 의존성이 아직 해결되지 않은 심벌)을 반환하면 두 번째 단계에서 다시 처리됩니다.
import com.google.devtools.ksp.processing.*
import com.google.devtools.ksp.symbol.*
class MyProcessor(private val logger: KSPLogger,
private val codeGenerator: CodeGenerator) : SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
val symbols = resolver.getSymbolsWithAnnotation("com.example.MyAnnotation")
// process symbols here
return emptyList()
}
}SymbolProcessorProvider
KSP는 SymbolProcessorProvider를 통해 처리기를 찾습니다. 다음 위치에 등록하십시오: resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider
class MyProcessorProvider : SymbolProcessorProvider {
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor =
MyProcessor(
logger = environment.logger,
codeGenerator = environment.codeGenerator
)
}서비스 등록 파일
처리기 모듈의 리소스에 정확한 경로로 파일을 만듭니다:
- 경로:
src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider - 내용:
SymbolProcessorProvider클래스의 정규화된 전체 이름
애너테이션으로 심벌 확인하기
resolver.getSymbolsWithAnnotation(fqn)을 사용하면 해당 애너테이션이 적용된 모든 선언을 가져올 수 있습니다. 예상하는 선언 유형으로 필터링하십시오(예: 클래스 선언):
val classes = resolver
.getSymbolsWithAnnotation("com.example.MyAnnotation")
.filterIsInstance<KSClassDeclaration>()심벌 검증하기
처리하기 전에 각 심벌을 완전히 확인할 수 있는지 검증합니다. 타입 참조가 아직 컴파일되지 않은 심벌은 유효하지 않습니다. 이러한 심벌을 process()에서 반환하면 다음 단계에서 다시 시도합니다:
val (valid, deferred) = classes.partition { it.validate() }
// process valid; return deferred클래스 선언 방문하기
KSVisitorVoid 방문자 패턴을 사용해 클래스 구조를 순회합니다. visitClassDeclaration을 재정의하면 프로퍼티, 함수, 중첩 클래스에 접근할 수 있습니다:
class MyVisitor : KSVisitorVoid() {
override fun visitClassDeclaration(classDeclaration: KSClassDeclaration, data: Unit) {
val name = classDeclaration.simpleName.asString()
val props = classDeclaration.getAllProperties().toList()
println("Class: $name, props: ${props.size}")
}
}처리기에서 메시지 기록하기
KSPLogger를 사용해 다양한 수준의 메시지를 출력합니다. logger.error()는 빌드를 실패하게 하고, logger.warn()은 경고를 출력하며, logger.info()는 --info에서 볼 수 있는 정보 메시지를 출력합니다.
logger.info("Processing class: ${classDeclaration.simpleName.asString()}")
logger.error("Missing required annotation", classDeclaration)심벌의 애너테이션에 접근하기
각 KSDeclaration에는 annotations 시퀀스가 있습니다. filter와 arguments를 사용해 애너테이션 값을 읽습니다:
val ann = classDeclaration.annotations
.first { it.shortName.asString() == "MyAnnotation" }
val value = ann.arguments.first { it.name?.asString() == "value" }.value as String증분 처리 안내
CodeGenerator.createNewFile(dependencies = ...)를 통해 출력 파일과 입력 심벌의 의존 관계를 연결하면, 어떤 출력 파일이 어떤 입력 심벌에 의존하는지 KSP에 알릴 수 있습니다. 그러면 입력이 하나도 변경되지 않은 경우 KSP가 처리기를 건너뛸 수 있습니다.
빠른 확인
KSP는 SymbolProcessorProvider 구현을 어떻게 찾나요?
첫 번째 SymbolProcessor 작성 복습
핵심 내용:
- 별도의 모듈에서
SymbolProcessor와SymbolProcessorProvider를 구현합니다 META-INF/services/를 통해 제공자를 등록합니다resolver.getSymbolsWithAnnotation()을 사용해 애너테이션이 적용된 심벌을 찾습니다- 처리하기 전에 심벌을 검증하고, 해결되지 않은 심벌은 다시 시도하도록 반환합니다
- 빌드 시 메시지에는
KSPLogger를 사용하고 파일 작성에는CodeGenerator를 사용합니다
자주 묻는 질문
“첫 SymbolProcessor 작성하기” 강의는 무료인가요?
네 — “첫 SymbolProcessor 작성하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“첫 SymbolProcessor 작성하기”에서 뭘 배우나요?
주석이 붙은 클래스를 검색하고 기록하는 KSP 프로세서를 구현해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“첫 SymbolProcessor 작성하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- KSP와 KAPT 비교: KSP가 더 빠른 이유
- 첫 SymbolProcessor 작성하기
- KotlinPoet으로 Kotlin 소스 파일 생성하기
- KSP 프로세서를 Gradle 빌드에 통합하기