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
}