얼마 전 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
'프로그래밍 > 알아보자 시리즈' 카테고리의 다른 글
[Spring] JAVA Reflection API가 궁금하다! (0) | 2023.02.25 |
---|---|
[JPA] MapStruct를 써야 하는 이유 (0) | 2023.02.19 |