2025.04.05 - [웹/Spring] - Spring core 오픈소스 분석 01 -AnnotatedElementUtils getMergedAnnotationAttributes

Spring core 오픈소스 분석 01 -AnnotatedElementUtils getMergedAnnotationAttributes

해당 메서드 코드 : 테스트 코드 통해서 분석 @Testvoid getMergedAnnotationAttributesWithConventionBasedComposedAnnotation() { Class element = ConventionBasedComposedContextConfigClass.class; String name = ContextConfig.class.getName(); Ann

kwaksh2319.tistory.com

지난번에 이어서 테스트코드를 먼저 확인해보자 .

@Test
void getMergedAnnotationAttributesWithHalfConventionBasedAndHalfAliasedComposedAnnotationV1() {
			Class<?> clazz = HalfConventionBasedAndHalfAliasedComposedContextConfigClassV1.class;
			String name = ContextConfig.class.getName();
			String simpleName = clazz.getSimpleName();
			AnnotationAttributes attributes = getMergedAnnotationAttributes(clazz, name);

			assertThat(attributes).as("Should find @ContextConfig on " + simpleName).isNotNull();
			assertThat(attributes.getStringArray("locations")).as("locations for class [" + simpleName + "]")
				.containsExactly("explicitDeclaration");
			assertThat(attributes.getStringArray("value")).as("value for class [" + simpleName + "]")
				.containsExactly("explicitDeclaration");

			// Verify contracts between utility methods:
			assertThat(isAnnotated(clazz, name)).isTrue();
}

 
이번엔

HalfConventionBasedAndHalfAliasedComposedContextConfigClassV1

클래스를 리플랙션 클래스에가져왓다. 

Class<?> clazz = HalfConventionBasedAndHalfAliasedComposedContextConfigClassV1.class;

여기서도 마찬가지로 

String name = ContextConfig.class.getName();
String simpleName = clazz.getSimpleName();
AnnotationAttributes attributes = getMergedAnnotationAttributes(clazz, name);

속성값들을 합칩니다. 
 
그러면 여기서 궁금할꺼다. 
getMergedAnnotationAttributes의 spring framework에서의 역할이다.
 
언재 사용하는걸까? 이것저것 찾아보니 어노테이션 커스텀하는경우 이용을 한다고 합니다.
 
예제로 간단히 코드로 보겠습니다. 

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@BaseAnnotation("defaultBase")
public @interface CustomConfig {
    // 운영 환경, 로깅 레벨, 캐시 지속시간 등 필요한 옵션 추가
    String env() default "prod";
    int cacheDuration() default 300;
}

 

@Component
public class BusinessService {

    public void performBusinessLogic() {
        // 현재 클래스 및 메소드에 대한 병합된 애너테이션 속성 조회
        AnnotationAttributes attributes = AnnotatedElementUtils.getMergedAnnotationAttributes(this.getClass(), CustomConfig.class);
        if (attributes != null) {
            String env = (String) attributes.get("env");
            int cacheDuration = (Integer) attributes.get("cacheDuration");
            // env에 따른 로직 분기 또는 캐싱 로직 초기화
            System.out.println("Running in environment: " + env + ", Cache duration: " + cacheDuration);
        }
        // 실제 비즈니스 로직 실행
    }
}

 예제를 보시면 prod 환경의 케싱 유지시간의 커스텀 어노테이션을 만들었습니다.
 

+ Recent posts