Spring

Annotation

About Annotation

우선 어노테이션이란 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다.

어노테이션의 용도 중 가장 큰 비중을 차지하는 것은 메타 데이터로서의 역할이다.

메타 데이터 : 데이터를 위한 데이터를 의미하며, 자신의 정보를 담고 있는 데이터를 이야기한다.

어노테이션은 어떻게 구성되어 있을까?

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
    boolean isCheck() default true;
}

먼저, 어노테이션의 선언에 쓰인 어노테이션은 메타 어노테이션이라 하며 이를 이용해 커스텀 어노테이션을 작성할 수 있다.

메타 어노테이션의 종류

  • @Retention
    자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는 지를 결정한다.
    • RetentionPolicy.SOURCE : 컴파일 전까지만 유효 (컴파일 이후에는 사라짐)
    • RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
    • RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조 가능 (리플렉션 사용)
  • @Target
    어노테이션을 적용할 위치를 나타낸다.
    • ElementType.PACKAGE : 패키지 선언
    • ElementType.TYPE : 타입 선언
    • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
    • ElementType.CONSTRUCTOR : 생성자 선언
    • ElementType.FIELD : 멤버 변수 선언
    • ElementType.LOCAL_VARIABLE : 지역 변수 선언
    • ElementType.METHOD : 메서드 선언
    • ElementType.PARAMETER : 전달인자 선언
    • ElementType.TYPE_PARAMETER : 전달인자 타입 선언
    • ElementType.TYPE_USE : 타입 선언
  • @Documented
    해당 어노테이션을 Javadoc에 포함시킨다.
  • @Inherited
    어노테이션의 상속을 가능케한다.
  • @Repeatable
    연속적으로 어노테이션을 선언할 수 있게 해 준다.

우리가 주로 사용하는 어노테이션들의 내부 구현을 뜯어보자.

@Target(ElementType.METHOD) // 메서드에 어노테이션을 적용하겠다.
@Retention(RetentionPolicy.SOURCE) // 컴파일 전까지만 유효
public @interface Override {
}
@Target({ElementType.TYPE, ElementType.METHOD}) // 타입과 메서드단위 모두 가능
@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후에도 참조 가능
@Documented // 자바독 명시
public @interface ResponseBody {
}
@Target(ElementType.TYPE) // 타입 선언
@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후에도 참조 가능
@Documented // 자바독 명시
@Controller
@ResponseBody
public @interface RestController {
}
@Target(ElementType.TYPE) // 타입 선언
@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후에도 참조 가능
@Documented // 자바독에 명시
@Inherited // 상속 가능
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@ExtendWith(SpringExtension.class) // JUnit 용 어노테이션, 주석이 달린 테스트 클래스 또는 테스트 메서드의 확장을 등록하는 데 사용되는 repeatable한 어노테이션
public @interface SpringBootTest {
}

이제, 커스텀 어노테이션을 만들어보자.

이 내용은 스터디 진행 후 보완하겠다.