이 글은 기존 운영했던 WordPress 블로그인 PyxisPub: Development Life (pyxispub.uzuki.live) 에서 가져온 글 입니다. 모든 글을 가져오지는 않으며, 작성 시점과 현재 시점에는 차이가 많이 존재합니다.
작성 시점: 2017-10-20
이제 마지막으로 Reflection을 이용한 간단한 어노테이션을 만들어보려고 한다.
먼저 데이터 클래스를 하나 만든다.
data class Contact(val id: Int, val name: String, val email: String)
그리고 만들 어노테이션에 대해 생각해보자.
여기서는 음... @Table 라고 적으면 저 데이터 클래스가 자동으로 데이터베이스의 한 테이블로서 들어가는 기능을 만들 것이다.
Kotlin 에서 어노테이션을 만드는 방법은 class 앞에 annotation
을 붙여주면 된다.
annotation class Table(val name: String)
내친 김에 하나 더 만들면, 데이터 클래스에 있는 각각의 필드를 테이블의 요소로서 집어넣을 수 있을 것이다.
annotation class Field(val name: String)
그런데 이렇게 하면 문제가 있다.
@Table("ContactTable")
@Field("Contact")
data class Contact(val id: Int, @Field("name") val name: String, @Field("email") val email: String)
이런 식으로, 분명히 Contact는 클래스인데 Field 를 선언할 수 있게 하면 분명히 버그가 날 것이다.
그래서 annotation class 에 추가적으로 달 수 있는 어노테이션이 있다.
쓰는 방법은 아래와 같다.
@Target(AnnotationTarget.CLASS)
annotation class Table(val name: String)
여러개의 제한을 두고 싶다면 ,(쉼표)로 이으면 된다.
Kotlin 에서는 기본적으로 런타임 상과 코드 상에서 둘 다 가능하지만 @Retention
으로 설정할 수 있다.
@Repeatable
로 어노테이션을 반복해서 쓸 수 있다.
@MustBeDocumented
로 문서에 반드시 정의되게 할 수 있다.