리플렉션 서블릿은 요청 URL과 메서드 이름이 같다면 해당 메서드를 동적으로 호출 할 수 있다. 하지만 요청 이름과 메서드 이름을 다르게 하고 싶다면 어떻게해야할까? 또한 / , /favicon.ico, /home-new 같은 URL들을 처리할 수가 없는데 어떻게 해야할까?
따라서 추가 정보를 코드 어딘가에 적어두고 읽을 수 있는 수단이 필요하다. 그게 바로 애노테이션이다.
애노테이션은 프로그램 실행 중에도 사용할 수 있는 주석
@Retention(RetentionPolicy.RUNTIME)
public @interface SimpleMapping {
String value();
}
public class TestController {
@SimpleMapping("/")
public void home() {
System.out.println("TestController.home");
}
@SimpleMapping("/site1")
public void page1() {
System.out.println("TestController.page1");
}
}
애노테이션은 프로그램 코드가 아니다. 위 코드처럼 home(), page1() 같은 코드를 호출해도 프로그램에 아무 영향을 주지 않는다. 주석과 비슷하다고 이해하면 되는데 일반적인 주석은 아니다. 리플렉션 같은 기술로 실행 시점에 읽어서 활용할 수 있는 특별한 주석이다.
아래 코드와 같이 애노테이션 value 값을 꺼내올 수 있다.
public static void main(String[] args) {
TestController testController = new TestController();
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());
}
}
}
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoElement {
// 자바가 기본 제공하는 타입만 제공 가능
String value();
int count() default 0;
String[] tags() default {};
}
[데이터 타입]