카테고리 없음

Java Annotation

뽀글뽀글 개발자 2024. 9. 23. 13:49

Annotation

어노테이션이란 주석이라는 뜻으로 자바에서 코드에 "이 어노테이션이 붙은 코드는 어떤식으로 사용된다." 와 같은 메타데이터를 추가하기 위해 사용된다.

하지만 어노테이션 자체만으로는 아무런 기능이 없는 주석이기 때문에 어노테이션에 대한 처리 로직이 필요하다.

 

어노테이션 생성 방법

아래는 @Bean 어노테이션의 구조로 @Target, @Retetion을 지정해주고, @Interface로 선언한다.

아래 필드들은 어노테이션 파라미터로 다음과 같이 사용할 수 있다.  ex) @Bean(name="testBean")

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Bean {
	@AliasFor("name")
	String[] value() default {};

	@AliasFor("value")
	String[] name() default {};

	@Deprecated
	Autowire autowire() default Autowire.NO;
	
	boolean autowireCandidate() default true;

	String initMethod() default "";
	
	String destroyMethod() default AbstractBeanDefinition.INFER_METHOD;
}

 

@Target

 @Target을 통해서 어노테이션이 적용될 수 있는 요소의 종류를 지정한다. 

아래와 같이 선언되면 메서드와 필드 변수에 어노테이션을 붙일 수 있다는 뜻이다.

@Target({ElementType.METHOD, ElementType.FIELD})

 

@Retention

@Retention은 어노테이션이 유지되는 기간을 지정하며, RetentionPolicy는 아래 3가지가 있다.

 

  • SOURCE: 소스 코드에서만 유지. 컴파일 시 제거됨.
    • @Getter, @Setter의 경우 컴파일 후 클래스 파일을 생성할 때까지만 사용된다.
  • CLASS: 컴파일된 클래스 파일까지 유지. 런타임 시 제거됨. (Default)
    • @NonNull의 경우 클래스 파일 이 실행되어 JVM Class Loader에 올라가면 사라진다.
  • RUNTIME: 런타임까지 유지. 리플렉션을 통해 정보를 읽을 수 있음.
    • @Autowired, @Component의 경우 애플리케이션 실행 중에 Reflection을 통해 정보를 읽고 처리할 수 있다.
    • 런타임의 경우 프로그램 실행 중에 어노테이션이 붙은 클래스의 정보를 가져올 수 있어야하기 때문에 Reflection API와 함께 사용된다.