hello world

커스텀 어노테이션 본문

WEB/java

커스텀 어노테이션

sohyun_92 2023. 1. 17. 14:29
728x90

어노테이션이 해주는 역할은?

추가적인 정보를 제공해주는 메타데이터

(메타데이터란? 데이터에 대한 속성정보로 도서관을 예시로 들면 표제,저자,주제 등이 포함되어 있는 목록이 메타데이터에 속한다)

즉 어노테이션의 역할은 정보를 가짐으로서 그자체의 의미

쉽게말하면 프로그램의 주석

 

커스텀 어노테이션의 구성 (사용자 정의 어노테이션)

  • 커스텀 어노테이션을 이용하는 방법
    1. 어노테이션을 정의한다.
    2. 어노테이션을 클래스에서 사용한다. (타겟에 적용)
    3. 어노테이션을 이용하는 코드를 수행한다.
@Target({ElementType.[적용대상]})  // ElemenType.METHOD (타입을 메소드로 선언)
@Retention(RetentionPolicy.[정보유지되는 대상]) //RUNTIME으로 지정할 시 컴파일 이후에도 JW에 의해서 참조가 가능
public @interface [어노테이션명]{
	public 타입 elementName() [default 값]
    ...
}

 

@Target 어노테이션은 사용@Target(ElementType.ANNOTATION_TYPE) : 어노테이션

 

  - @Target(ElementType.CONSTRUCTOR) : 생성자

  - @Target(ElementType.FIELD) : 필드(멤버 변수, Enum 상수)

  - @Target(ElementType.LOCALVARIABLE) : 지역변수

  - @Target(ElementType.METHOD) : 메서드

  - @Target(ElementType.PACKAGE) : 패키지

  - @Target(ElementType.PARAMETER) : 매개변수(파라미터)할 어노테이션을 적용할 대상을 지정하는 데 사용한다.

 

 

@Target(ElementType.FIELD) : 필드(멤버 변수, Enum 상수) 를 사용해

Vo의 변수에 값을 주는 커스텀 어노테이션을 만들어보았다.

 

1.어노테이션을 정의한다.

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



@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.FIELD)
public @interface fieldVoValue {
    String value () default "";
    int index() default  0;
}

 

(DIVN_NM 변수의 값 "소속"을 커스텀 어노테이션인 fieldVoValue로 맵핑해줌)

커스텀 어노테이션을 통해 Vo 변수의 값들을 list로 불러오기위한 작업이 필요했다.

 

2.어노테이션을 클래스에서 사용한다. (타겟에 적용)

  public static String[] getAnnoValue(Class c) {
        List<String> list = new ArrayList<>();
        for ( Field field : c.getDeclaredFields() ) {
            fieldVoValue fieldVoValue = field.getAnnotation(fieldVoValue.class);
            if (fieldVoValue != null) {
                l.add(fieldVoValue.value());
            }
        }
        return list.toArray(new String[list.size()]);
    }

 

3.어노테이션을 이용하는 코드를 수행한다.

getAnnoValue(MobileProcDto.class)를 호출할 경우

{"소속","사원이름","fax번호","메모"} 의 결과가 리턴됨을 확인할수있다.

Comments