해당 메서드 코드 :

테스트 코드 통해서 분석
@Test
void getMergedAnnotationAttributesWithConventionBasedComposedAnnotation() {
Class<?> element = ConventionBasedComposedContextConfigClass.class;
String name = ContextConfig.class.getName();
AnnotationAttributes attributes = getMergedAnnotationAttributes(element, name);
assertThat(attributes).as("Should find @ContextConfig on " + element.getSimpleName()).isNotNull();
// Convention-based annotation attribute overrides are no longer supported as of
// Spring Framework 7.0. Otherwise, we would expect "explicitDeclaration".
assertThat(attributes.getStringArray("locations")).as("locations").isEmpty();
assertThat(attributes.getStringArray("value")).as("value").isEmpty();
// Verify contracts between utility methods:
assertThat(isAnnotated(element, name)).isTrue();
}


ConventionBasedComposedContextConfigClass
해당 클래스를 확인해보면
해당 클래스를 location 속성에를 explicitDeclaration 선언한 상태입니다.
@ConventionBasedComposedContextConfig(locations = "explicitDeclaration")
static class ConventionBasedComposedContextConfigClass {
}
locations 속성은 어노테이션을 적용할 때, 관련된 구성 정보(예를 들어, 애플리케이션 컨텍스트 설정 파일이나 리소스)의 위치를 지정하기 위한 문자열 배열입니다.
예를들어
locations 속성은 XML 파일이나 기타 리소스의 경로를 지정
@ContextConfiguration(locations = "classpath:/applicationContext.xml")
아니면 마커 또는 플래그로 이용됩니다.
spring -core 코드를 보면 해당 어노테이션에 locations = "explicitDeclaration" 가 존재합니다.
@ConventionBasedComposedContextConfig(locations = "explicitDeclaration")
static class ConventionBasedComposedContextConfigClass {
}
- 마커(marker):
자바에서는 마커 인터페이스처럼, 아무런 메서드도 포함하지 않고 단순히 어떤 클래스나 요소가 특정 특성을 가진다는 것을 표시하기 위해 사용되는 인터페이스나 어노테이션을 말합니다.
예를 들어, Serializable 인터페이스는 어떤 클래스가 직렬화 가능함을 나타내는 마커 역할을 합니다. - 플래그(flag):
플래그는 코드 내에서 어떤 조건이나 상태를 나타내기 위해 사용되는 신호(일종의 상수 값)입니다.
어떤 동작을 제어하거나 구분할 때 "이 값이 설정되었으면, ~한 동작을 수행하라"와 같이 조건문에서 활용할 수 있습니다.
여기서 explicitDeclaration는 명시적 선언을 한 상황입니다.
해당 인터페스이스를 보면
@ContextConfig
@Retention(RetentionPolicy.RUNTIME)
@interface ConventionBasedComposedContextConfig {
// Do NOT use @AliasFor here
String[] locations() default {};
}
- @ContextConfig
이 어노테이션은 Spring의 컨텍스트 설정과 관련된 어노테이션입니다.
즉, ConventionBasedComposedContextConfig가 Spring 테스트나 애플리케이션 컨텍스트 구성에 관여함을 암시합니다. - @Retention(RetentionPolicy.RUNTIME)
이 어노테이션은 런타임까지 유지되어, 실행 중 리플렉션(reflection)을 통해 해당 어노테이션 정보를 조회할 수 있게 합니다. - 어노테이션 선언 (@interface ConventionBasedComposedContextConfig)
여기서 새 어노테이션 타입인 ConventionBasedComposedContextConfig를 정의합니다.
이 코드는 Spring 컨텍스트 구성과 관련된 사용자 정의 어노테이션으로, locations라는 속성을 통해 구성 정보를 제공할 수 있도록 설계되었으며, 런타임에도 해당 정보가 유지되어 필요한 시점에 리플렉션으로 접근할 수 있도록 되어 있습니다.
여기서 조금더 테스트 코드를 분석해보면 , 어노테이션 속성들을 병합하는 과정입니다,
즉 해당 테스트코드는 어노테이션 속성들을 병합하는 것을 테스트합니다.
AnnotationAttributes attributes = getMergedAnnotationAttributes(element, name);
즉 .어노테이션 속성값 오버라이딩 테스트 코드였습니다.!!

'웹 > Spring' 카테고리의 다른 글
Async 어노테이션 ,@Async 비동기 처리 (0) | 2025.02.19 |
---|---|
@Builder? 와 Bulder 패턴? (0) | 2025.02.12 |
Reflection api GetMethod (0) | 2024.04.20 |
Spring Data JPA - 구성 (0) | 2024.02.25 |
Spring Data JPA- repository 인터페이스의 정의 (0) | 2024.02.18 |