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

TopOfTheHead·2025년 7월 26일

자바 ( JAVA )

목록 보기
8/28

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.정책)
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개의 댓글