어노테이션(Annotation)
어노테이션은 애플리케이션이 처리해야 할 데이터가 아닌, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보이다.
어노테이션은 클래스, 인터페이스, 어노테이션, 필드, 생성자, 메서드 등 여러 곳에 적용될 수 있다.
어노테이션은 대게 아래 세 가지 용도로 사용된다.
코드 문법 에러 체크
어노테이션은 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공한다.
예로 @Override 어노테이션이 메서드 앞에 명시된 경우, 이는 해당 메서드가 오버라이드 된 메서드임을 컴파일러에게 알려주는 것이다. 컴파일러는 @Override 어노테이션을 보고 그 메서드가 오버라이드 된 것인지 확인한다. 그리고 오버라이드 된 메서드가 아닌 경우 컴파일 에러를 발생시킨다.
빌드나 배치 시 코드를 자동으로 생성
어노테이션은 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
lombok 라이브러리를 예시로 들었을 때, @Getter, @Setter, @AllArgsConstructor와 같은 어노테이션들이다. 해당 어노테이션이 클래스에 붙어있다면 Getter, Setter 메서드와 생성자를 자동으로 생성해준다.
런타임 시간에 특정 기능 실행
어노테이션은 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공한다.
스프링 프로젝트 때 컨트롤러, 서비스 등 클래스의 역할을 정의하기 위해 @Controller, @Service와 같은 어노테이션을 사용한다.
어노테이션 타입 정의
앞서 어노테이션 소개 때 어노테이션이 어노테이션에 적용될 수 있다고 했는데, 하나의 예시로 자신이 직접 어노테이션을 생성할 때 직접 만든 어노테이션에 어노테이션을 적용할 수 있다.
어노테이션은 인터페이스를 정의하는 것과 유사하다. @interface 어노테이션을 사용하여 어노테이션을 정의하고, 그 뒤에 어노테이션 이름을 작성한다.
// 어노테이션 정의
public @interface MyAnnotation {}
// 정의한 어노테이션 사용
@MyAnnotation
정의한 어노테이션에 어노테이션이 적용될 대상을 지정할 때는 @Target 어노테이션을 사용하고, 어노테이션 유지 정책을 설정하기 위해 @Retention 어노테이션을 사용할 수도 있다.
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}