본문 바로가기
프로그래밍/알아보자 시리즈

[Spring] @Retention에 대하여..

by 노잼인간이라불립니다 2023. 2. 25.

얼마 전 Mapstruct를 사이드 프로젝트를 적용 하면서 삽질을 한 경험이 있다.

 

삽질을 하면서 코드도 까보고 하다보니 @Retention에 대해서 검색하게 되었고,

 

지금 까지 @Retention에 대해서 무지했던 나를 반성하면서 이번기회에 정리해보고자 한다.

 

일단 Retention이라는 영어단어의 뜻은 '보유' 라는 뜻이다. 

 

동의어로는 holding, hold, tenure, supplement, enjoyment 등이 있다.

 

지금까지 살펴본 바로는 @Retention이라는 어노테이션은

 

우리가 DI해서 사용하는 어노테이션 안에 설정되어 있다.

 

lombok의 Getter

설정 값을 보면 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