Spring Boot

어노테이션(Annotation)

귤장수 2025. 5. 13. 16:06
반응형

 

어노테이션(Annotation)

이번 SpringBoot 공부하면서 어노테이션을 많이 사용하는데, 정확하게 무엇인지 잘 이해가 안가서 이를 학습하고,

정리 내용을 GPT의 도움을 받아 한번 더 정리하였다.

어노테이션 개요

  • 정의 : 코드 요소(클래스·메서드·필드 등)에 부가적인 메타데이터(metadata)를 붙이는 기능
  • 용도
    • XML 주석·Marker Interface 대체
    • 의존성 주입, ORM 매핑, AOP, 검증, API 라우팅 등
  • 문법
    • @어노테이션이름(속성 = 값, …)
    • 사용자 정의
// 어노테이션 정의
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value();
    int number() default 0;
}

2. 어노테이션의 분류

  1. Marker Annotation
    • 속성이 없는 순수 “표식”
    • 예: @Override, @Deprecated
  2. Single-Value Annotation
    • 멤버가 하나뿐인 경우, 이름 생략 가능
    • 예: @SuppressWarnings("unchecked")
  3. Full Annotation
    • 여러 개의 속성을 가짐
    • 예:
    • @RequestMapping(path="/users", method=RequestMethod.GET, produces="application/json")

3. 메타 어노테이션

어노테이션을 정의할 때 붙일 수 있는 어노테이션을 의미.

메타 어노테이션 설명

@Retention 어노테이션 유지 범위 지정(SOURCE, CLASS, RUNTIME)
@Target 적용 가능한 코드 요소 지정 (TYPE, METHOD, FIELD, PARAMETER 등)
@Documented javadoc 생성 시 포함 여부
@Inherited 상속 관계에서 자식 클래스에 자동 전파 여부
@Repeatable 동일 어노테이션을 복수 적용 가능하게 함
@Retention(RetentionPolicy.RUNTIME)      // 런타임까지 유지
@Target({ElementType.TYPE, ElementType.METHOD})
@Inherited
@Documented
@Repeatable(MyAnnotations.class)
public @interface MyAnnotation {
    String value();
}

4. Retention 정책

정책 설명

SOURCE 컴파일 후 .class에 남지 않음 (소스 코드 수준에서만 유효)
CLASS .class에는 남지만 런타임에 로드 시 제거 (기본값)
RUNTIME JVM이 로드한 뒤에도 남아 reflection으로 조회 가능

5. 동작 원리

5.1 컴파일 타임

  1. 어노테이션 처리(Annotation Processing)
    • javax.annotation.processing.Processor 구현체가 @SupportedAnnotationTypes 로 지정된 어노테이션을 스캔
    • roundEnv.getElementsAnnotatedWith() 등을 통해 대상 요소 정보 수집
    • 코드 생성, 검증(에러·경고 표시) 수행
  2. 바이트코드 저장
    • @Retention(CLASS | RUNTIME) 어노테이션 정보가 .class 파일의 RuntimeVisibleAnnotation 또는 RuntimeInvisibleAnnotation 속성에 기록

5.2 런타임

  1. 클래스 로딩
    • JVM이 .class 파일을 로드하면서 어노테이션 속성도 함께 메모리에 적재
  2. 리플렉션 호출
    • Class<?> c = Class.forName(”com.example.User”);
    • c.getAnnotation(MyAnnotation.class) 또는 method.getAnnotations() 등으로 어노테이션 읽기
    • 프레임워크(스프링·하이버네이트 등)가 이 정보에 따라 동적 로직(의존성 주입, 트랜잭션 트래킹, REST 엔드포인트 설정 등)을 수행

6. 요약

  • 어노테이션 정의 → @interface + 메타 어노테이션
  • 컴파일 시
    • 애노테이션 프로세서로 추가 검증·코드 생성
    • .class 파일에 메타데이터 저장
  • 런타임 시
    • JVM이 어노테이션 정보 로드
    • Reflection API로 읽어 비즈니스 로직에 반영

이 과정을 통해 “반복적인 설정 코드”를 줄이고, 구성(configuration)비즈니스 로직을 명확히 분리 가능.

반응형