MergedAnnotation

MergedAnnotations

스프링은 메타 어노테이션을 동적으로 안전하게 처리하기 위해, MergedAnnotation과 MergedAnnotations를 사용함

MergedAnnotation

특정 어노테이션의 병합된 메타데이터를 표현하는 단일 객체으로, 어노테이션 속성 값이나 관련 정보를 읽고 병합된 상태를 제공함

MergedAnnotation 인터페이스

// 자바의 모든 어노테이션 인터페이스(@interface)는 Annotation 인터페이스를 자동으로 구현함
public interface MetaAnnotation<A extends Annotation> {

    // 특정 속성 값을 String으로 반환
    String getString(String attributeName) throws NoSuchElementException;

    // 속성이 디폴트 값 외의 값을 가지는지 확인
    boolean hasNonDefaultValue(String attributeName);
    
    // etc methods
}

MergedAnnotations

여러 어노테이션의 메타데이터를 한꺼번에 관리하는 컨테이너 객체로, 특정 클래스나 메서드, 필드 등에 적용된 모든 어노테이션을 관리하는 역할을 함

MergedAnnotation은 그 중 특정 어노테이션을 나타내는 개별 요소임

MergedAnnotations와 MergedAnnotation의 필요성

  • 메타 어노테이션 처리: 어노테이션에 선언된 어노테이션을 메타 어노테이션이라고 하는데, 이를 자동으로 병합해서 처리함
  • 동적 접근: 어노테이션 속성에 동적으로 안전하게 접근할 수 있음
  • 병합 및 캐시를 통한 효율적인 어노테이션 관리

MergedAnnotations 인터페이스

// 자바의 모든 어노테이션 인터페이스(@interface)는 Annotation 인터페이스를 자동으로 구현함 
public interface MergedAnnotations extends Iterable<MergedAnnotations<Annotation>> {

    
    // 특정 어노테이션이 존재하는지 확인
    <A extends Annotation> boolean isPresent(Class<A> annotationType);
    boolean isPresent(String annotationType);
    
    // 직접적으로 적용된 어노테이션인지 확인
    <A extends Annotation> boolean isDirectlyPresent(Class<A> annotationType);
    boolean isDirectlyPresent(String annotationType);

    // 특정 어노테이션을 가져옴
    <A extends Annotation> MergedAnnotation<A> get(Class<A> annotationType);
    <A extends Annotation> MergedAnnotation<A> get(String annotationType);
    
    // static, etc methods
}