목차
- 메타 애노테이션
메타 애노테이션
애노테이션을 만들 때 사용합니다.
아래는 @RestController 소스 코드 일부이다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(annotation = Controller.class)
String value() default "";
}
여기서 @Target, @Retention, @Doncumented 가 메타 애노테이션에 해당된다. 이외에도 몇 가지 메타 에노테이션이 추가적으로 존재한다.
애노테이션 | 설명 |
@Target | 애노테이션이 적용가능한 대상을 지정하는데 사용 |
@Retention | 애노테이션이 유지되는 범위를 지정하는데 사용 |
@Doncumented | 애노테이션 정보가 javadoc으로 작성된 문서에 포함하게 한다. |
@Repeatable | 애노테이션을 반복해서 적용할 수 있게 한다. |
@Inherited | 애노테이션이 자손 클래스에 상속되도록 한다. |
중요하다고 생각하는 두 가지(@Target, @Retention)는 조금 더 자세히 다루겠습니다.
@Target
애노테이션이 적용가능한 대상을 지정하는데 사용합니다. 매개변수로 ElementType 타입의 상수를 받습니다.
TYPE, METHOD, FIELD, PARAMETER, CONSTRUCTOR 등이 존재합니다.
(TYPE은 클래스, 인터페이스를 의미합니다.)
사용 예시
@GetMapping("/characters")
public String viewCharacters(@SessionAttribute(SESSION_MEMBER_ID) Long memberId, Model model) {
Member loginMember = memberRepository.findById(memberId);
model.addAttribute("loginMember", loginMember);
return "/main/loginHome";
}
@GetMapping 애노테이션의 경우 메서드 단위에서 @SessionAttribute는 파라미터 단위에서 사용되었습니다.
//GetMapping 애노테이션 소스 일부
@Target(ElementType.METHOD)
//SessionAttribute 애노테이션 소스 일부
@Target(ElementType.PARAMETER)
ElementType은 여러개일 수도 있습니다.
//RequestMapping 애노테이션 소스 코드 일부
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention
애노테이션이 유지되는 범위를 지정하는데 사용합니다. 매개변수로 RetentionPolicy 타입의 상수를 받습니다.
SOURCE, CLASS, RUNTIME 총 3가지가 있습니다.
주로 SOURCE, RUNTIME 2가지를 사용합니다.
SOURCE - 컴파일러 단계까지 유지됩니다. 즉, 클래스 파일이 되기전 소스 코드일 때 까지만 존재합니다.
RUNTIME - 런타임이 유지될 때까지 사용됩니다.
SOURCE 기간 동안 유지되는 애노테이션 대표적으로 @Override @SuppressWarnings 가 있습니다.
이외 대부분의 애노테이션은 RUNTIME 기간동안 유지됩니다.
다음 포스팅에서는 애노테이션을 한 번 만들어보면서 어떻게 애노테이션을 생성하는지 알아보겠습니다.