Post

스프링 부트 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.