스프링 부트(4)-메타 애노테이션과 합성 애노테이션

SeungTaek·2023년 2월 13일
0
post-thumbnail

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: 런타임 시에도 기록

사용자는 합성 애노테이션을 아래와 같이 만들 수 있다.

@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
해당 게시물은 인프런 - 토비의 스프링 부트 이해와 원리을 기반으로 작성되었습니다.
강의 내용을 축약하고 생략한 부분도 많기 때문에, 게시물만으로 해당 개념을 이해하지 못할 수 있습니다.
스프링 부트를 사용하시는 분들에게 해당 강의를 적극적으로 추천합니다.

profile
I Think So!

0개의 댓글