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 {
}
이제, 커스텀 어노테이션을 만들어보자.
이 내용은 스터디 진행 후 보완하겠다.