0Pricing
Kotlin Academy · 강의

실전 리플렉션

주석을 동적으로 읽습니다

실전 리플렉션은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

주석과 리플렉션의 만남

RUNTIME 유지 정책이 적용된 주석은 리플렉션을 통해 실행 시점에 찾을 수 있습니다. 이 조합은 직렬화기, 유효성 검사기, 의존성 주입을 가능하게 합니다.

이 강의에서는 직접 만든 주석을 동적으로 읽어 봅니다.

클래스 주석 읽기

모든 KClass는 annotations 목록을 제공합니다. 이 목록을 검색하여 특정 유형의 주석을 찾을 수 있습니다.

@Retention(AnnotationRetention.RUNTIME)
annotation class Entity(val table: String)

@Entity("users")
class User

fun main() {
    val ann = User::class.annotations
        .filterIsInstance<Entity>()
        .first()
    println(ann.table)
}

findAnnotation 도우미

findAnnotation 확장 함수는 직접 필터링하는 것보다 간결합니다. 주석 또는 null을 반환합니다.

import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Entity(val table: String)

@Entity("orders")
class Order

fun main() {
    val ann = Order::class.findAnnotation<Entity>()
    println(ann?.table)
}

속성에 적용된 주석

속성에는 자체 주석이 포함될 수 있습니다. memberProperties를 순회하며 각 속성의 annotations를 검사합니다.

import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Column(val name: String)

class Product(@Column("product_id") val id: Int, val title: String)

fun main() {
    Product::class.memberProperties.forEach { prop ->
        val col = prop.findAnnotation<Column>()
        if (col != null) println(prop.name + " -> " + col.name)
    }
}

간단한 직렬화기 만들기

속성 읽기와 주석을 결합하여 출력을 생성합니다. 여기서는 각 속성을 key=value 문자열로 매핑하고, 열 이름이 있으면 해당 이름을 사용합니다.

import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Column(val name: String)

class Item(@Column("item_id") val id: Int, val name: String)

fun main() {
    val item = Item(7, "Book")
    val parts = Item::class.memberProperties.map { p ->
        val key = p.findAnnotation<Column>()?.name ?: p.name
        key + "=" + p.getter.call(item)
    }
    println(parts.joinToString(", "))
}

표시 주석으로 건너뛰기

표시 주석으로 무시할 속성을 지정할 수 있습니다. hasAnnotation으로 해당 주석의 존재 여부를 확인합니다.

import kotlin.reflect.full.memberProperties
import kotlin.reflect.full.hasAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Transient2

class Account(val id: Int, @Transient2 val secret: String)

fun main() {
    Account::class.memberProperties
        .filterNot { it.hasAnnotation<Transient2>() }
        .forEach { println(it.name) }
}

주석 인수 읽기

주석 인스턴스를 가져오면 그 매개변수는 일반적인 속성입니다. 필드를 읽는 것처럼 읽으면 됩니다.

import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Validated(val min: Int, val max: Int)

@Validated(min = 1, max = 100)
class Quantity

fun main() {
    val v = Quantity::class.findAnnotation<Validated>()!!
    println("range " + v.min + ".." + v.max)
}

함수에 적용된 주석

함수에도 주석을 적용하고 검사할 수 있습니다. 프레임워크는 이를 사용하여 처리기를 찾습니다. 예를 들어 테스트 실행기는 테스트 메서드를 찾습니다.

import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Route(val path: String)

class Api {
    @Route("/home")
    fun home() = "home page"
}

fun main() {
    Api::class.memberFunctions.forEach { f ->
        f.findAnnotation<Route>()?.let { println(f.name + " @ " + it.path) }
    }
}

동작 실행하기

경로 주석을 읽고 실제로 호출을 전달합니다. 이것이 경로 지정 프레임워크가 작동하는 핵심 원리입니다.

import kotlin.reflect.full.memberFunctions
import kotlin.reflect.full.findAnnotation

@Retention(AnnotationRetention.RUNTIME)
annotation class Route(val path: String)

class Api {
    @Route("/ping")
    fun ping() = "pong"
}

fun main() {
    val api = Api()
    val target = "/ping"
    Api::class.memberFunctions.forEach { f ->
        if (f.findAnnotation<Route>()?.path == target) {
            println(f.call(api))
        }
    }
}

실제 활용 사례

주석 기반 리플렉션은 다음과 같은 여러 라이브러리의 기반이 됩니다.

  • JSON 직렬화: 필드를 키에 매핑
  • 유효성 검사: 제약 조건 적용
  • 경로 지정: 경로를 처리기에 연결
  • 의존성 주입: 구성 요소 연결

범위를 제한하여 사용하기

리플렉션은 초기 설정이나 한 번 또는 드물게 실행되는 프레임워크 코드에 한정하는 것이 가장 좋습니다. 가능하면 결과를 캐시하세요. 요청마다 실행되는 빈번한 경로에서는 컴파일 시점 처리를 우선하세요.

빠른 확인

실용적인 리플렉션 사용에 대한 이해도를 확인해 보세요.

복습

주석과 리플렉션을 결합하여 다음을 수행하는 방법을 배웠습니다.

  • 클래스, 속성, 함수의 주석 찾기
  • 실행 시점에 주석 인수 읽기
  • 간단한 직렬화기와 경로 전달기 만들기
  • 표시 주석이 있는 필드 건너뛰기

실제 프레임워크는 이러한 방식으로 만들어집니다.

자주 묻는 질문

“실전 리플렉션” 강의는 무료인가요?

네 — “실전 리플렉션” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“실전 리플렉션”에서 뭘 배우나요?

주석을 동적으로 읽습니다 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“실전 리플렉션” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 주석 사용하기
  2. 주석 정의하기
  3. 리플렉션 기초
  4. 실전 리플렉션
← Kotlin Academy(으)로 돌아가기