얼마 전 Mapstruct를 사이드 프로젝트를 적용 하면서 삽질을 한 경험이 있다.
삽질을 하면서 코드도 까보고 하다보니 @Retention에 대해서 검색하게 되었고,
지금 까지 @Retention에 대해서 무지했던 나를 반성하면서 이번기회에 정리해보고자 한다.
일단 Retention이라는 영어단어의 뜻은 '보유' 라는 뜻이다.
동의어로는 holding, hold, tenure, supplement, enjoyment 등이 있다.
지금까지 살펴본 바로는 @Retention이라는 어노테이션은
우리가 DI해서 사용하는 어노테이션 안에 설정되어 있다.
설정 값을 보면 RetentionPolicy.SOURCE 라고 적혀 있다.
이 말인 즉슨
이 getter 어노테이션이 소스 단 까지 유지된다는 것이다.
즉, 컴파일이 이루어지면 이 어노테이션은 사라진다.
대신 Getter 코드가 자동으로 생성되어 class파일에 저장될 것이다.
즉,
@Retention은 이 어노테이션이 어느단계까지 살아 있을 까를 결정하는 어노테이션이라고 볼 수 있겠다.
참고로
SOURCE는 .java까지 유지되고,
ex) Lombok(롬복이 바이트 코드를 생성해서 넣어줌.)
CLASS는 .class파일 까지 유지되고,
ex) Mapstruct (jar파일에는 소스코드가 없다, .class 파일만 포함되어 있음.)
RUNTIME은 런타임 환경까지 유지된다.
ex) @Component, @Service...
(런타임 환경에서 Reflection API을 이용하여 어노테이션이 달린 것을 인식하고, 빈으로 만들어 관리한다.)
참고자료
https://jeong-pro.tistory.com/234
https://stackoverflow.com/questions/38975073/retention-of-java-type-checker-annotations
https://jake-seo-dev.tistory.com/67
@Retention of Java type checker annotations
The Java 8 type annotations (JSR 308) allow type checkers to perform static code analysis. For example, The Checker Framework can check for possible nullness via @NonNull annotations. Various pro...
stackoverflow.com
아무 관심 없던 @Retention 어노테이션 정리(RetentionPolicy SOURCE vs CLASS vs RUNTIME)
@Retention annotation 관심 갖게 된 이유 자바에서 지향하는 방법은 아니지만 필요에 의해서 커스텀 애노테이션(Annotation)을 만들어야 할 때가 있습니다. 보통 예제 샘플 코드를 보면 메타 애노테이션
jeong-pro.tistory.com
'프로그래밍 > 알아보자 시리즈' 카테고리의 다른 글
[Spring] JAVA Reflection API가 궁금하다! (0) | 2023.02.25 |
---|---|
[JPA] MapStruct를 써야 하는 이유 (0) | 2023.02.19 |