Spring

[Spring] @Retention

줘니(•̀ᴗ•́)و 2024. 3. 20. 15:49
728x90

 

 

 

* @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;			// 순서
}

 

 

 

 

 

728x90