Annotation:
。Boiler Plate 코드를 감소하기 위해소스코드에 추가적인Metadata정보를 제공하는Java의 기능
▶Java Compiler에게 특정 동작을 지시하거나Runtime시점에서reflection을 통해 특정 기능을 수행할 수 있도록 설정.
。어노테이션은 일종의주석으로서,주석은프로그램 실행시 제거되지만,@Retention을 통해 유지할 수 있음.
。 사용하지 않는 코드도 함께 포함되는 단점이 존재.
。실무에서는 보통클래스에 다량의Annotation을 선언해야하는 경우Abstract Class에 집중적으로 선언 후자식클래스에서 상속 시 해당Annotation을 동일하게 상속
。코드의 가독성을 증진하고 자동화된 기능을 제공하며 기본내장 Annotation뿐만 아닌, 사용자가 직접커스텀하여 원하는 기능을 추가한어노테이션을 정의가능
。@기호로 시작하여Class,Method,Field,매개변수등에 적용.
Java Reflection
。구체적인Class type을 알지 못해도 해당클래스의메소드 , type , 변수에 접근할 수 있도록 하는JAVA API
。Compile시점이아닌Runtime에서Field,Method,Constructor,Class등의 정보를 동적으로 분석 및 조작하는 기능.
▶ 실행중에Class의 구조를 분석하고, instance를 생성하거나 Method를 호출할 수 있도록하는 기술.
。Reflection을 사용 시java.lang.Class를 통해Class Metadata를 가져오고, 동적으로Class 객체를 생성하거나Field value를 변경하거나Method를 실행하는 작업을 수행가능.
。JDK 동적 프록시는 해당Java Reflection을 기반으로 개발됨
Meta Annotation종류
。직접 사용자가 정의한커스텀 어노테이션을 생성하는 목적의Annotation
@Retention(RetentionPolicy.정책)
。Annotation의RetentionPolicy를 지정하는 역할의 Annotation
▶Annotation을 정의하는java파일의@interface앞에 선언.
。주로어노테이션의 동작시점을 결정하는 역할로 사용
@Retention(RetentionPolicy.SOURCE):
。컴파일시 해당어노테이션이 제거.
ex)@Override
@Retention(RetentionPolicy.CLASS):
。컴파일후에도Class파일에는 남아있지만,런타임시점에서는 사용불가.
@Retention(RetentionPolicy.RUNTIME):
。컴파일후런타임시점까지도 유지되며,Java Reflection을 통해 접근
@Target(ElementType.대상)
。해당 커스텀Annotation이 적용될 수 있는대상( ex.method,클래스등 )을 지정.
▶ 아래ElementType.대상외에도 Package 등에도 적용 가능.
@Target(ElementType.METHOD):
。커스텀 Annotation이Method에만 선언되도록 설정.
@Target(ElementType.FIELD):
。커스텀 Annotation이Field에만 선언되도록 설정
@Target(ElementType.TYPE):
。커스텀 Annotation이Class,Interface,enum에만 선언되도록 설정.
@Inherited
。해당 커스텀Annotation이 자식 Class에 자동으로 상송되도록 지정.
@Documented
。Annotation이Javadoc문서에 포함되도록 지정.
커스텀 어노테이션생성
@Retention(RetentionPolicy.RUNTIME):
。선언된커스텀 Annotation이컴파일뿐만아닌런타임에도 유지되어Java reflection에 의해 접근되도록 설정
@Target(ElementType.METHOD):
。선언된 커스텀 Annotation이 Method에서만 선언되도록 적용.import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; // 선언된 커스텀 Annotation이 Method에서만 선언되도록 적용. @Target(ElementType.METHOD) // 선언된 커스텀 Annotation이 Compile 뿐만아닌 Runtime에도 유지되어 java reflection에 의해 접근되도록 설정 @Retention(RetentionPolicy.RUNTIME) public @interface Tracktime {}@Pointcut("@annotation(com.wjdtn747.rest.webservices.aop_practice.aspects.Tracktime)") public void TracktimePointcut(){}▶ 해당
Annotation을Pointcut으로 활용 가능.// @Pointcut Method 경로를 pointcut으로 설정하여 해당 Annotation에 접근 @Before("com.wjdtn747.rest.webservices.aop_practice.aspects.CommonPointcutConfig.TracktimePointcut()") public void logMethodCall(JoinPoint joinPoint){ // Advice 부분 logger.info("logMethodCalled - {}",joinPoint); }▶ 이후 해당 Custom
Annotation이 선언된 Method가 호출되기전에 이를Pointcut에 의해 intercept하여 해당@Before(AspectJ Pointcut)이 선언된 Method를 실행.