Programming/Java * Spring
[JSP] 리플렉션 API를 사용한 프론트 컨트롤러 자동화
고막고막
2019. 6. 12. 18:56
기존 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)));
}
}