실행 중 주석 읽기
Kotlin 리플렉션으로 선언에서 주석 인스턴스를 가져와 보세요.
실행 중 주석 읽기은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
사전 요구 사항
런타임에 애너테이션을 읽으려면 다음이 필요합니다. (1) @Retention(RUNTIME)으로 선언된 애너테이션, (2) 클래스 경로의 kotlin-reflect 의존성, (3) 애너테이션이 적용된 요소에 대한 KClass, KFunction 또는 KProperty 참조입니다.
KClass에서 애너테이션 읽기
KClass에서 annotations를 호출하면 해당 클래스의 모든 애너테이션을 가져올 수 있고, 특정 타입에는 findAnnotation을 사용할 수 있습니다:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
annotation class Table(val name: String)
@Table(name = "users")
class UserEntity
val ann = UserEntity::class.findAnnotation<Table>()
println(ann?.name) // "users"프로퍼티에서 애너테이션 읽기
KProperty.annotations 또는 findAnnotation을 통해 프로퍼티의 애너테이션에 접근합니다:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.PROPERTY)
annotation class Column(val name: String)
data class User(@Column("user_name") val name: String)
val prop = User::name
val col = prop.findAnnotation<Column>()
println(col?.name) // "user_name"함수에서 애너테이션 읽기
KFunction.findAnnotation을 사용해 함수의 애너테이션을 읽습니다:
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class Transactional
class UserService {
@Transactional
fun save(user: User) { /*...*/ }
}
val fn = UserService::save
val isTx = fn.hasAnnotation<Transactional>()
println(isTx) // true모든 프로퍼티를 순회하며 애너테이션 찾기
클래스에 선언된 모든 프로퍼티를 검색하고 특정 애너테이션이 적용된 프로퍼티를 수집하는 방식이 일반적으로 사용됩니다:
fun <A : Annotation> KClass<*>.annotatedProperties(
annotationClass: KClass<A>
): List<Pair<KProperty1<*, *>, A>> =
declaredMemberProperties
.mapNotNull { prop ->
prop.findAnnotation(annotationClass)?.let { ann -> prop to ann }
}매개변수의 애너테이션 읽기
KFunction.parameters를 통해 생성자 매개변수의 애너테이션에 접근합니다:
class Repo(
@param:Validate(minLength = 3) val name: String
)
val ctor = Repo::class.primaryConstructor!!
val param = ctor.parameters.first()
val ann = param.findAnnotation<Validate>()
println(ann?.minLength) // 3hasAnnotation과 findAnnotation 비교
부울 확인에는 hasAnnotation을 사용하고, 애너테이션의 프로퍼티 값을 가져와야 할 때는 findAnnotation을 사용합니다. 둘 다 kotlin.reflect.full의 확장 함수입니다.
클래스 계층 구조 따라가기
상위 클래스나 인터페이스의 애너테이션은 Kotlin 리플렉션에서 자동으로 상속되지 않습니다. 상속된 애너테이션이 필요하다면 KClass.superclasses를 따라가거나 KClass.allSuperclasses를 사용해야 합니다.
fun KClass<*>.findAnnotationRecursive(ann: KClass<out Annotation>) =
generateSequence(this) { null } // simplified — real impl walks supers
.flatMap { it.annotations }
.firstOrNull { it.annotationClass == ann }성능
리플렉션 호출은 느립니다. 프레임워크 시작 시 애너테이션을 검색한다면 결과를 KClass를 키로 사용하는 맵에 캐시합니다. 요청마다 또는 프레임마다 실행되는 자주 호출되는 경로에서는 애너테이션을 읽지 않습니다.
사용 지점 대상과 JVM 필드
@field: 대상을 사용하는 프로퍼티 애너테이션은 JVM 백킹 필드에 저장됩니다. Kotlin 선언 위치만 다루는 Kotlin의 annotations 목록 대신 Java 리플렉션(KProperty.javaField?.annotations)을 통해 접근합니다.
실전 예제: 간단한 ORM 매퍼
간단한 ORM 매퍼는 @Column 애너테이션을 읽어 SQL 열 목록을 구성합니다:
fun columns(klass: KClass<*>): String =
klass.declaredMemberProperties
.mapNotNull { it.findAnnotation<Column>()?.name }
.joinToString(", ")
println(columns(User::class)) // "user_name, email"빠른 확인
KClass에서 MyAnn 타입의 특정 애너테이션을 어떻게 읽을 수 있나요?
요약: 런타임에 애너테이션 읽기
핵심 내용:
- 애너테이션에는
@Retention(RUNTIME)이 지정되어야 합니다 - 애너테이션의 값을 가져오려면
findAnnotation을, 부울 확인에는() hasAnnotation을 사용합니다() KClass,KFunction,KProperty,KParameter에서 사용할 수 있습니다- 요청마다 발생하는 오버헤드를 피하려면 시작 시 검색 결과를 캐시합니다
@field:애너테이션에는KProperty.javaField를 사용합니다
자주 묻는 질문
“실행 중 주석 읽기” 강의는 무료인가요?
네 — “실행 중 주석 읽기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“실행 중 주석 읽기”에서 뭘 배우나요?
Kotlin 리플렉션으로 선언에서 주석 인스턴스를 가져와 보세요. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“실행 중 주석 읽기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.