심심한잉여의 잡동사니

[JAVA] 어노테이션(Anotation) 본문

코딩일기/Java

[JAVA] 어노테이션(Anotation)

심심한잉여 2022. 4. 12. 13:38
반응형

어노테이션이란?
JAVA5(1.5)부터 등장한 기능이며 요약하자면 추가적인 정보를 제공해주는 메타 데이터이다.
여기서 말하는 메타데이터란 어플리케이션이 처리해야 할 데이터가 아니라 컴파일 과정에서 런타임 에서 코드를 어떻게 컴파일하고 처리할 것인지에 대한 정보를 말한다.

(메타데이터란, 데이터에 대한 데이터를 뜻하며 즉, 특정 데이터에 대한 설명을 의미하는 데이터이다.
자신의 정보를 담고 있는 데이터라고 보면 된다.)

이 메타데이터를 잘 이용하면 비즈니스로직과 분리하여 대상의 벨리데이션 체크, 값 주입, 역할부여(기능부여) 등을 수행할 수 있어 체계가 잡혀있는 깔끔한 코드를 작성할 수 있게 된다.

어노테이션은 옵션에 따라 컴파일 전까지, 컴파일 시기에 처리(컴파일러가 클래스를 참조하기 전까지), 런타임 시기에 처리 될 수 있다.

JAVA의 리플렉션(클래스 정보를 가져오는 기능)을 사용하여 런타임 시기에 어노테이션의 정보를 바탕으로 다양한 기능을 수행할 수 있으므로 어노테이션은 AOP(관점지향 프로그래밍)를 구성하는데 많은 도움을 줄 수 있다.


커스텀 어노테이션의 구성과 동작원리

커스텀 어노테이션은 메타 어노테이션을 사용하여 다음과 같은 구조를 가진다.
메타 어노테이션이란 커스텀 어노테이션을 구성할 때 시점, 위치등을 지정하기 위한 어노테이션이다.
어노테이션의 필드 타입은 enum, String이나 기본 자료형, 기본자료형의 배열만 사용할 수 있다.

@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
	public 타입 elementName() [default 값]
}

메타 어노테이션의 종류는 아래와 같다.

@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 : 타입 선언

@Documented : 해당 어노테이션을 Javadoc에 포함시킨다.

@Inherited : 어노테이션의 상속 여부를 제어한다.

@Repeatable : Java8(1.8) 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 한다.

 

반응형