어노테이션을 사용하는 이유 (효과) 는 무엇일까?

  1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공

    소스 코드에 메타데이터를 추가하여 컴파일러에게 추가적인 정보를 제공합니다. 이를 통해 컴파일러는 코드 작성 문법 에러를 감지하고 개발자에게 미리 알려줄 수 있습니다. 예를 들어, 잘못된 변수 유형 또는 부적절한 메서드 사용과 같은 오류를 방지할 수 있습니다.

  2. 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공

    개발 도구는 코드의 구조를 이해하고 자동으로 필요한 작업을 수행할 수 있습니다. 예를 들어, 데이터베이스 연결 정보나 웹 서비스 엔드포인트와 같은 설정 정보를 어노테이션으로 전달하여 자동으로 코드를 생성하거나 구성할 수 있습니다.

  3. 실행시(런타임시) 특정 기능을 실행하도록 정보를 제공

    런타임에 특정 기능을 실행하도록 정보를 제공할 수 있습니다. 이를 통해 어노테이션이 지정된 코드 블록이나 메서드에 대해 특정 작업을 수행하도록 할 수 있습니다. 예를 들어, 보안 검사, 로깅, 트랜잭션 관리 등과 같은 기능을 어노테이션으로 정의하여 실행시에 자동으로 적용할 수 있습니다.

나만의 어노테이션은 어떻게 만들 수 있을까?

1. 어노테이션 생성

public @interface RestControllerWithSwagger {
    
}

2.메타 어노테이션 추가

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface RestControllerWithSwagger {

}

@Taget

@Taget에는 어떤 값(클래스, 필드, 메서드…)에 어노테이션을 적용할 것인지 넣을 수 있다.

ElementType 열거상수 적용 대상
TYPE 클래스, 인터페이스, 열거타입
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메소드
LOCAL_VARIABLE 로컬 변수
PACKAGE 패키지

@Retention

@Retention에는 어노테이션 값을 언제까지 유지할 것인지 입력한다.

보통 어노테이션은 Runtime시에 많이 사용된다.

RetentionPolicy열거상수 설명
SOURCE 소스상에서만 어노테이션 정보를 유지한다. 소스코드를 분설할 때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다.
CLASS 바이트코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이요해서 어노테이션 정보를 얻을 수는 없다.
RUNTIME 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임에 어노테이션 정보를 얻을 수 있다.

@Inherited

하위 클래스에도 적용가능하도록 하는 어노테이션

@Documented

javadoc에 의해 문서화가 되도록 하는 어노테이션