1. 정의
- 자바 및 Spring에서 코드에 메타데이터를 추가하는 문법
- 컴파일러, 런타임 환경, 프레임워크 등에 정보를 전달하기 위해 사용
- 프로그램에 부가적인 설명을 붙이는 일종의 라벨 역할
2. 목적
- 메타데이터 제공 → 코드에 대한 부가 정보를 전달
- 코드 간소화 → XML 설정 없이 어노테이션으로 기능 지정 가능
- 가독성 향상 → 코드의 목적과 사용 방식을 한눈에 이해 가능
- 유지보수 편의성 → 설정이 코드와 함께 있어 관리 용이
3. 종류
(1) 표준 어노테이션 (Java 기본 제공)
@Override : 상위 클래스(또는 인터페이스) 메서드를 재정의할 때 사용
@Deprecated : 더 이상 사용하지 않는 코드임을 표시
@SuppressWarnings : 컴파일 경고를 무시
@FunctionalInterface : 람다식에서 사용 가능한 함수형 인터페이스임을 표시
@Override
public String toString() {
return "Example";
}
(2) 메타 어노테이션 (어노테이션을 위한 어노테이션)
- 어노테이션을 정의하거나 동작을 제어하는 역할.
- 자바 기본 + 프레임워크 제공.
@Retention : 어노테이션의 유지 기간 설정.
- RetentionPolicy.SOURCE → 컴파일 시 제거 (코드 분석용)
- RetentionPolicy.CLASS → .class 파일에 포함, 실행 시 사용 X
- RetentionPolicy.RUNTIME → 런타임까지 유지 (Reflection으로 사용 가능)
@Target : 어노테이션 적용 위치 지정.
- ElementType.METHOD → 메서드에 적용
- ElementType.TYPE → 클래스, 인터페이스, 열거형 등에 적용
- ElementType.FIELD → 멤버 변수에 적용
- ElementType.PARAMETER → 매개변수에 적용
- ElementType.CONSTRUCTOR → 생성자에 적용
(3) 프레임워크 어노테이션
Spring 예시
- @Controller : 해당 클래스를 컨트롤러로 등록
- @RestController : JSON/XML 반환하는 컨트롤러 등록
- @Autowired : 의존성 주입(DI)
- @RequestMapping : HTTP 요청 URL 매핑
서블릿 예시:
- @WebServlet("/url") : 특정 URL 요청을 처리하는 서블릿 지정
4. 어노테이션 만들기
- @interface 키워드 사용.
- @Retention, @Target 등 메타 어노테이션으로 속성 지정.
- 기본값(default) 지정 가능.
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface MyTag {
String name() default "기본값";
int version() default 1;
}
5. 메타데이터
(1) 정의
- 프로그램에 추가적인 설정 데이터를 삽입해, 코드 실행 방식이나 동작 조건을 정의하는 정보.
(2) 목적
- 코드 자체와 분리된 설정/명세를 제공.
- 동적 기능(Reflection, 런타임 분석 등) 구현 가능.
(3) 동작 구조
- 컴파일 단계에서 .java → .class 변환.
- .class 내부에 어노테이션 정보 저장 (Retention 설정에 따라 달라짐).
- 리플렉션(Reflection) 으로 런타임 시 읽어서 동작 제어.
Class<?> clazz = Class.forName("com.example.MyClass");
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation anno = clazz.getAnnotation(MyAnnotation.class);
System.out.println(anno.value());
}
