[스프링부트] 6. 리플렉션

백하림's avatar
Mar 13, 2025
[스프링부트] 6. 리플렉션

쉽게 말하자면…

💡
  1. 어노테이션 → "여기에 깃발을 세웠다!"
  1. 리플렉션 → "어디에 깃발이 있나? 아, 여기 있네!"
  1. 디스패처 → "이 깃발을 보고, 관련된 동작을 실행해야겠군!"
즉, 어노테이션은 마커, 리플렉션은 탐색자, 디스패처는 실행자라고 볼 수 있음 !
 

어노테이션

package ex03; 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) // 메소드 위에만 붙일 수 있음, 클래스에 붙이고 싶으면 type public @interface RequestMapping { String value(); }
💡
  • 메서드에 경로(URL)를 매핑하는 역할을 하는 어노테이션
  • 런타임(RUNTIME)에 동작하도록 설정
  • 메서드에만 사용 가능 (@Target(ElementType.METHOD))

컨트롤러

package ex03; public class UserController { // /login?username=ssar @RequestMapping("/login") public void login(String username) { System.out.println("login call : " + username); } @RequestMapping("/join") public void join() { System.out.println("join call"); } @RequestMapping("/logout") public void logout() { System.out.println("logout call"); } @RequestMapping("/userinfo") public void userinfo() { System.out.println("userinfo call"); } }
💡
  • @RequestMapping 어노테이션이 붙은 메서드는 URL을 처리하는 역할을 함
  • login(String username), join(), logout(), userinfo() 등의 메서드 존재

디스패처

package ex03; import java.lang.reflect.Method; import java.lang.reflect.Parameter; public class Dispatcher { UserController con; public Dispatcher(UserController con) { this.con = con; } public void routing(String path) { // /login Method[] methods = con.getClass().getMethods(); for (Method method : methods) { RequestMapping rm = method.getAnnotation(RequestMapping.class); if (rm == null) continue; // 다음 for문으로 바로 넘어감 // /login?username=ssar // RequestMapping("/login") if (path.startsWith(rm.value())) { try { // 1. 파라미터 검사 Parameter[] parameters = method.getParameters(); if (parameters.length > 0 && parameters[0].getType().equals(String.class)) { String username = path.split("\\?")[1].split("=")[1]; // 물음표는 역슬래쉬 2개 넣어줘야 쓸 수 있음 method.invoke(con, username); } else { method.invoke(con); } } catch (Exception e) { throw new RuntimeException(e); } } } } }
💡
메서드가 실행되면:
  1. UserController모든 메서드를 가져옴
  1. @RequestMapping 어노테이션이 있는지 검사
  1. path가 어노테이션에 지정된 경로와 일치하면 해당 메서드를 실행
  1. URL에 ?username=ssar 같은 파라미터가 포함되면 String 타입의 첫 번째 매개변수로 전달

메인

package ex03; public class App { public static void main(String[] args) { Dispatcher ds = new Dispatcher(new UserController()); ds.routing("/login?username=ssar"); } }
💡
  • DispatcherUserController를 전달하고 routing() 실행
  • /login?username=ssar 요청 시:
    • /login과 매핑된 login(String username) 메서드 실행
    • System.out.println("login call : " + username); 출력됨
 

정리

역할
설명
@RequestMapping
메서드에 URL을 매핑하는 어노테이션
UserController
사용자의 요청을 처리하는 컨트롤러
Dispatcher
URL을 해석하고, 해당하는 메서드를 실행
App
Dispatcher를 실행하고 요청을 전달
Share article

harimmon