Java annotation
Spring를 처음 접했을 때 다양한 annotation에 겁부터 먹은게 생각나서 정리를 하고자 한다.
annotation이란 Class나, Method, Parameter.. 등에 메타 데이터를 등록하는것이라 생각하면 된다.
그런데 Spring의 @Transaction이나 Log4j의 @Test 같은 annotation은 특정한 기능(트랜젝션을 건다던가, Test를 수행하게끔 한다던가)을 제공하는 것 처럼 보여서 ... annotation만 있으면 저 기능이 알아서 붙나..싶었다.
나중에 안 사실은 내부에서 Proxy 패턴를 이용하여 지정한 @annotation에 해당 되는 meta data를 가져와서 이를 java의 reflection과 조합하여 마치 @annotation이 특정 기능을 제공하는 것 이였다.
그럼 annotation의 정의는 어떻게 하는 것일까?
(참조 : olc 강좌 중 Java Annotation 기본기 강좌-Demo)
기본으로 @Target, @Retention을 지정 하면 된다.
@Target인 경우에는 어떤 대상에 해당 annotation을 달게 할 것인가에 대한 설정이고
@Retention인 경우에는 어느 범위(Source 단계에서만 참조, compile 단계 까지 참조, Runtime 단계 까지 참조)까지 참조할지 지정하면 된다.
annotation의 메소드 처럼 보이는 value()나 singer() anntation에서 지정하는 메타정보의 속성이라 보면 된다.
default가 없는 경우는 해당 속성을 반드시 지정 해줘야 한다.
중요한건 annotation 선언 및 메타 데이터 지정은 =_=; 겁나 쉽다.
하지만 얻어온 메타 데이터를 어떻게 활용하여, 해당 객체를 어떻게 호출할 것인가..에 대해서는 =_=;; 고민고민이 필요할것 같다.
annotation이란 Class나, Method, Parameter.. 등에 메타 데이터를 등록하는것이라 생각하면 된다.
그런데 Spring의 @Transaction이나 Log4j의 @Test 같은 annotation은 특정한 기능(트랜젝션을 건다던가, Test를 수행하게끔 한다던가)을 제공하는 것 처럼 보여서 ... annotation만 있으면 저 기능이 알아서 붙나..싶었다.
나중에 안 사실은 내부에서 Proxy 패턴를 이용하여 지정한 @annotation에 해당 되는 meta data를 가져와서 이를 java의 reflection과 조합하여 마치 @annotation이 특정 기능을 제공하는 것 이였다.
그럼 annotation의 정의는 어떻게 하는 것일까?
(참조 : olc 강좌 중 Java Annotation 기본기 강좌-Demo)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)public @interface BGM {
public String value() default “None”;
public String singer() default “unknown”;
}
기본으로 @Target, @Retention을 지정 하면 된다.
@Target인 경우에는 어떤 대상에 해당 annotation을 달게 할 것인가에 대한 설정이고
@Retention인 경우에는 어느 범위(Source 단계에서만 참조, compile 단계 까지 참조, Runtime 단계 까지 참조)까지 참조할지 지정하면 된다.
annotation의 메소드 처럼 보이는 value()나 singer() anntation에서 지정하는 메타정보의 속성이라 보면 된다.
default가 없는 경우는 해당 속성을 반드시 지정 해줘야 한다.
중요한건 annotation 선언 및 메타 데이터 지정은 =_=; 겁나 쉽다.
하지만 얻어온 메타 데이터를 어떻게 활용하여, 해당 객체를 어떻게 호출할 것인가..에 대해서는 =_=;; 고민고민이 필요할것 같다.
댓글
댓글 쓰기