java/Spring

RequestMapping Annotation 구현

킨글 2022. 12. 18. 18:04

리플렉션을 활용하여 간단하게 RequestMapping을 구현해보아야겠다.

 

Annotation 생성 코드

- @Target(value = ElementType.METHOD)를 통해서 메소드 위에 사용할 Annotation임을 명시해준다.

- @Retention(RetentionPloicy.RUNTIME)을 통해서 해당 어노테이션의 생명 주기를 지정해 준다.
여기서는 RUNTIME 으로 썻기 때문에 런타임 시에까지 계속 지정이 된다. 

package Custom;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RQ {
    String url();
}

 

메소드 위에 Annotation을 선언해준다.

package Custom;

public class People {
    @RQ(url = "test")
    public void method1(){
        System.out.println("test");
    }

    @RQ(url = "add")
    public void method2(){
        System.out.println("add");
    }
}

 

선언한 Annotation을 호출하기 위해서 리플렉션을 활용해서 Annotation이 있는지 확인하고, 있으면 RQ.url()을 호출해서 값을 가져온다.

package Custom;

import java.lang.reflect.Method;

public class test {
    public static void main(String[] args) throws ClassNotFoundException {
        test t = new test();
        t.solution();
    }
    public void solution() throws ClassNotFoundException {
        // People Class의 정보를 읽어오기 위해 forName에 위치를 지정해준다.
        Class<?> cls = Class.forName("Custom.People");
        // 해당 클래스에 있는 메소드 목록을 가져온다.
        Method[] methods = cls.getDeclaredMethods();
        for(Method method : methods){
            // 만약 RQ 어노테이션이 존재하면
            if(method.isAnnotationPresent(RQ.class)){
                RQ rq = method.getAnnotation(RQ.class);
                // RQ로 선언한 url 값을 가져온다.
                System.out.println(rq.url() +" "+method.getName());
            }
        }
    }
}

 

실행된 화면 

System.out.println(rq.url() +" "+method.getName());