티스토리 뷰

개발을 하다보면 AOP 적용을 위해서 별도로 커스텀 어노테이션을 만들어야할 일이 생긴다.

물론 AOP 적용을 패턴을 통해 적용시킬 수 있지만 같은 공통 기능을 사용해야하는 메소드들에 공통점이 없다면?

커스텀 어노테이션을 만들어서 해당 메소드에 공통 기능을 사용하겠다고 표시를 해 AOP 설정을 할 수 있다.

 

 

Annotation(어노테이션) 이란?

그렇다면 먼저 어노테이션이란 무엇인지 개념을 살짝 짚고 가보자.

개발을 하다보면 @Getter, @Setter 등의 어노테이션을 자연스럽게 사용하고 있다.

하지만 그래서 어노테이션이 뭔데요? 라고 누가 물어보면 설명을 잘 할 수 없을 때가 있다.

 

그래서 어노테이션이란 무엇인가? 간단하게 설명하면 일종의 메타 데이터를 의미한다.

해당 데이터를 바탕으로 자동으로 기능(함수)를 생성하기도 하고(대표적인 예로 Getter랑 Setter) 또는 컴파일러에게 문법 체크에 대해 정보를 제공할 때도 사용한다. (Warning 무시 등)

 

 

어노테이션(Annotation)의 기본 형태

그렇다면 이와 같은 커스텀 어노테이션은 어떻게 만들어야할까? 클래스와 함수를 만들기 위해서는 클래스와 함수의 기본 형식을 알야아 하듯이 어노테이션 또한 어노테이션의 기본 형식을알아야 한다.

우선 많이 쓰이기도 하고 안의 구조가 간단한 @Autowried를 까보자.

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {

	/**
	 * Declares whether the annotated dependency is required.
	 * <p>Defaults to {@code true}.
	 */
	boolean required() default true;

}

 

 

@Autowried의 코드를 @Documented라는 어노테이션이 붙어 있는데 이와 같이 어노테이션은 다른 어노테이션을 포함한 상태로 만들 수 있다.

코드를 보고 어노테이션의 기본 형태를 정리해보면 아래와 같다.

@Target(${value})
@Retention(${value})
public @interface AnnotationName {
	int value1() default 0;
        String value2() default "";
}

 

 

어노테이션의 기본 형태는 public @interface Name {...} 으로 되어 있으며 @Target과 @Retention 두 개의 어노테이션이 필수로 붙어 있다.

 

 

@Target

@Target 어노테이션은 해당 어노테이션은 어디에 해당 어노테이션을 선언할 수 있는지에 대한 정보이다.

ElementType enum 값을 넣을 수 있으며 하나가 아니라 아래와 같이 여러 개를 넣을 수 있다.

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})

 

ElementType 열거형에서 제공하는 값들은 아래와 같다.

  • ANNOTATION_TYPE: 어노테이션에 선언 가능
  • CONSTRUCTOR: 생성자에 선언 가능
  • FIELD: 필드에 선언 가능
  • LOCAL_VARIABLE: 지역 변수에 선언 가능
  • METHOD: 함수에 선언 가능
  • PACKAGE: 패키지에 선언 가능
  • PARAMETER: 매개변수에 선언 가능
  • TYPE: class, interface, enum에 선언 가능
  • TYPE_PARAMETER: 매개변수 타입에 선언 가능
  • TYPE_USE: 타입 사용시 선언 가능

 

✋ ElementType Document

https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/ElementType.html

 

ElementType (Java Platform SE 8 )

The constants of this enumerated type provide a simple classification of the syntactic locations where annotations may appear in a Java program. These constants are used in java.lang.annotation.Target meta-annotations to specify where it is legal to write

docs.oracle.com

 

 

위의 항목들을 보고 커스텀 어노테이션을 사용할 곳에 맞게 적절한 @Target을 지정해주면 된다.

 

 

@Retention

@Retention 어노테이션은 해당 어노테이션이 어디까지 동작할 것인지(유지될 것인지)에 대한 정보이다.

RetentionPolicy enum값을 넣을 수 있으며 @Target과 다르게 하나의 값만 넣을 수 있다.

@Retention(RetentionPolicy.RUNTIME)

 

RetentionPolicy 열거형에서 제공하는 값은 아래와 같다.

  • CLASS: 컴파일러에 의해 .class 파일에까지는 유지되지만 JVM 실행 시 삭제된다.
  • RUNTIME: .class 파일에도 유지되고 JVM 실행 시에도 유지된다.
  • SOURCE: java 파일 자체에서만 유지되고 컴파일 시 제거된다.

✋ RetentionPolicy Document

https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/RetentionPolicy.html

 

RetentionPolicy (Java Platform SE 7 )

 

docs.oracle.com

 

 

@Retention 또한 @Target과 마찬가지로 만든 어노테이션의 쓰임새에 따라서 어노테이션 어디까지 동작될지 설정해주면 된다.

 

 

어노테이션의 값

안에 아래와 같이 선언된 함수들은 어노테이션이 가지고 있을 메타 데이터를 의미한다.

int value1() default 0;
String value2() default "";

 

아래와 같이 어노테이션을 사용할 때 안에 value라던지 required라는 값을 넣은 경험이 있을 것이다.

이 값들을 받는 것이 바로 어노테이션 @interface 안에 정의되어 있는 함수들로 인해 값을 받고 저장할 수 있는 것이다.

만일 위에 예제로 작성해놓은 @AnnotationName을 사용한다면 아래와 같이 사용할 수 있을 것이다. 또한 default 값을 설정해서 필수로 값을 받지 않고 기본 값으로 셋팅되게도 할 수 있다.

@AnnotationName(value1 = 2, value2 = "test")

 

 

 

지금까지는 커스텀 어노테이션을 만들 일도 없었고 어노테이션 안을 까볼 필요도 없어서 어노테이션이 어떻게 생겼는지,

그리고 직접 커스텀 어노테이션을 만들 수 있는지도 몰랐다.

하지만 역시 코딩은 그냥 하는 것이 아니라 사용하는 객체, 어노테이션 등을 까봐야 안다고... 이렇게 어노테이션의 형태를 익히고 어노테이션을 만들 수 있는 방법을 익히며 확실히 AOP 설정도 편해지고 여러 가지 설정을 할 수 있어 코드가 더 깔끔해진다.

 

필요하다면 얼마든지 커스텀 어노테이션을 만들어서 사용하자! 단, 역시 남용하면 커스텀 어노테이션만 많아지고 어노테이션이 공통으로 동작하게 하는 것이 없으므로 적절하게 짜자!

 

 

 

✋ @Target Document

https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html

 

Target (Java Platform SE 8 )

Indicates the contexts in which an annotation type is applicable. The declaration contexts and type contexts in which an annotation type may be applicable are specified in JLS 9.6.4.1, and denoted in source code by enum constants of java.lang.annotation.El

docs.oracle.com

 

✋ @Retention Document

https://docs.oracle.com/javase/7/docs/api/java/lang/annotation/Retention.html

 

Retention (Java Platform SE 7 )

Indicates how long annotations with the annotated type are to be retained. If no Retention annotation is present on an annotation type declaration, the retention policy defaults to RetentionPolicy.CLASS. A Retention meta-annotation has effect only if the m

docs.oracle.com

 

 

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함