Spring

태태개발일지 - 어노테이션

태태코 2024. 12. 9. 15:01
반응형

어노테이션(@Annotation)

 

이번 주제는 간단하게 기억하기 위한 정리이다.

 

어노테이션을 만들 때는 아래와 같은 두가지 정보가 필요하다.

 

1. Target

@Target은 Method, class, enum , interface등 어노테이션이 적용될 수 있는 type을 의미하는 것이고,

@Target(ElementType.TYPE) 하면 모두 적용된다.

 

2.  Retention

@Retention 애노테이션은 애노테이션의 라이프 사이클 즉, 애노테이션이 언제까지 살아 남아 있을지를 정하는 것이다.

 

RetentionPolicy.SOURCE : 소스 코드(.java)까지 남아있는다.

RetentionPolicy.CLASS : 클래스 파일(.class)까지 남아있는다.(=바이트 코드)

RetentionPolicy.RUNTIME : 런타임까지 남아있는다.(=사실상 안 사라진다.)

 

말 그대로 이해하면 되는것이다.

 

소멸 시점

1. SOURCE는 컴파일 시점에 사라진다. ex) @Getter @Setter

하지만 @Getter , @Setter은 Lombok에서 자동으로 바이트코드로 변환시켜주기때문에 컴파일 이후 시점까지 남아있을 필요가 없기 때문이다.

 

2. CLASS 파일은 런타임 시점 전까지 남아있다. ex) @NonNull 

 

3. RUTIME 런타임 시점에도 남아있다. ex) @Autowired 같은 런타임 시점에도 남아 있어야 하는 어노테이션을 의미한다.

 

 

클래스 정책을 사용하는 이유??

 

컴파일 전 IDE에서 @NonNull이라는 어노테이션이 붙어있다면, Null을 입력했을 시에 빨간줄이 생기게된다. 그러면 Source로 설정해도 되지않나? 라고 생각할 수 있다.

하지만 Zip파일이나 Jar파일에는 class 파일만 존재하기 때문에,

 .class 파일만 존재하는 라이브러리 같은 경우에도 타입체커, IDE 부가기능 등을 사용할수 있으려면 CLASS 정책이 필요하게 된다.

그이유는 SOURCE 정책으로 사용한다면 컴파일된 라이브러리의 jar 파일에는 어노테이션 정보가 남아있지 않기 때문이죠.

 

반응형