애노테이션이 필요한 이유

리플렉션 서블릿은 요청 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 {};
    
}

[데이터 타입]