Java 언어를 배울때부터 슬그머니 등장하는 @Override 어노테이션이 있지만 정확히 내부적으로 어떤 코드로 되어있는지는 확인하지 않았었다.
개발시에 Custom으로 어노테이션을 제작하여 코드를 깔끔하게 만들기 위해서 공부하려고한다. 이번 기회에 정확히 어노테이션에 대해 알아보고 넘어가보자!
- Java 어노테이션(Annotation) 이란?
JEE5부터 새롭게 추가된 요소로 자바코드에 추가적인 정보를 제공하는 메타데이터이다.
메타-테이터(Meta-Data) : 데이터를 위한 데이터를 의미하며, 풀어 이야기하면 한 데이터에 대한 설명을 의미하는 데이터. (자신의 정보를 담고 있는 데이터)
사전적으로는 "주석"이라는 의미를 가지고 있으며, 의미대로 자바 코드에 주석처럼 달아서 특수한 의미를 부여해준다. 컴파일 타임 혹은 런타임에 해석될 수 있다. 하기와 같이 클래스 내부 또는 클래스 바로 위에 '@'와 함께 시작하는 것이 어노테이션이다.
_Spring controller 예시
@Controller
public class Controller {
@GetMapping(value = "/main")
public String response() {
return "main data";
}
}
Spring 프로젝트에서 많이 활용되지만 기본적으로 많이 쓰이는 Java에서도 @Override 외에도 제공되는 어노테이션이 있다.
1. 내장 어노테이션(Bulit-in Annotation)
어노테이션 | 설명 |
@Override | 메소드가 오버라이드 됐는지 검증한다. 만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 난다. |
@Deprecated | 메소드를 사용하지 않도록 유도한다. 만약 사용한다면 컴파일 경고를 일으킨다 |
@SuppressWarnings | 컴파일 경고를 무시하도록 한다. |
@SafeVarargs | 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다. (자바7 이상) |
@FunctionalInterface | 람다 함수등을 위한 인터페이스를 지정한다. 메소드가 없거나 두개 이상 되면 컴파일 오류가 난다. (자바 8이상) |
원문보기
Annotations applied to Java code:
- @Override- Checks that the method is anoverride. Causes acompilation errorif the method is not found in one of theparent classesor implementedinterfaces.
- @Deprecated- Marks the method as obsolete. Causes a compile warning if the method is used.
- @SuppressWarnings- Instructs the compiler to suppress thecompile timewarnings specified in the annotation parameters.
2, 메타 어노테이션(Meta Annotation)
기본 어노테이션 외에도 메타 어노테이션들이 있어, 메타 어노테이션을 이용하여 커스텀 어노테이션을 만들 수 있다.
어노테이션 | 설명 | 종류 |
@Retention | 어노테이션이 어느 특정 시점까지 영향을 미칠 수 있는지 결정한다 |
- RetentionPolicy.SOURCE: 컴파일 전까지만 유효.(컴파일 이후에는 사라짐)
|
- RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효 |
||
- RetentionPolicy.RUNTIME: 컴파일 이후에도 JVM에 의해 계속 참조가 가능 |
||
@Target | 어노테이션이 적용할 위치를 결정한다 | - ElementType.PACKAGE: 패키지 선언 |
- ElementType.TYPE: 타입 선언 | ||
- ElementType.ANNOTATION_TYPE: 어노테이션 타입 선언 | ||
- ElementType.CONSTRUCTOR: 생성자 선언 | ||
- ElementType.FIELD: 멤버 변수 선언 | ||
- ElementType.LOCAL_VARIABLE: 지역 변수 선언 | ||
- ElementType.METHOD: 메서드 선언 | ||
- ElementType.PARAMETER: 전달인자 선언 | ||
- ElementType.TYPE_PARAMETER: 전달인자 타입 선언 | ||
- ElementType.TYPE_USE: 타입 선언 | ||
@Inherited | 어노테이션의 상속을 가능하게 한다. | |
@Documented | 해당 어노테이션을 Javadoc에 포함시킨다 | |
@Repeatable | 반복적으로 어노테이션을 선언할 수 있게 한다.(자바8 이상) |
원문보기
Annotations applied to other annotations (also known as "Meta Annotations"):
- @Retention- Specifies how the marked annotation is stored, whether in code only, compiled into the class, or available at runtime through reflection.
- @Documented- Marks another annotation for inclusion in the documentation.
- @Target- Marks another annotation to restrict what kind of Java elements the annotation may be applied to.
- @Inherited- Marks another annotation to be inherited to subclasses of annotated class (by default annotations are not inherited to subclasses).
Since Java 7, three additional annotations have been added to the language.
@SafeVarargs- Suppress warnings for all callers of a method or constructor with agenericsvarargsparameter, since Java 7.@SafeVarargs- Suppress warnings for all callers of a method or constructor with agenericsvarargsparameter, since Java 7.
@FunctionalInterface- Specifies that thetype declarationis intended to be afunctional interface, since Java 8.@FunctionalInterface- Specifies that thetype declarationis intended to be afunctional interface, since Java 8.
@Repeatable- Specifies that the annotation can be applied more than once to the same declaration, since Java 8.@Repeatable- Specifies that the annotation can be applied more than once to the same declaration, since Java 8.
메타 데이터를 가지고 커스텀 어노테이션을 만들어보자.
방법은 쉽다! interface에 @만 붙이고 추가 메타 어노테이션을 작성하면 된다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IdAnnotation {
public String id() default "user";
}
/**
* Created by JHPark
*/
id 값은 아이디 정보라는 주석역할을 하는 어노테이션을 만들고 다음과 같이 사용한다.
@IdAnnotation(id = "아이디 정보입니다.")
@GetMapping(value = "/id")
public @ResponseBody String login(
String phoneId,
String password) {
...
return response;
}
아이디 정보라는 설명만 확인할 수 있다.
해당 데이터를 가지고 별도 처리를 하고 싶다면 어노테이션을 사용할 수 있도록 프로세서를 구현하여야한다.
Taget을 Field로 하는 어노테이션추가 후
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface IdAnnotation {
}
/**
* Created by JHPark
*/
id field에 어노테이션을 붙여준다.
public class UserInfo {
@idAnnotation
public String id;
public String password;
...
}
validation을 진행할때 어노테이션 유무에 따라 별도 기능을 추가할 수 있다.
public static void validation(Class<?> clazz) throws NoSuchFieldException {
/** reflection package를 사용하여 필드 불러 온다 */
Field field = clazz.getDeclaredField("id");
/** 어노테이션 불러 온다 */
Annotation annotation = field.getAnnotation(UserInfo.class);
if(annotation != null) {
// annotation 유무로 추가 처리
}
}
'Java' 카테고리의 다른 글
Thread join ( Thread 종료 대기) (0) | 2020.07.12 |
---|