* @Retention
: @Retention은 자바 어노테이션을 정의할 때 사용되며, 해당 어노테이션의 유효 범위를 지정한다.
즉, 어느 시점에 해당 어노테이션 정보를 유지할 것인지를 결정한다.
* RetentionPolicy 3가지(어노테이션이 사용되는 시점 정하기)
1. RetentionPolicy.SOURCE
: 컴파일러에 의해 처리되며, 클래스 파일에는 포함되지 않는다.
즉, 소스 코드 레벨에서만 유효하고 런타임에는 존재하지 않는다.
런타임 때는 필요하지 않고 컴파일 할 때만 필요한 정보 → 주로 소스 코드 분석이나 프로세스 도구를 위한 어노테이션으로 사용
2. RetentionPolicy.CLASS
: 컴파일러에 의해 처리되며, 클래스 파일에는 포함된다.
하지만, 런타임 시에는 클래스 파일에 포함된 어노테이션 정보가 로드되진 않는다.
주로 리플렉션을 사용하지 않는 환경에서 사용되며, 클래스 파일에는 어노테이션 정보가 필요한데 런타임에는 필요하지 않을 때 유용하다.
3. RetentionPolicy.RUNTIME
: 컴파일러에 의해 처리되며, 클래스 파일에도 포함된다.
런타임 시 해당 어노테이션 정보가 로드되어 사용할 수 있다.
주로 런타임에 동적으로 객체를 생성하거나 처리할 때 사용하고, 리플렉션을 통해 어노테이션 정보를 읽어오는 데 활용된다.
ex)
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
// 어노테이션 요소 정의
}
* 어노테이션으로 설정된 정보는 어디에 사용?
- 웹 애플리케이션에서 메뉴 구성
: 예를 들어, 메뉴의 이름, 링크 URL, 표시 순서 등의 정보를 읽어와서 관리자 페이지나 사용자 인터페이스에 메뉴로 표시할 수 있다.
- 권한 관리
: 특정한 기능이나 메뉴에 접근할 때 필요한 권한 정보를 어노테이션에 설정하고 해당 기능에 대한 접근을 제어할 수 있다.
- 보안
: 특정 기능에 대한 접근을 제한할 수 있다.
- 동적 코드 생성
: 특정한 어노테이션 정보를 읽어와서 해당하는 코드를 동적으로 생성하거나 조작할 수 있다.
* 런타임에 어노테이션 정보가 필요한 이유는 뭐지?
: 프로그램의 동적인 동작을 조정하거나 제어하기 위해서. 프로그램의 유연성과 확장성을 높일 수 있다.
- 리플렉션(Reflection)을 통한 동적 처리
: 어노테이션 정보를 리플렉션을 통해 동적으로 읽어와서 해당 정보에 따라 프로그램 동작을 변경하거나 조작할 수 있다.
- 메타데이터 활용
: 자바 프로그램에서 소스 코드에 메타데이터를 추가하는 기능을 제공한다. 이러한 메타데이터는 프로그램의 런타임 동작을 조정하거나 제어하는 데 사용될 수 있다.
ex)
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class MyClass {
public static void main(String[] args) throws Exception {
// 대상 클래스나 메서드에 대한 정보 가져오기
Method method = MyClass.class.getMethod("login");
// 메서드에 붙은 @IncludedInfo 어노테이션 가져오기
IncludedInfo annotation = method.getAnnotation(IncludedInfo.class);
if (annotation != null) {
// 어노테이션에 정의된 정보 읽어오기
String name = annotation.name();
String url = annotation.url();
int order = annotation.order();
// 읽어온 정보 사용하기
System.out.println("Name: " + name);
System.out.println("URL: " + url);
System.out.println("Order: " + order);
} else {
System.out.println("IncludedInfo annotation not found");
}
}
@IncludedInfo(name = "로그인", listUrl = "/login.do", order = 1)
public void login() {
// 메서드 내용
}
}
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface IncludedInfo {
String name() default ""; // 컴포넌트의 이름
String listUrl() default ""; // URL
int order() default 0; // 순서
}
'Spring' 카테고리의 다른 글
[Spring] WAS가 도대체 뭔데? (1) | 2024.04.11 |
---|---|
[Spring] WebApplicationInitializer.java & ServletContextListener.java (0) | 2024.03.22 |
[SQL] 데이터가 없으면 INSERT, 있으면 UPDATE (같은 데이터 중복 삽입 해결) (1) | 2024.01.24 |
Springboot 파일업로드 (0) | 2024.01.16 |
Springboot 페이징 (0) | 2024.01.16 |