0Pricing
Kotlin Academy · 강의

첫 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. KSP와 KAPT 비교: KSP가 더 빠른 이유
  2. 첫 SymbolProcessor 작성하기
  3. KotlinPoet으로 Kotlin 소스 파일 생성하기
  4. KSP 프로세서를 Gradle 빌드에 통합하기
← Kotlin Academy(으)로 돌아가기