Annotation:
。편리한 용도로Boiler Plate 코드를 감소하기 위해Code에 추가적인Metadata정보를 제공하는Java의 기능 중 하나.
▶Java Compiler에게 특정 동작을 지시하거나Runtime시점에서reflection을 통해 특정 기능을 수행할 수 있도록 설정.
。 사용하지 않는 코드도 함께 포함되는 단점이 존재.
。실무에서는 보통클래스에 다량의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를 실행하는 작업을 수행가능.
동적 프록시( Dynamic Proxy ) :java.lang.reflect.Proxy, java.lang.reflect.InvocationHandler
。런타임에서인터페이스 구현체를동적으로 생성해서메소드 호출시점에 원하는 부가로직을 삽입하거나위임
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를 실행.