JAVA - Annotation / Java Reflection / @Target , @Retention , @Inherited

TopOfTheHead·2025년 7월 26일

자바 ( JAVA )

목록 보기
8/24

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.정책)
AnnotationRetentionPolicy를 지정하는 역할의 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) :
    커스텀 AnnotationMethod에만 선언되도록 설정.

  • @Target(ElementType.FIELD) :
    커스텀 AnnotationField에만 선언되도록 설정

  • @Target(ElementType.TYPE) :
    커스텀 AnnotationClass , Interface , enum에만 선언되도록 설정.

@Inherited
。해당 커스텀 Annotation이 자식 Class에 자동으로 상송되도록 지정.

  • @Documented
    AnnotationJavadoc 문서에 포함되도록 지정.

커스텀 어노테이션 생성
@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(){}

▶ 해당 AnnotationPointcut으로 활용 가능.

          // @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를 실행.

profile
공부기록 블로그

0개의 댓글