에노테이션이 필요한 이유

만약 프로그램 실행 중에 읽어서 사용할 수 있는 주석이 있다면 어떨까? 이것이 바로 애노테이션이다.

참고로 애노테이션은 프로그램 코드가 아니다.

예제에서 애노테이션이 붙어있는 home() , page1() 같은 코드를 호출해도 프로그램에는 아무런 영향을 주지 않는다.

마치 주석과 비슷하다고 이해하면 된다. 다만 일반적인 주석이 아니라, 리플렉션 같은 기술로 실행 시점에 읽어서 활용할 수 있는 특별한 주석이다.

애노테이션은 컴파일러나 런타임에서 해석될 수 있는 메타데이터를 제공한다.

즉, 애노테이션은 코드에 메모를 달아놓는 것처럼 특정 정보나 지시를 추가하는 도구로, 코드에 대한 메타데이터를 표현하는 방법이다.

예제

@Retention(RetentionPolicy.RUNTIME)
public @interface SimpleMapping {
	 String value();
}

===

Class<? extends TestController> aClass = testController.getClass();
for (Method method : aClass.getDeclaredMethods()) {
	 **SimpleMapping simpleMapping = method.getAnnotation(SimpleMapping.class);**
	 if (simpleMapping != null) {
			 System.out.println("["+simpleMapping.value() + "] -> " + method);
		}
}

에노테이션 정의

@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoElement {
		 String value();
		 
		 int count() default 0;
		 String[] tags() default {};
		 
		 //MyLogger data(); // 다른 타입은 적용X
		 Class<? extends MyLogger> annoData() default MyLogger.class; // 클래스 정보는 가능
}

===

@AnnoElement(value = "data", count = 10, tags = {"t1", "t2"})
public class ElementData1 {

	1. 입력 요소가 하나인 경우 value 키워드 생략 가능
	2. 배열의 항목이 하나인 경우 {} 생략 가능
	3. default 항목은 생략 가능
}

===

Class<ElementData1> annoClass = ElementData1.class;
AnnoElement annotation = annoClass.getAnnotation(AnnoElement.class);


메타 애노테이션

애노테이션을 정의하는데 사용하는 특별한 애노테이션을 메타 애노테이션이라 한다

@Retention