메인
package ex02;
public class App {
public static void main(String[] args) {
Dispatcher ds = new Dispatcher(new UserController());
ds.routing("/userinfo");
}
}

어노테이션 코드
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) // 메소드 위에만 붙일 수 있음, 클래스에 붙이고 싶으면 type
public @interface RequestMapping {
String value(); // 경로 값을 받을 변수
}
@Retention(RetentionPolicy.RUNTIME)
: 런타임에도 유지되도록 설정
@Target(ElementType.METHOD)
: 메서드에만 적용 가능
String value();
: 어노테이션의 값을 문자열로 받을 수 있도록 설정
@Target(ElementType.TYPE)
: 클래스에 적용 가능
어노테이션 찾기
package ex02;
import java.lang.reflect.Method;
public class Dispatcher {
UserController con;
public Dispatcher(UserController con) {
this.con = con;
}
public void routing(String path) { // 요청된 URL 경로
Method[] methods = con.getClass().getMethods();
for (Method method : methods) {
// 어노테이션 찾기
RequestMapping rm = method.getAnnotation(RequestMapping.class);
if (rm == null) continue; // 어노테이션이 없으면 다음 메서드로
if (rm.value().equals(path)) { // URL과 일치하는지 확인
try {
method.invoke(con); // 해당 메서드 실행
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
}
getMethods()
를 사용해UserController
의 모든 메서드를 가져옴
getAnnotation(RequestMapping.class)
으로 어노테이션이 붙은 메서드인지 확인
method.invoke(con);
을 이용해 해당 메서드를 실행함
메소드에 어노테이션 추가
package ex02;
public class UserController {
@RequestMapping("/login")
public void login() {
System.out.println("login call");
}
@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("경로")
를 추가하여 경로와 메서드를 연결함정리
- 어노테이션(
@RequestMapping
)을 직접 정의하여 메서드와 URL을 연결
- 리플렉션(Reflection)을 활용하여 런타임에 어노테이션을 분석하고 실행
- Dispatcher를 통해 URL에 맞는 메서드를 자동으로 실행
쉽게 말하자면…
@RequestMapping("/login")
→ "여기에 깃발을 세웠다!"
리플렉션
→ "어디에 깃발이 있나? 아, 여기 있네!"
디스패처
→ "이 깃발을 보고, 관련된 동작을 실행해야겠군!"
즉, 어노테이션은 마커, 리플렉션은 탐색자, 디스패처는 실행자라고 볼 수 있음 !
Share article