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