본문 바로가기
Programming/Java * Spring

[JSP] 리플렉션 API를 사용한 프론트 컨트롤러 자동화

by 고막고막 2019. 6. 12.

기존 MVC 모델에서 페이지를 추가하면 프론트 컨트롤러에서 파라미터 값을 받기 위해 객체를 추가하는 코드를 매번 추가/수정해주어야 한다. 그런데 리플렉션 API를 사용하면 객체 생성의 자동화를 통해 이 불편한 과정을 개선할 수 있다. 아래의 그림처럼 프론트 컨트롤러가 페이지 컨트롤러에 필요한 데이터를 물어보고, 클래스의 이름(문자열)을 추출해 그에 따른 객체를 생성해주는 흐름으로 자동화가 이루어진다.

1. 리플렉션 API 다운로드

자바 lang 패키지에서 기본적으로 제공하는 리플렉션 API도 있고, 외부 라이브러리를 다운받아 임포트 해도 된다.

https://code.google.com/archive/p/reflections/

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

2. 라이브러리에 등록

: 다운받은 원본 파일과 압축해제한 jar 파일들 모두를 다음과 같이 라이브러리에 등록한다

3. 인스턴스 생성

Object dataObject = dataType.newInstance();

4. 클래스에 선언된 매서드를 찾아내서 반환

private static Method findSetter(Class<?> type, String name) {
// 1)  해당 클래스의 모든 매서드 정보를 추출한다
	Method[] methods = type.getMethods();
	String propName = null;
	for(Method m : methods) {
		// 만약 매서드 이름의 시작이  set이 아니면 다음거 가져와
		if(!m.getName().startsWith("set"))
			continue;
		// 2) 만약 매서드 이름의 시작이 set이면 set을 제외한 이름을 추출해라
		propName = m.getName().substring(3);
		//  3) 매서드의 이름을 소문자로, 인자 이름을 소문자로 변환해 비교한다
		// 같은 이름이면 찾았다 !
		if(propName.toLowerCase().equals(name.toLowerCase())) {
			// 해당 매서드를 반환해서 m.invoke() 실행 -> setter 매서드에 값이 들어감
            return m;
		}
	}
	return null;
}

5. 매서드 호출하기

for(String paramName : paramNames) {
	// 해당 파라미터의 setter 함수를 찾아서 반환한다
	m = findSetter(dataType, paramName);
	if(m!=null) {		// setter 매서드를 찾았다면
		// 해당 setter 매서드를 호출한다 그리고 값이 전달되도록 함
		m.invoke(dataObject, 
        createValueObject(m.getParameterTypes()[0], 
        request.getParameter(paramName)));
	}
}