[스프링부트] 6. 리플렉션
Mar 13, 2025
쉽게 말하자면…
어노테이션
→ "여기에 깃발을 세웠다!"
리플렉션
→ "어디에 깃발이 있나? 아, 여기 있네!"
디스패처
→ "이 깃발을 보고, 관련된 동작을 실행해야겠군!"
즉, 어노테이션은 마커, 리플렉션은 탐색자, 디스패처는 실행자라고 볼 수 있음 !
어노테이션
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);
}
}
}
}
}
메서드가 실행되면:
UserController
의 모든 메서드를 가져옴
@RequestMapping
어노테이션이 있는지 검사
- path가 어노테이션에 지정된 경로와 일치하면 해당 메서드를 실행
- 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");
}
}
Dispatcher
에UserController
를 전달하고routing()
실행
/login?username=ssar
요청 시:/login
과 매핑된login(String username)
메서드 실행System.out.println("login call : " + username);
출력됨
정리
역할 | 설명 |
@RequestMapping | 메서드에 URL을 매핑하는 어노테이션 |
UserController | 사용자의 요청을 처리하는 컨트롤러 |
Dispatcher | URL을 해석하고, 해당하는 메서드를 실행 |
App | Dispatcher 를 실행하고 요청을 전달 |
Share article