애노테이션을 나타내주는 가장 좋은 단어는 메타데이터(자신의 정보를 담고있는 데이터)로 자바 애노테이션은 코드메타데이터이다
애노테이션은 코드 그 자신에 대한 정보를 담고 있다. 애노테이션은 패키지, 클래스, 메소드, 변수, 매개변수 등에서 사용될 수 있으며 자바8부터는 코드의 거의 모든 부분에서 사용될 수 있다. 이는 타입 애노테이션으로 불려진다
애노테이션이 적용된
코드
는 직접적으로 그들의애노테이션
으로부터 영향을 받지는 않고 단지 서드 시스템에 그것(주석)에 대한 정보를 제공한다애노테이션은 런타임에 활용할 수 있기도 하며, 단지 소스레벨에서만 사용 가능하게 만들수 도 있다
자바의 XML을 파싱(분석)할 수 있게 도와주는 라이브러리로 JAXB가 있다. JAXB는 XML과 자바 클래스를 바인딩(연결)한다. 다시 말해 간단한 명령어만으로 클래스에 파싱된 XML을 대입해주는 라이브러리이다
기존의 XML 분석 방법은 XML 전체를 String 형식으로 받아와서 문자열을 자르는 방식(substring)이었다.
JAXB는 원하는 태그명, 어트리뷰트명을 기입한 클래스를 마련해두기만 하면 자동적으로 값이 클래스에 들어오게 되는 자동화 라이브러리이다
자바의 Reflection은 JVM에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정할 수 있는 기능이 필요한 프로그램에서 사용된다
즉, 클래스의 구조를 개발자가 확인할 수 있고, 값을 가져오거나 메소드를 호출하는데 사용된다
Reflection을 사용하는 기술 : 스프링 프레임워크, 대표적 ORM 기술인 하이버네이트, jackson라이브러리 등에 사용된다
자바 리플렉션 api는 여러가지 메소드를 포함하고, 이 메소드들은 런타임에 클래스, 메소드 등으로부터 애노테이션 정보를 얻을 수 있게 한다. 이를 통해 스프링 같은 서드파이 프레임워크가 클래스들을 조작할 수 있게 된다
이런 메소드들을 포함한 인터페이스가 AnnotatedElement이며 대표적인 예시는 아래와 같다
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()
의 사용을 확인 할수 있다