스프링 부트 4 - 메타 애노테이션과 합성 애노테이션
1. 메타 애노테이션(Meta-annotation)
메타 애노테이션이란 애노테이션 위에 붙은 애노테이션이라는 뜻이다. 보통 애노테이션은 클래스나 메소드 앞에 붙지만, 애노테이션 위에도 애노테이션을 또 붙일 수 있다. 이때 애노테이션 위에 붙어있는 애노테이션을 ‘메타 애노테이션’이라 한다.
2. 합성 애노테이션(Composed-annotation)
메타 애노테이션을 한 개 이상을 적용해서 만든 애노테이션을 말한다. 결국 메타 애노테이션과 합성 애노테이션은 항상 같이 존재하는 개념이다.
합성 애노테이션을 만들기 위해서는 반드시 @Target
과 @Retention
은 필수로 붙어야 한다.
- @Target: 이 애노테이션을 어디에 적용할지 결정한다.(여러개 지정 가능)
- ElementType.TYPE: 클래스, 인터페이스, enum, record
- ElementType.FIELD
- ElementType.METHOD
- ElementType.PARAMETER
- ElementType.ANNOTATION_TYPE
- 등등… (자세한 정보는
ElementType.java
참고)
- @Retention: 어느 과정까지 애노테이션이 존재해야(저장되어야) 하는가
- RetentionPolicy.SOURCE: 컴파일 시에 삭제됨
- RetentionPolicy.CLASS: 기본값, 컴파일된 class file까지 기록
- RetentionPolicy.RUNTIME: 런타임 시에도 기록
사용자는 합성 애노테이션을 아래와 같이 만들 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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 {}
아래는 대표적으로 우리가 자주 사용하고 스프링이 이미 만들어둔 합성 애노테이션이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@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
해당 게시물은 인프런 - 토비의 스프링 부트 이해와 원리을 기반으로 작성되었습니다.
This post is licensed under CC BY 4.0 by the author.