Annotation-애노테이션_2

구름코딩·2020년 10월 10일
0

java8 _ 더 자바

목록 보기
20/23
post-custom-banner

애노테이션을 나타내주는 가장 좋은 단어는 메타데이터(자신의 정보를 담고있는 데이터)로 자바 애노테이션은 코드메타데이터이다

애노테이션은 코드 그 자신에 대한 정보를 담고 있다. 애노테이션은 패키지, 클래스, 메소드, 변수, 매개변수 등에서 사용될 수 있으며 자바8부터는 코드의 거의 모든 부분에서 사용될 수 있다. 이는 타입 애노테이션으로 불려진다

애노테이션이 적용된 코드는 직접적으로 그들의 애노테이션으로부터 영향을 받지는 않고 단지 서드 시스템에 그것(주석)에 대한 정보를 제공한다

애노테이션은 런타임에 활용할 수 있기도 하며, 단지 소스레벨에서만 사용 가능하게 만들수 도 있다

애노테이션 Consumers

  • 시스템이나 서드파티 애플리케이션(스프링 등)으로서 애노테이션이 적용된 코드를 애노테이션 정보로 부터 의존적인 여러가지 행동을 취한다
  • 예)
    • 자바 빌트인 애노테이션의 경우에는 Consumer는 JVM이며 애노테이션이 적용된 코드를 실행한다
    • 사용자 정의 애노테이션의 경우에는 Consumer로 JUnit, spring등이 있다

사용 목적

  • 컴파일러를 위한 정보 제공 : Java8 @FunctionalInterface, @SuppressWarnings()
  • 자동 문서 작성 : generate reports automatically like Jenkins, Jira or Teamcity
  • 코드 자동 생성 : A good example of this is JAXM library
  • 런타임 프로세싱 : testing (Junit), dependency injection (Spring), logging (Log4), data access (Hibernate) etc

JAXM Library

자바의 XML을 파싱(분석)할 수 있게 도와주는 라이브러리로 JAXB가 있다. JAXB는 XML과 자바 클래스를 바인딩(연결)한다. 다시 말해 간단한 명령어만으로 클래스에 파싱된 XML을 대입해주는 라이브러리이다

기존의 XML 분석 방법은 XML 전체를 String 형식으로 받아와서 문자열을 자르는 방식(substring)이었다.
JAXB는 원하는 태그명, 어트리뷰트명을 기입한 클래스를 마련해두기만 하면 자동적으로 값이 클래스에 들어오게 되는 자동화 라이브러리이다

Java 8에서의 애노테이션

  • 애노테이션 프레임워크

@Repeatable

@FunctionalInterface

Retrieving 애노테이션

자바 리플렉션 API

자바의 Reflection은 JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용된다
즉, 클래스의 구조를 개발자가 확인할 수 있고, 값을 가져오거나 메소드를 호출하는데 사용된다
Reflection을 사용하는 기술 : 스프링 프레임워크, 대표적 ORM 기술인 하이버네이트, jackson라이브러리 등에 사용된다

자바 리플렉션 api는 여러가지 메소드를 포함하고, 이 메소드들은 런타임에 클래스, 메소드 등으로부터 애노테이션 정보를 얻을 수 있게 한다. 이를 통해 스프링 같은 서드파이 프레임워크가 클래스들을 조작할 수 있게 된다

이런 메소드들을 포함한 인터페이스가 AnnotatedElement이며 대표적인 예시는 아래와 같다

  • getAnnotations() : 주어진 요소가 갖고있는 모든 애노테이션을 배열로 가져온다
  • isAnnotationPresent(annotation) : 해당 요소(element)가 애노테이션을 갖고 있는지 체크한다
  • getAnnotation(class) : 매개변수로 넘겨진 해당 요소에 대한 단일 애노테이션을 갖고온다
public class Annotations {
    public static void main(String[] args) {
        Class<Annotations> object = Annotations.class;
        //해당 클래스로부터 모든 애노테이션을 가져온다
        Annotation[] annotations = object.getAnnotations();
        for (Annotation anno : annotations)
            System.out.println(anno);

        //애노테이션이 존재하는지 체크
        if (object.isAnnotationPresent(Chicken.class)) {
            //원하는 요소의 애노테이션을 가져온다
            Annotation annotation = object.getAnnotation(Chicken.class);
            System.out.println(annotation);
        }

        //클래스내에 있는 모든 메소드들에 대해 애노테이션을 확인
        for (Method method : object.getDeclaredMethods()) {
            if (method.isAnnotationPresent(Chicken.class)) {
                Annotation annotation = method.getAnnotation(Chicken.class);
                System.out.println(annotation);
            }
        }
    }
}

위 코드에서 주어진 메소드나 클래스에 대해 모든 애노테이션을 retrieve하기 위해 getAnnotations() 메소드의 사용법을 볼수 있다. 또한, 구체적인 애노테이션의 존재여부 및 retrieve하기 위해 isAnnotationPresent()getAnnotation()의 사용을 확인 할수 있다

profile
내꿈은 숲속의잠자는공주
post-custom-banner

0개의 댓글