[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 프로그램을 관리해보자.