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. 어노테이션의 분류
- Marker Annotation
- 속성이 없는 순수 “표식”
- 예: @Override, @Deprecated
- Single-Value Annotation
- 멤버가 하나뿐인 경우, 이름 생략 가능
- 예: @SuppressWarnings("unchecked")
- 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 컴파일 타임
- 어노테이션 처리(Annotation Processing)
- javax.annotation.processing.Processor 구현체가 @SupportedAnnotationTypes 로 지정된 어노테이션을 스캔
- roundEnv.getElementsAnnotatedWith() 등을 통해 대상 요소 정보 수집
- 코드 생성, 검증(에러·경고 표시) 수행
- 바이트코드 저장
- @Retention(CLASS | RUNTIME) 어노테이션 정보가 .class 파일의 RuntimeVisibleAnnotation 또는 RuntimeInvisibleAnnotation 속성에 기록
5.2 런타임
- 클래스 로딩
- JVM이 .class 파일을 로드하면서 어노테이션 속성도 함께 메모리에 적재
- 리플렉션 호출
- Class<?> c = Class.forName(”com.example.User”);
- c.getAnnotation(MyAnnotation.class) 또는 method.getAnnotations() 등으로 어노테이션 읽기
- 프레임워크(스프링·하이버네이트 등)가 이 정보에 따라 동적 로직(의존성 주입, 트랜잭션 트래킹, REST 엔드포인트 설정 등)을 수행
6. 요약
- 어노테이션 정의 → @interface + 메타 어노테이션
- 컴파일 시
- 애노테이션 프로세서로 추가 검증·코드 생성
- .class 파일에 메타데이터 저장
- 런타임 시
- JVM이 어노테이션 정보 로드
- Reflection API로 읽어 비즈니스 로직에 반영
이 과정을 통해 “반복적인 설정 코드”를 줄이고, 구성(configuration)과 비즈니스 로직을 명확히 분리 가능.
반응형