자동 구성 기반 애플리케이션 @AutoConfiguration (메타 애노테이션)

Sol's·2023년 5월 28일
0

토비의 스프링 부트

목록 보기
15/31

@AutoConfiguration를 잘 이해하려면 스프링 부트가 애노테이션을 활용할때 사용하는 기법을 잘 이해하고,
코드도 살펴보고, 응용하는 방법을 잘 알아야 합니다.

메타 애노테이션

meta-annotation 은 다른 annation 에서도 사용되는 annotation 의 경우를 말하며 custom-annotation 을 생성할 때 주로 사용됩니다.
적용되는 메타어노테이션은 ElementType.ANNOTATION_TYPE를 사용해야 적용 될수 있습니다.
@Target@Retention을 설정해야 합니다.

예를 들어, @Service 은 bean 으로 등록해주기 위해 @Component 을 내포하고 있는 형태로, 여기서 @Component 가 meta-annotation 입니다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // Spring will see this and treat @Service in the same way as @Component
public @interface Service {

// ....
}

Custom-Annotation

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Test
    @interface UnitTest {

    }
  
  	public class HelloServiceTest {
	@UnitTest
    void simpleHelloService_unit_test() {
        SimpleHelloService helloService = new SimpleHelloService();

        String ret = helloService.sayHello("Test");
        Assertions.assertThat(ret).isEqualTo("Hello Test");
    	}
	}

이런 meta-annotaion 중 @Target@Retention 에 대해서 알아보도록 하겠습니다.

@Target

@Target 은 Java compiler 가 annotation 이 어디에 적용될지 결정하기 위해 사용합니다.
@Service 의 ElementType.TYPE 은 해당 Annotation 은 타입 선언 시 사용한다는 의미입니다.

종류

ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언

@Retention

@Retetion 은 Annotation 이 실제로 적용되고 유지되는 범위를 의미합니다.

종류

RetentionPolicy.RUNTIME
RetentionPolicy.CLASS
RetentionPolicy.SOURCE

RetentionPolicy.RUNTIME 은 컴파일 이후에도 JVM 에 의해서 계속 참조가 가능합니다. 주로 리플렉션이나 로깅에 많이 사용됩니다.
RetentionPolicy.CLASS 은 컴파일러가 클래스를 참조할 때가지 유효합니다.

RetentionPolicy.SOURCE 은 컴파일 전까지만 유효합니다. 즉, 컴파일 이후에는 사라지게 됩니다.

장점

메타 어노테이션을 만들면, 개발자가 어노테이션을 보고 기능을 분류하기 쉬워집니다.

합성 애노테이션 (Compose Annotation)

애노테이션을 합쳐놓은 것입니다.
하지만 합쳐놓는것을 나열하다보면 코드가 지져분해집니다.
이때 애노테이션을 합성해서 만들 수 있습니다.
ex) @RestController

profile
배우고, 생각하고, 행동해라

0개의 댓글