({ElementType.CONSTRUCTOR : 생성자에 부착해도 된다. ElementType.METHOD : 메소드에 부착해도 된다. ElementType.PARAMETER : 매개변수 메소드에 부착해도 된다. ElementType.FIELD : 클래스의 멤버변수에 부착해도 된다 ElementType.ANNOTATION_TYPE : 다른 어노테이션 타입에 부착해도 된다. ElementType.TYPE : 클래스, 인터페이스에 부착해도 된다. })
({부착대상, 부착대상, 부착대상})
배열의 형태로도 올 수 있다.
@Retention
어노테이션의 유지되는 시점을 정의한다.
RetentionPolicy.RUNTIME
프로그램이 실행될 때 어노테이션이 실행된다.
거의 Runtime이다
RetentionPolicy.Source
소스레벨에서 어노테이션이 사용된다.
컴파일되고는 쓸모없어진다.
문법검사같이 이클립스와 통합개발환경에서 사용이 된다.
ex)Override
RetentionPolicy.Class
컴파일 된 클래스에서 어노테이션이 사용된다.
어노테이션은 @interface의 형태를 가지고 있다.
예시
@Target(ElementType.PARAMETER) //메소드 파라미터에 부착하고, 프로그램 실행 시점까지 유지되는 어노테이션이다. @Retention(RetentionPolicy.RUNTIME) public @interface SessionUser{ //SessionUserAnnotationProcess.java를 개발해야한다. //어노테이션의 정보를 활용해서 개발해야한다. //@SesstionUser어노테이션을 감지하고 적절한 처리를 수행하는 클래스가 개발되어야한다. } @RequestMapper("/order.do") public String order(@SessionUser User user, int productNo){ //그래야 이렇게 사용할 수 있다. }
어노테이션의 사용방법
@Target({부착대상, 부착대상, 부착대상}) @Retention(보유시점) //1개밖에 못적는다. public @interface 어노테이션명{ //Controller라고 적었다고 예시하고 아래부분 작성함 String value() default = ""; String[] path() default ={}; //값의 타입 , 속성명(bean에 저장될 때 어떻게 저장되는지 결정), 기본값 }
value는 생략, value를 적고 적어도 된다. @Controller(value="homeController") @Controller("homeController")
@RequestMapping
value = path로 적혀있어서 서로 작성해도 상관없다.
그래서 이런 속성값 적는것이 가능한 이유이다.
속성명이 하나밖에 없으면 속성명을 생략하고 적을 수 있다. @어노테이션(값)
속성명이 하나밖에 없어도 속성명과 함께 적을 수 있다. @어노테이션(속성명=값)
속성명이 하나밖에 없는 경우 무조건 속성명을 value로 정한다. (생략이 가능하기 때문)
속성값이 배열인 경우 값이 하나밖에 없으면 배열표시를 생략할 수 있다. @어노테이션(path=값)
기본값이 없으면 속성명을 꼭 적어줘야한다.
속성명이 value인 경우 그 속성명을 생략 할 수 있다.
속성명 없이 값만 적는 경우 그 값은 value의 속성의 값으로 간주된다.
속성명이 value인 경우 다른 속성명과 같이 사용될 때는 생략할 수 없다.
@어노테이션(value="값", path="값")
속성값이 배열이고, 값이 2개이상인 경우 배열의 리터럴로 작성해야한다.
@어노테이션(path={값, 값, 값})
어노테이션의 사용목적
부가적인 정보를 전달하기 위해서 사용한다.
부가적인 정보는 meta data라고 부른다.
어디에 전달할 까?
IDE(이클립스, 인텔리제이 등의 개발툴) 과 프레임워크나 라이브러리에게 전달할 목적이다.