2월 29, 2024

[Java/Spring] Custom Annotation 만드는 방법, @Retention, @Target 등 meta annotation

1. Java Annotation


Java에서는 기본적으로 제공되는 Built-in annotatoin들이 있다. 우리가 스프링, 자바 공부를 하면서 자주 보았던 @Override나 @SuppressWarnings 와 같은 annotation이 대표적으로 Built-in annotation들이다. 하지만 스프링 개발을 하다 보면 Customized 된 annotation을 만들어서 일관성 있게 우리가 원하는 방식으로 개발하고 싶어질 때가 있다. 그런 경우를 위하여 오늘은 Custom annotation을 만드는 방법에 대하여 알아보겠다. 


2. Custom Annotation 생성하기 


만약 우리가 @Name이라는 annotatotion을 생성하여 DVo와 같은 java 파일에 각 필드마다 @Name annotation을 붙여주고 싶다고 해보자. 

그러면 아래와 같이 작성하면 된다. 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
public @interface Name{
   String value();
}

annotation은 @interface 라고 해서 만들어주면 되고 
그 이외에 여러 Meta annotation을 붙여주면 되는 것이다.

예를 들어 

@Retention(RetentionPolicy.RUNTIME)

의 경우 컴파일 이후 runtime 까지도 계속 참조가 되게끔 설정한 것이다.

@Target annotation 뒤에는 해당 annotation이 사용되는 위치를 결정해준다. 

여기서 자주 사용되는 것이 ElementType.FIELD, ElementType.METHOD, ElementType.TYPE인데 
FIELD는 멤버 변수 선언, METHOD는 메소드, TYPE은 타입 선언 시 활용된다. 

해당 형태에 우리가 정의한 annotation을 사용할 수 있는 것이라고 생각하면 된다.

예를 들어 ElementType.METHOD를 정의하지 않으면 우리는 해당 애노테이션을 메소드에는 사용할 수 없다. 

따라서 굳이 필요하지 않다면 명시해주지 않아도 된다는 뜻이다. 


위와 같이 만들었다면 우리는 

Dvo와 같이 각 멤버 변수 위에 @Name을 정의하여 우리가 부르고 싶은 이름을 보기 좋게 나타낼 수 있다. 

@Name("한국나이") 
private int age; 

이런 식으로 각 멤버 변수가 무엇을 의미하는지 적어줄 수 있다. 

마찬가지로 ElementType.METHOD를 통해 메소드에도 적용 가능하도록 설정을 하였으므로

@Name("한국나이 Setter Method")
public void setAge(int age) {
    this.age = age; 
}

이런 식으로 이름을 적어줄 수 있다. 

꼭 위와 같은 @Name이 아니더라도 적절한 annotation을 생성하여 효과적으로 Java 프로그램을 관리해보자.