@Target, @Retention

    Spring 에서는 Annotation 사용에 대한 기능을 상당히 많이 제공하고 있습니다.

    주로 사용하는 @Controller, @Service, @Repository 등 많은 Annotation 이 존재한다.

    해당 Annotion 은 각 기능에 필요한 만큼 많은 기능을 내포하고 있으며, 내용을 잘 알지 못해도 필요한 기능만 쉽게 사용할 수 있도록 제공되어 진다.

    하지만, 이러한 Annotation 에 대해 불필요한 내용이 포함되거나 필요한 내용이 있는 경우 Custom 을 할 경우가 존재한다.

    그 중 로깅 등 AOP 설정할 때 주로 사용되는 @Target 과 @Retention 에 대해 알아보자.

     

    meta-annotaiton ?

    meta-annotation 은 다른 annotation 에서도 사용되는 annotation 의 경우를 말하며 custom-annotation 을 생성할 때 주로 사용된다.

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

     

    @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 이 실제로 적용되고 유지되는 범위를 의미한다.

    Policy 에 관련된 Annotation 으로 컴파일 이후에도 JVM 에서 참조가 가능한 RUNTIME 으로 지정한다.

    종류는 다음과 같다.

    RetentionPolicy.RUNTIME
    RetentionPolicy.CLASS
    RetentionPolicy.SOURCE

    RetentionPolicy.RUNTIME 은 컴파일 이후에도 JVM 에 의해서 계속 참조가 가능합니다. 주로 리플렉션이나 로깅에 많이 사용된다.

    RetentionPolicy.CLASS 은 컴파일러가 클래스를 참조할 때까지 유효하다.

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

     

    --> 해당 interface가 캡슐화 및 ISP(인터페이스 분리 원칙)이 잘 되어 있기 때문에 필요한 기능만 사용가능하다.

    'SPRING' 카테고리의 다른 글

    Bean Validation - 3  (0) 2023.12.20
    Bean Validation - 2(스프링 적용)  (1) 2023.12.20
    Bean Validation - 1  (0) 2023.12.19
    @PostConstruct, @preDestroy  (0) 2023.09.26
    간단한 Calc 만들기  (0) 2023.09.12

    댓글