일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- proxy pattern
- Interceptor
- Spring Security
- 스프링부트
- aspect
- 인터셉터
- 객체지향프로그래밍
- 디자인패턴
- 트랜잭션
- http
- aop
- request
- spring boot
- Filter
- OOP
- 스프링
- RestControllerAdvice
- 관점지향프로그래밍
- 스프링 시큐리티
- Spring
- exception
- SQL
- response
- git
- Redis
- MYSQL
- 자바
- mybatis
- java
- network
- Today
- Total
장쫄깃 기술블로그
[Spring Boot] Meta Annotation (@Target, @Retention) 본문
[Spring Boot] Meta Annotation (@Target, @Retention)
장쫄깃 2022. 6. 26. 02:02
들어가며
Spring 에서는 Annotation 사용에 대한 기능을 많이 제공하고 있다. @Controller, @Service, @Component, @Repository 등 많은 Annotation이 존재한다. 해당 Annotation은 각 기능에 필요한 만큼 많은 기능을 내포하고 있으며, 이러한 내용을 잘 알지 못해도 필요한 기능만 쉽게 사용할 수 있도록 제공되어지고 있다.
하지만 이러한 Annotation에 대해 불필요한 내용이 포함되거나 새롭게 필요한 내용이 있는 경우 Custom을 하기도 한다.
그 중 주로 사용되는 @Target과 @Retention에 대해 알아보도록 하겠다.
Meta-Annotation
meta-annotation은 다른 annotation 에서도 사용되는 annotation의 경우를 말하며 custom-annotation을 생성할 때 주로 사용된다.
예를 들어, @Service은 bean으로 등록해주기 위해 @Component를 내표하고 있는 형태로, 여기서 @Component가 meta-annotation이다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component // Spring will see this and treat @Service in the same way as @Component
public @interface Service {
// ....
}
이런 meta-annotation 중 @Target과 @Retention에 대해서 알아보도록 하겠다.
@Target
@Target은 Java Compiler가 annotation이 어디에 적용될지 결정하기 위해 사용한다.
예를 들어, 위에서 사용한 @Service의 ElememtType.TYPE은 해당 annotation은 타입 선언 시 사용한다는 의미이다.
- ElementType.PACKAGE : 패키지 선언
- ElementType.TYPE : 타입 선언
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
- ElementType.CONSTRUCTOR : 생성자 선언
- ElementType.FIELD : 멤버 변수 선언
- ElementType.LOCAL_VARIABLE : 지역 변수 선언
- ElementType.METHOD : 메소드 선언
- ElementType.PARAMETER : 매개변수 선언
- ElementType.TYPE_PARAMETER : 전달인자 타입 선언
- ElementType.TYPE_USE : 타입 선언
@Retention
@Retention은 annotation이 실제로 적용되고 유지되는 범위를 의미한다.
Policy에 관련된 annotation으로, 컴파일 이후에도 JVM에서 참조가 가능한 RUNTIME으로 지정한다.
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해서 계속 참조가 가능
- 주로 reflection이나 logging에 많이 사용
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
- RetentionPolicy.SOURCE : 컴파일 전까지 유효
- 컴파일 이후에는 사라짐
참고
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Retention.html
https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.htmlhttps://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch29s03.html
https://sanghye.tistory.com/39
'Spring Framework > Spring Boot' 카테고리의 다른 글
[Spring Boot] @RestControllerAdvice 란 (2) | 2022.09.25 |
---|---|
[Spring Boot] MyBatis란? (0) | 2022.07.03 |
[Spring Boot] 등록되는 빈의 순서를 정하자 (@DependsOn) (0) | 2022.06.26 |
[Spring Boot] 의존성 주입 시 Bean이 여러개라면? (@Primary, @Qualifier) (0) | 2022.06.26 |
[Spring Boot] request, response 한 번만 읽어올 수 있는 제약 해결 (0) | 2022.04.19 |