낭만개발자

[Spring] Custom Annotation - Meta Annotation 본문

카테고리 없음

[Spring] Custom Annotation - Meta Annotation

낭만개발자 2026. 6. 10. 05:18

Java의 annotation은 크게 두 가지로 나눌 수 있다. 

 

1. Built - In Annotation

    - Java코드에 직접 적용되는 annotation

    - @Override, @Deprecated, @SuppressWarnings, ...

 

2. Meta Annotation

    - 다른 annotation에 적용되기 위한 annotation

    - @Retention, @Target, @Inherited, ...

 

이 중, Meta Annotation에 대해 알아보겠다. 

 

 

Meta Annotation

 

@Retention

 

사전적 정의 : (noun) 보유, 유지 

 

즉, annotation의 라이프사이클을 정하는 메타데이터이다. 

해당 annotation정보를 어느 범위까지 유지할 것인지에 따라 다음 세 가지 RetentionPolicy Enum값을 정의해두었다. 

 

SOURCE

컴파일 전까지만 유효하며, 컴파일 이후에는 사라진다. (즉, .java 파일까지만 유효)

@Override

@Override역시 Retention값이 SOURCE로 되어 있음을 확인할 수 있는데, 

해당 메타데이터는 컴파일 타임에 오류를 검출하는 용도로만 쓰고, 프로그램 실행(런타임) 단계에서는 전혀 필요 없는 정보이기 때문이다. 

 

@Getter

롬북의 @Getter역시 마찬가지.

컴파일러가 .java파일을 읽을 때, @Getter를 발견하면 해당 필드에 Getter메서드를 자동으로 생성 후 바이트 코드에 주입한다. 

런타임 시점에는 필요가 없어진 셈. 

 

 

CLASS

컴파일러가 클래스를 참조할 때까지 유효함

 

RUNTIME 

Reflection API를 활용하여, 컴파일 이후에도 JVM에 의해 계속 참조가 가능함

즉, 런타임 환경까지 유지되는 정보이다.

@Component

@Component가 RUNTIME으로 선언된 이유는, 스프링 프레임워크가 어플리케이션 실행하는 환경에서 해당 annotation을 감지하고 Bean을 생성하기 때문이다. 

어플리케이션 구동 시 스프링은 @ComponentScan을 통해 패키지를 스캔하고, Reflection API를 통해 메모리에 로드된 클래스를 조사하여 @Component가 붙은 클래스를 찾을 수 있는 것. 

 


@Target

annotation 이 사용되는 위치를 결정하는 메타데이터다. 

다음과 같이 선언되어 있다. 

 

신기한 점은, Target 어노테이션도 @Retention값이 RUNTIME으로 설정되어 있다. 

@Target은 컴파일러가 사용하는 정봉인데, RUNTIME일 필요가 있나? SOURCE로 충분할 것 같은데? 

라고 생각했었다.

 

하지만 그렇지 않다.

 

@Target 정보는 컴파일 시점 뿐 아니라, 런타임 시점에도 활용될 수 있다. 

스프링은 Reflection API 를 사용하여 클래스, 메서드, 필드 등에 적용된 annotation정보를 동적으로 조회하고 처리한다. 

 

예를 들어, 런타임에 객체를 스캔하면서 특정 annotation이 올바른 위치에 선언되었는지 확인하거나, 
그에 따라 의존성 주입, 보안 검사, 트랜젝션 처리 등의 기능을 수행할 수 있다. 

 

이를 가능케 하기 위해서는 클래스의 바이트코드가 메모리에 로드된 후에도 annotaion 메타데이터가 유지되어야 한다. 

 

 

@Target의 설정값인 ElementType은 다음 Enum값들로 선언되어 있다. 

  • PACKAGE : 패키지
  • TYPE : 클래스, 인터페이스, Enum 또는 Record
  • FIELD : 변수(필드)
  • METHOD : 메서드
  • PARAMETER : 메서드 파라미터
  • CONSTRUCTOR : 생성자
  • ANNOTATION_TYPE : 어노테이션
  • … 등등