메타 애노테이션이란 애노테이션 위에 붙은 애노테이션이라는 뜻이다. 보통 애노테이션은 클래스나 메소드 앞에 붙지만, 애노테이션 위에도 애노테이션을 또 붙일 수 있다. 이때 애노테이션 위에 붙어있는 애노테이션을 ‘메타 애노테이션’이라 한다.
메타 애노테이션을 한 개 이상을 적용해서 만든 애노테이션을 말한다. 결국 메타 애노테이션과 합성 애노테이션은 항상 같이 존재하는 개념이다.
합성 애노테이션을 만들기 위해서는 반드시 @Target
과 @Retention
은 필수로 붙어야 한다.
ElementType.java
참고)사용자는 합성 애노테이션을 아래와 같이 만들 수 있다.
@Retention(RetentionPolicy.RUNTIME) // 고정
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD})
@Test // Meta Annotation
@interface UnitTest {}
@Retention(RetentionPolicy.RUNTIME) // 고정
@Target(ElementType.METHOD)
@UnitTest // Meta Annotation
@interface FastUnitTest {}
@Target(ElementType.TYPE) /
@Retention(RetentionPolicy.RUNTIME) // 고정
@Test // Meta Annotation
public @interface UnitTest {}
아래는 대표적으로 우리가 자주 사용하고 스프링이 이미 만들어둔 합성 애노테이션이다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller // Meta Annotation
@ResponseBody // Meta Annotation
public @interface RestController {...}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {...}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {...}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {...}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {...}
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {...}
reference
해당 게시물은 인프런 - 토비의 스프링 부트 이해와 원리을 기반으로 작성되었습니다.
강의 내용을 축약하고 생략한 부분도 많기 때문에, 게시물만으로 해당 개념을 이해하지 못할 수 있습니다.
스프링 부트를 사용하시는 분들에게 해당 강의를 적극적으로 추천합니다.