@Target, @Retention에 대하여

이재윤·2024년 12월 4일
0

AOP

목록 보기
1/2

1) @Target

  • @Target은 AOP의 커스텀 어노테이션이 적용될 대상을 지정하는
    enum 값입니다.

(1) 사용 예시

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface DistributedLock {
 ...
}

(2) ElementType 종류

public enum ElementType {
    /** 클래스, 인터페이스, 열거형 또는 레코드의 선언을 나타냅니다. */
    TYPE,

    /** 필드 선언을 나타내며, 열거형 상수도 포함됩니다. */
    FIELD,

    /** 메소드 선언을 나타냅니다. */
    METHOD,

    /** 형식 매개변수 선언을 나타냅니다.  */
    PARAMETER,

    /** 생성자 선언을 나타냅니다.  */
    CONSTRUCTOR,

    /** 로컬 변수 선언을 나타냅니다.  */
    LOCAL_VARIABLE,

    /** 주석 인터페이스의 선언을 나타냅니다. */
    ANNOTATION_TYPE,

    /** 패키지 선언을 나타냅니다. */
    PACKAGE,

    /**
     * 형식 매개변수 선언을 나타냅니다. 
     *
     * @since 1.8
     */
    TYPE_PARAMETER,

    /**
     * 타입을 사용하는 부분을 나타냅니다. 
     *
     * @since 1.8
     */
    TYPE_USE,

    /**
     * Java 8에 도입된 모듈 선언을 나타냅니다. 
     *
     * @since 9
     */
    MODULE,

    /**
     * Java 14에 도입된 레코드의 선언을 나타냅니다. 
     */
    RECORD_COMPONENT;
}

2) @Retention

  • 커스텀 애노테이션의 생성에서 해당 애노테이션이 선언된 대상(@Target의 속성값)의 메모리를 언제까지 유지 할 것인지 결정하는 애노테이션입니다.

  • RetentionPolicy에는 크게 SOURCE, CLASS, RUNTIME 3가지가 존재합니다.

(1) RetentionPolicy.SOURCE
-자바 컴파일러(=javac)가 자바코드를 컴파일 할때,
해당 애노테이션의 메모리를 버림

(2) RetentionPolicy.CLASS

  • 컴파일러가 해당 애노테이션의 메모리를 유지하여 컴파일하지만,
    실질적으로 JVM이 바이트코드를 해석해서 동작하는
    Runtime단계에선 해당 메모리를 버린다
    -> but, 클래스파일에는 코드가 존재

(3) RetentionPolicy.RUNTIME

  • JVM이 실제 클래스의 자바 바이트코드를 해석해서 동작하는
    Runtime단계에서 메모리가 유지되고,
    Runtime이 종료되면 메모리도 사라진다.
    -> Runtime 단계에서는 Reflection API로 어노테이션 정보를 조회한다.

참고 자료:
(1) [Java] @Retention, @Target에 대하여(https://dev-gyus.github.io/java/2021/03/11/Retention-Target.html)

(2) 아무 관심 없던 @Retention 어노테이션 정리(RetentionPolicy SOURCE vs CLASS vs RUNTIME)
출처: https://jeong-pro.tistory.com/234 기본기를 쌓는 정아마추어 코딩블로그:티스토리

0개의 댓글