본문 바로가기
Programming/Java * Spring

[Java] 16. Annotation의 개념과 활용

by 고막고막 2019. 6. 3.

개념

*애노테이션(Annotation)
; 일명 메타 데이터, JDK5에 포함

*용도
1) 컴파일러에 정보를 알려준다
2) 컴파일할때와 설치시의 작업을 지정한다
3) 실행할 때 별도의 처리가 필요할 때
4) 환경설정 파일을 대신할 때

*java standard version
@Override : 인터페이스, 추상클래스 상속시
@Deprecated : 더이상 유효하지 않은, 사용 안 했으면
@SuppressWarnings : error(무조건 고쳐야 실행됨), warning(실행은 되지만 위험성을 경고)

*java Enterprise edition
@WebServlet
...
@Target.키워드 (적용대상)
    - TYPE : 클래스/인터페이스/열거형
    - ANNOTATOIN_TYPE : 어노테이션
    - FIELD : 필드
    - CONSTRUCTOR : 생성자
    - METHOD : 매서드
    - LOCAL_VARIABLE : 로컬 변수
    - PACKAGE : 패키지

*애노테이션 유지정책
;애노테이션 정보가 언제까지 살아있는가? 
@Rentention(RententionPolicy.키워드)
    - SOURCE : 소스상에서만 어노테이션 정보 유지
    - CLASS : 바이트 코드 파일까지 어노테이션 정보 유지
    - RUNTIME : 실행할 때 Reflection API 정보를 얻을 수 있다

*리플렉션 API를 통해 현재 실행중인 프로그램의 필드,생성자,매서드,클래스 등등의 정보를 얻을 수 있다
    - Field[] getFields()     : 필드정보를 Filed 배열로 리턴
    - Constructor[] getConstructor() : 생성자 정보를 Constructor 배열로 리턴
    - Method[] getDeclareMethod()    : 매서드 정보를 Method 배열로 리턴

*다양한 내장 매서드
    - boolean isAnnotationPresentation(Class<? extends Annotation> annotationClass)
      : 지정한 어노테이션이 적용되었는지 여부를 반환
    - Annotation getAnnotation(Class annotationClass)
      : 지정한 어노테이션이 적용되어 있으면 어노테이션을 리턴하고, 그렇지 않으면 null을 리턴한다
    - Annotation[ ] getAnnotation()
      : 적용된 모든 어노테이션을 리턴한다
    - Annotation[ ] getDeclaredAnnotations()
      : 직접 적용된 모든 어노테이션을 리턴한다

예제

  1) 어노테이션 선언

import java.lang.annotation.*;

@Target(ElementType.METHOD)			/*매서드가 적용대상이고*/
@Retention(RetentionPolicy.RUNTIME)		/*실행시에 PrintAnnotation 정보를 리플렉션으로 얻을 수 있다(유지됨)*/
public @interface PrintAnnotation {
	String value() default " - ";
	int number() default 15;
}

 2) 어노테이션 설정

public class Service {
	
	@PrintAnnotation		// value="-", number=15
	public void method1() {
		System.out.println("실행 내용 1");
	}
	
	@PrintAnnotation("*")		// value="*", number=15
	public void method2() {
		System.out.println("실행 내용 2");
	}
	
	@PrintAnnotation(value="#", number=20)
	public void method3() {
		System.out.println("실행 내용 3");
	}
	
}

 3) 어노테이션 출력

import java.lang.reflect.Method;

public class PrintAnnotationTest {
	public static void main(String[] args) {
		// service 클래스로부터 매서드 정보를 얻음
		Method[] dMethods = Service.class.getDeclaredMethods();
		for(Method method: dMethods) {
			// 이 매서드에 어노테이션이 적용되어 있니?
			if(method.isAnnotationPresent(PrintAnnotation.class)) {
				// PrintAnnotation 객체 가져오기
				PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class);
				// 정보(해당 매서드의 이름) 출력
				System.out.println("["+method.getName()+"]");
				// 구분선 출력
				for(int i=0; i< printAnnotation.number(); i++) {
					System.out.println(printAnnotation.value());
				}
				System.out.println();
				
				// 매서드 호출
				try {
					method.invoke(new Service());
				} catch (Exception e) {
					e.printStackTrace();
				}			
			}	
		}
	}
}

 4) 출력 결과