[JAVA] 어노테이션 (Annotation)
Java Annotation은 Java 소스코드/프로그램에 대한 metadata를 표현하기 위해 사용되는 방법이다.
이것을 통해 설정한 metadata로 다른 프로그램 또는 스스로를 조작하는 프로그램으로 다양한 프레임워크에서 사용된다.
컴파일 타임, 런타임에 코드가 동적으로 변경할 수 있게 한다.
Java Annotation
Java에서 프로그램 코드에 대한 Metadata를 제공하는 방식
Meta data 종류
1.Pre Compilation Information
- 컴파일 시 체크해야 하는 정보를 추가적으로 제공 (ex. @Override)
- Compile time Information
- 코드 생성 및 Java 컴파일러와 연관된 툴에 대한 정보 (ex. Lombok - @Getter, @Setter)
- Reflection Information
- Reflection을 위해서 런타임에 획득될 수 있는 정보를 제공(ex. @Inject, @Autowired, @Value)
Java Annotation
- Built-In Annotation
- Annotation Usage
- Custom Annotation
- Meta Annotation
프로그램 코드에 대한 Metadata를 제공하는 방식
- Pre-Compilation Information (@Lombok)
- Compile time Information (@Override)
- Runtime Information (@Inject)
Built-In Annotation
미리 내장되어 있는 annotation
- @Override : 오버라이딩 메소드 (아닐 경우 에러 발생)
- @FunctionalInterface : 함수형 인터페이스
- @Deprecated : 향후 사용되지 않음
- @SuppressWarnings : 경고메세지를 나타내지 않음
- @SafeVarargs : 제네릭 가변인자 사용
- @Native : Native 메서드에서 참조되는 상수에 사용
다양한 프레임워크 & 라이브러리에서 활용
- Junit
// JUnit
@Test
public void testIt(){
assertNotNull(someInstance);
assertEquals("hi",some.test());
}
- Spring
@RequestMapping("/")
public class someController{
@GetMapping
public String hello(){
return "hello";
}
}
Custom Annotation
- @Interface 키워드를 통해 정의하고 내부에 추상 메서드 정의 가능
@interface myAnnotation{
int count() default 1;
String test();
}
- @Target, @Retention 등 Meta Annotation으로 Annotation에 대한 Meta정보 제공
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.TYPE)
public @interface Transfer{
Class<?> target;
String set() default "set";
}
Meta Annotation
Annotation에 대한 정보를 제공하는 Annotation(메타의 메타를 제공하는 Annotation)
- @Target: Annotation이 지정 가능한 대상을 설정
- @Retention: Annotation이 유지되는 범위 설정
- @Documented: Annotation이 javadoc에 포함하도록 설정
- @Inherited: Annotation이 서브 클래스에 상속되도록 설정
- @Repeatable: Annotation이 반복되어서 적용될 수 있도록 설정
@Retention (Policy) 해당 Annotation을 언제까지 유지할 것인지 Policy 종류
- SOURCE: 코드가 소스 파일에서만 유효. class파일에서는 적용되지 않음
- CLASS(default): 컴파일 후 class 파일까지만 유효. 실행시에는 사용 불가
- RUNTIME: 컴파일 후 class 및 실행시에도 유효. 실행시에 사용가능
@Target({FIELD, METHOD, PARAMETER,… })
- ANNOTATION TYPE
- CONSTRUCTOR
- FIELD
- LOCAL_VARIABLE
- METHOD
- PACKAGE
- PARAMETER
- TYPE 중괄호로 복수개 설정할 수 있음.