기존 MVC 모델에서 페이지를 추가하면 프론트 컨트롤러에서 파라미터 값을 받기 위해 객체를 추가하는 코드를 매번 추가/수정해주어야 한다. 그런데 리플렉션 API를 사용하면 객체 생성의 자동화를 통해 이 불편한 과정을 개선할 수 있다. 아래의 그림처럼 프론트 컨트롤러가 페이지 컨트롤러에 필요한 데이터를 물어보고, 클래스의 이름(문자열)을 추출해 그에 따른 객체를 생성해주는 흐름으로 자동화가 이루어진다.
1. 리플렉션 API 다운로드
: 자바 lang 패키지에서 기본적으로 제공하는 리플렉션 API도 있고, 외부 라이브러리를 다운받아 임포트 해도 된다.
https://code.google.com/archive/p/reflections/
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)));
}
}
'Programming > Java * Spring' 카테고리의 다른 글
[Spring Boot] Authorization Server(feat. Postman) (0) | 2019.07.10 |
---|---|
MyBatis 사용 목적, 셋팅, Log4j(로그 출력) (0) | 2019.06.13 |
[JSP] DataSource의 장점과 셋팅 방법 (0) | 2019.06.11 |
[JSP] EL(Expression Language), JSTL(JSP Standard Tag Library) 정리 (0) | 2019.06.10 |
[JSP] JSP의 주요 구성 요소(템플릿 데이터, JSP 지시자, 스크립트릿, JSP 선언문, JSP 표현식) (0) | 2019.06.03 |