Meta annotation은 어노테이션을 정의하고 그 기능을 명시하는 것으로, 어노테이션의 특성에 대한 정보를 제공합니다.
Java와 같은 몇몇 언어에서는 어노테이션을 사용하여 소스 코드에 메타데이터(metadata)를 추가할 수 있습니다. 메타데이터는 프로그램이 실행될 때 사용되는 정보로서, 어노테이션을 사용하여 클래스, 메서드 또는 변수 등에 대한 추가 정보를 제공할 수 있습니다.
Meta annotation은 어노테이션을 정의하고 그 기능을 명시하는 것으로, 어노테이션의 특성에 대한 정보를 제공합니다. 예를 들어, @Retention
, @Target
, @Inherited
등은 Java에서 기본적으로 제공되는 메타 어노테이션입니다.
@Target
어노테이션의 적용 대상(@Target
)을 지정할 때
어노테이션을 적용할 수 있는 대상(클래스, 메서드, 필드 등)을 지정하기 위해 사용됩니다.
@Retention
어노테이션의 유효 기간(@Retention
)을 지정할 때
어노테이션의 적용 기간(소스 코드, 클래스 파일, 런타임)을 지정하기 위해 사용됩니다.
@Inherited
어노테이션을 상속 가능하게 할 때(@Inherited
)
부모 클래스에서 선언된 어노테이션을 자식 클래스에서도 상속받을 수 있도록 지정하기 위해 사용됩니다.
Annotation도 자바 코드로 생성 되었기에 Annotation 코드 위에 Annotation을 붙일 수 있는 것입니다.
그럼 왜 사용하는 걸까요?
가령 @Component
로 Bean이 등록될때, Object가 어떠한 종류인지 구체적으로 명시하고 싶은 경우가 있습니다. Web, Service 계층이나 비즈니즈 로직을 표현하고 싶을 경우 말이죠. 이럴 경우, Meta Annotation으로 명시할 수 있습니다. 흔히, Spring MVC에서 사용하는 @RestController
가 대표적입니다.
서비스의 규모가 거대해지면 Bean이 많아지고, 관리의 용이성 측면
Web Service를 구성할 때 많이 사용하는 @RestController
를 통해 쉽게 이해가 가능합니다.
IntelliJ에서 @RestController
를 확인하면 아래와 같은 Annotation이 포함됩니다.
눈의 띄는 것은 @ResponseBody
, @Controller
가 포함됩니다.
즉,
@RestController
는@ResponseBody
,@Controller
를 Annotation으로 가지는 Meta Annoation입니다.
이번에는 @Controller
를 보겠습니다. @Controller
에서는 @Component
를 Annotation으로 가지는 Meta Annoation인 것을 알 수 있습니다.
따라서 @RestController
는 @ResponseBody
(API 응답을 Body에 보내기 위한 Annotation)과 @Controller
(Controller 계층을 표현하기 위한 Meta Annoation)을 Annatation으로 가지는 Meta Annoation이고,
@Controller
는 @Component
(Spring Container에 Bean으로 등록하는 Annotation)를 Annotation으로 가지는 Meta Annoation인 것입니다.
그림으로 정리하면 다음과 같은 관계를 가지는 것으로 정리할 수 있습니다.
이러한 메타 Annatation을 통해 Spring에서는 ComponentScan이 가능해 동일 또는 하위 패키지를 전부 찾아 @Component
가 붙어 있는 클래스를 Bean으로 등록하게 되는 것입니다.