[JAVA] 어노테이션 (Annotation)

Java Annotation은 Java 소스코드/프로그램에 대한 metadata를 표현하기 위해 사용되는 방법이다. 이것을 통해 설정한 metadata로 다른 프로그램 또는 스스로를 조작하는 프로그램으로 다양한 프레임워크에서 사용된다.
컴파일 타임, 런타임에 코드가 동적으로 변경할 수 있게 한다.


Java Annotation

Java에서 프로그램 코드에 대한 Metadata를 제공하는 방식

Meta data 종류

1.Pre Compilation Information

  • 컴파일 시 체크해야 하는 정보를 추가적으로 제공 (ex. @Override)
  1. Compile time Information
  • 코드 생성 및 Java 컴파일러와 연관된 툴에 대한 정보 (ex. Lombok - @Getter, @Setter)
  1. 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

  1. @Interface 키워드를 통해 정의하고 내부에 추상 메서드 정의 가능
@interface myAnnotation{
  int count() default 1; 
  String test(); 
}
  1. @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 중괄호로 복수개 설정할 수 있음.