Reflection & Annotation
Jul 30, 2024
Reflection?
라이브러리를 만드는 사람은 내가 메서드를 만들던 다 가능하게 해준다
그러나
내가 무슨 함수를 만들 줄 알고?
이를 도와주는게 리플렉션이다어노테이션
어노테이션은 프로그래밍 언어에서 코드 요소(클래스, 메서드, 변수등)에 추가 메타데이터를 제공하는 방법. 어노테이션은 주로
컴파일러 지시자
, 런타임 정보 제공
, 코드 분석 및 도구 지원
등을 위해 사용된다. 어노테이션 자체는 프로그램의 비즈니스 로직에 영향을 미치지 않지만, 다양한 방식으로 코드의 동작을 변경하거나 확장할 수 있다. 라우터?
들어오는 요청을 적절한 컨트롤러로 연결해주는 역할을 한다. 클라이언트가 URL을 요청하면 라우터가 적절한 컨트롤러로 전달을 하고 클라이언트에게 응답을 하는 역할을 한다
라우터 기본 연습
public class App {
public static void main(String[] args) {
String path = "/login";
UserController con = new UserController();
if (path.equals("/login")){
con.login();
} else if (path.equals("/join")) {
con.join();
}
}
}
package ex01;
public class UserController {
// /login
public void login(){
System.out.println("로그인 호출됨");
}
// /join
public void join(){
System.out.println("회원가입 호출됨");
}
public void userinfo(){
System.out.println("유저정보 보기");
// 죽어도 이 정보를 호출 할 수있는 방법이 없다.
// 이러면 라우터에 재설계를 요청해야한다.
// 계속 이럴 수는 없다....
}
}
D:\tools\jdk-21.0.1\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.3\lib\idea_rt.jar=54148:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2023.3\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\workspace\java_lec\reflectapp\out\production\classes ex01.App
로그인 호출됨
Process finished with exit code 0
Reflection과 어노테이션의 상관관계
리플렉션은 동적으로 객체의 정보를 골라서 찾아내고 조작하기 위한 작업을 수행하는데, 이 때 리플렉션을 반복적으로 사용하게 되면 당연히 속도가 느려질 수 밖에 없다. 때문에 어노테이션을 붙여서 효율적으로 운영한다
ex)어노테이션이 붙은 것에만 일을해줘
일을 하는 사람이 깃발이 있는 것만 작업하게 한다
일을 효율적으로 빠르게 할 수 있다
어노테이션을 붙이지 않았다면 리플렉션의 속도는 많이 느려진다.
RequestMapping 어노테이션 적용하기
package ex02;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
//A개발자
// uri를 받아서 라우팅
public class App {
public static void main(String[] args) {
String path = "/update-password";
UserController con = new UserController();
Method[] methods = con.getClass().getDeclaredMethods(); //유저 컨트롤러 객체에 선언된 메서드 전체를 들고와!
//System.out.println(methods.length);
for(Method method : methods){
//System.out.println(method.getName());
RequestMapping rm = method.getDeclaredAnnotation(RequestMapping.class);
if (rm == null) continue;
if (rm.uri().equals(path)){
try {
method.invoke(con); // con.login();
break;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
package ex02;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) // 어노테이션이 실행시에 발동
@Target(ElementType.METHOD)
public @interface RequestMapping {
String uri(); // uri에서 i는 identify
}
package ex02;
//B개발자
//A개발자가 B개발자에게 어노테이션만 붙이면 됩니다.
public class UserController {
// /login
@RequestMapping(uri="/login")
public void login(){
System.out.println("로그인 호출됨");
}
// /join
@RequestMapping(uri="/join")
public void join(){
System.out.println("회원가입 호출됨");
}
@RequestMapping(uri="/userinfo")
public void userinfo(){
System.out.println("유저정보 보기");
}
@RequestMapping(uri = "/update-password")
public void updatePassword(){
System.out.println("패스워드 수정하기");
}
}
- RequestMapping 어노테이션
해당 메서드나 클래스가 어떤 URL 경로와 매핑되는지 지정하는 역할
Share article