1 minute read

목표

자바의 애노테이션에 대해 학습하세요.

학습할 것 (필수)

애노테이션 정의하는 방법

Annotation: 메타데이터(Metadata) 즉 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보

패키지명이나 클래스 선언, 메소드 선언, 인자값 선언 앞에 붙이며, @이름(인자) 으로 사용할 수 있다.

애노테이션의 용도

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공 (@Override)
  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공 (@Getter, @Setter)
  • 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공 (@Controller)
public @interface myannotation { // @interface를 사용하여 정의
    String value(); 
}

@Retention

애노테이션 유지정책으로 사용 시 어디까지 유지할 것인지를 지정한다.

java.lang.annotation.RetentionPolicy.java

enum Description
SOURCE 소스상에서만 애노테이션 정보를 유지 소스 코드를 분석할때만 의미가 있고, 바이트 코드 파일에는 정보가 남지 않음
CLASS 바이트 코드 파일까지 애노테이션 정보를 유지 리플렉션을 이용해 애노테이션의 정보를 얻을 수는 없음
RUNTIME 바이트 코드 파일까지 애노테이션 정보를 유지 리플렉션을 이용해 애노테이션의 정보를 얻을 수 있음
@Retention(RetentionPolicy.SOURCE)
public @interface myannotation{
    String value();
}

@Target

애노테이션이 적용될 대상을 지정할 때 사용하며, ElementType의 열거상수를 배열 값으로 가질 수 있다.

java.lang.annotation.ElementType.java

enum Description
TYPE 클래스, 인터페이스, 열거타입
FIELD 필드
METHOD 메소드
PARAMETER 파라미터
CONSTRUCTOR 생성자
LOCAL_VARIABLE 로컬 변수
ANNOTATION_TYPE 애노테이션 타입
PACKAGE 패키지
TYPE_PARAMETER 타입 파라미터
TYPE_USE 타입 사용
@Target(value = {ElementType.FIELD, ElementType.METHOD})
public @interface myannotation{
    String value();
}

@documented

애노테이션을 사용한 코드의 문서에 그 애노테이션에 대한 정보를 표기할지를 결정한다.

애노테이션 프로세서

컴파일 단계에서 애노테이션을 분석하고 처리하기 위해 자바 컴파일러 플러그인의 일종

동작 구조

  1. 애노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행한다.
  2. 애노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 애노테이션 프로세서를 실행한다.
  3. 애노테이션 프로세서 내부에서 애노테이션에 대한 처리를 한다.
  4. 자바 컴파일러가 모든 애노테이션 프로세서가 실행 되었는지 검사하고, 모든 애노테이션 프로세서가 실행되지 않았다면 반복한다.

참고 서적


live-study with whiteship