Annotation이란?
- Java 소스 코드에 추가하여 사용할 수 있는 메타 데이터의 일종
- 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할
- 런타임 시 특정 기능을 실행하도록 정보를 제공
- 코드의 생산성을 증가
- 코드량을 감소
- 유지보수에 용이
Annotation 정의
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보 유지되는 대상])
public @interface [어노테이션 이름] {
...
}
- Annotation Name: 어노테이션을 정의할 때는 @interface
- Target: 어노테이션의 적용 대상
- ElementType.TYPE (class, interface, enum)
- ElementType.FIELD (instance variable)
- ElementType.METHOD
- ElementType.PARAMETER
- ElementType.CONSTRUCTOR
- ElementType.LOCAL_VARIABLE
- ElementType.ANNOTATION_TYPE (on another annotation)
- ElementType.PACKAGE (remember package-info.java)
- Retention: 어노테이션이 유지되는 대상
- RetentionPolicy.SOURCE : 이 어노테이션은 컴파일이 완료된 후에는 의미가 없으므로, 바이트 코드에 기록되지 않음. 소스에만 반영되어 컴파일러에 의해 삭제된다. 예시) @Override
- RetentionPolicy.CLASS : default 값. 컴파일 타임 때만 .class 파일에 존재하며, 런타임때는 없어집니다. 바이트 코드 레벨에서 어떤 작업을 해야할 때 유용합니다. Reflection 사용이 불가능.
- RetentionPolicy.RUNTIME : 이 어노테이션은 런타임시에도 .class 파일에 존재. 커스텀 어노테이션을 만들 때 주로 사용. Reflection 사용 가능.
잠깐! Refelction 이란?
구체적인 Class Type을 알지 못하더라도 해당 Class의 method, type, variable들에 접근할 수 있도록 해주는 자바 API이며, 컴파일된 바이트 코드를 통해 Runtime에 동적으로 특정 Class의 정보를 추출할 수 있는 프로그래밍 기법
Annotation의 동작 원리 분석 - @Controller
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
@Target(ElementType.TYPE):
- 이 어노테이션은 클래스 레벨에서만 사용 가능하며, 메서드 또는 필드에는 적용할 수 없음.
@Retention(RetentionPolicy.RUNTIME):
- 어노테이션이 실행 시간(Runtime)까지 유지됨. Reflection을 통해 어노테이션 정보에 접근할 수 있음.
@Documented:
- Java 문서 (Javadoc)에 이 어노테이션을 사용한 클래스나 메서드에 대한 설명이 자동으로 포함
@Component:
- 이 어노테이션은 해당 클래스가 스프링 애플리케이션 컨텍스트에 등록되어 관리되어야 함.
- 스프링 프레임워크에서 컴포넌트 스캔(Component Scanning)을 통해 빈(Bean)으로 등록되는 클래스.
@AliasFor(annotation = Component.class):
- @Controller 어노테이션을 사용할 때 value 속성을 설정하면 @Component 어노테이션의 value 속성도 설정된 것으로 간주.
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
DTO는 어떻게 관리하는게 좋을까? 에 대한 고민과 해결책 (0) | 2024.02.21 |
---|---|
Springboot 프로젝트에서 에러 메시지를 클래스로 관리하기 (0) | 2024.02.21 |
Spring Security | 비밀번호 변경 기능 구현 하기 (0) | 2023.08.11 |
Spring Security | 회원정보 수정 기능 구현 (0) | 2023.08.11 |
Spring Security | PasswordEncoder를 사용하여 회원가입시 비밀번호 암호화 하기 (0) | 2023.08.11 |