본문 바로가기
프로젝트/자바 리플렉션

[자바 리플렉션] 2. dispatcher 필터로 주소 매핑하기

by dantriss 2023. 8. 11.

본격 자기계발 레벨업 프로젝트! 유튜브 메타코딩 영상을 보면서 공부 했던것을 정리하고자 합니다.

IDE : STS4

언어 : Java 8

스프링부트 버전 : 2.7.13

DB : MySQL

빌드관리 도구 : Maven

OS : iOS

참고유튜브 : 메타코딩


기존에 한개의 함수에 대응하는 if문을 작성해야 하는 방식 말고 userController에 함수가 추가 되더라도

해당 컨트롤러가 가진 함수를 배열로 저장한 후 이용한다면 더 간편하게 관리할 수 있지 않을까?

진행해보자

 

기존 방식은 함수가 한개 추가 될 때마다 계속 해당 함수를 불러오기 위해서 해당 엔드포인트를 추가해서 사용해주어야 했다.

 

해당 클래스가 가지고 있는 모든 함수들을 method배열에 저장해서 for문을 이용해 출력해보자

그러면 콘솔에 userController가 가지고 있는 함수들이 출력되는 것을 확인할 수 있다.

 Method[] methods = userController.getClass().getDeclaredMethods();
 
		 for (Method method : methods) {
			System.out.println(methods.getName());
            }

 

이제 endPoint에서 파싱한 값과 methods 배열에 저장된 userController의 값을 서로 비교해서

일치한다면 해당 함수를 사용할 수 있을 것이다.

 

for (Method method : methods) {
    if (endPoint.equals("/"+method.getName())) {
        try {
            method.invoke(userController);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

userController로 이동해서 함수를 추가해서 주소를 넣어보면 해당 함수를 바로 사용할 수 있는걸 확인할 수 있다.

 

그런데 endPoint가 함수이름과 같아야 하는건 좀 불편하다.

지금까지 컨트롤러에서 어노테이션을 이용해서 RequestMapping, GetMapping, PostMapping 등 을 이용해 함수이름이 같아도

사용할 수 있던 경험이 있을 것이다.

 

annotation 패키지를 생성해 annotation 클래스를 생성할 것인데 클래스 명은 RequestMapping 으로 해준다.

 

해당 어노테이션 인터페이스가 동작하는 것은 @Retention을 활용해 런타임때 동작하도록 하고 @Target을 활용해 함수에 해당 어노테이션 인터페이스를 붙일 수 있도록 만들어준다.

@Target({ElementType.METHOD})			
@Retention(RetentionPolicy.RUNTIME)		
public @interface RequestMapping {
	String value();
}

 

이제 userController로 이동해서 어노테이션을 붙여보자

마지막 newTest함수는 newtest로 변경해서 해당 함수가 동작하는지 알아보자

dispatcher 필터로 이동해서 다음과 같이 수정해주어야 한다.

마지막에 break를 걸어주어야 하는데 그렇지 않으면 endpoint와 일치하는 함수를 찾고 난 후에도 다음 함수와 일치하는지 대조해보기 때문이다.

서버를 실행해서 이제 newTest가 아닌 newtest로 작성을해도 함수가 동작하는걸 확인 할 수 있다.

댓글