Web단에서의 파라미터 추출
웹단에서의 파라미터추출 방식
Class PersonVO {
private String name;
private String address;
//getter
//setter
}
//서블릿에서
vo.setName(request.getParameter("name");
vo.setAddress(request.getParameter("adress");
-> 한줄이지만 name이 두번 들어간 중복된 코드. 그리고 이런 속성의 갯수만큼 코드를 반복한 경우가 많음.
프레임웍에서는 어떻게 처리했을까?
Struts
- ActionForm(org.apache.struts.action.ActionForm) 클래스를 상속하여 사용
- autopopulation 메카니즘.
- web layer를 벗어나서 business layer까지 ActionForm을 가지고 가는 것은 전체코드가 web단의 프레임웍에 대한 의존성을 가지게 할 수 있다. 따라서 business layer에 전달할때는 일반 VOr객체나 map으로 바꿔서 전달하는 경우가 많다.
Spring MVC
- 특별한 클래스를 상속하지 않은 일반 VO객체를 직접 사용 가능
MultiActionConroller
user user = new User();
bind(request,user);
AbstractComanndController
binding + validation
setComannd.class(user.class)
..
user user = (User)command;
Map vs VO
- 비지니스 layer에 전달을 할때 파라미터를 전달하는 객체
VO의 장점
- 속성명을 잘못 입력한다면 compile 단계에서 에러체크가 됨. (get,set 메서드 명을 틀리게 썼다는 말이므로). run time에서 오타에 의한 에러 가능성을 막아줌.
- DB테이블과 1:1로 매핑될수 있으므로 클래스 선언만 보와도 DB table의 구조를 유추할 수 있을때 도 있음
- struts에서 <bean:write/> <html:text />의 커스컴태그로 쓸 수 있음.
- hash 연산 같은 것이 필요없으므로 Map에 비해서 빠른 속도를 기대할 수 있음.
Map 장점
- 추가적인 클래스 선언이 필요없음. 관리할 파일이 적어지므로 버전관리등의 부담감이 덜함.
- 속성이 추가되어도 추가적인 코딩이 VO에 비해서 적음.
-
기존적으로 java에서 제공하는 메소드 활용가능
- toString() : 메서드 안의 내용을 보여줌. VO에서는 toString() 메서도를 재정의해야만 가능함.
- keySet(), entrySet(), values() : 전체속성에 대해서 처리할 때 사용할수 있음. VO에서는 reflection을 사용해야만 가능.
Beanutils, PropertyUtils
http://jakarta.apache.org/commons/beanutils/api/org/apache/commons/beanutils/PropertyUtils.html
프로젝트 사례
PersonVO vo = new PersonVO();
VOUtil.fromRequestToVO(reuqest,vo);
최초 다음과 같은 의도로 작성
- systemier의 core service단(Business layer)까지 ActionForm을 상속한 객체를 들고 들어가지 않게 한다.
- DB테이블의 속성에 매핑되는 VO를 써서 파라미터를 전달할려고 한다.
- 비슷한 역할을 하는 VO와 ActionForm 객체를 중복해서 작성하지 않을려고 한다.
ActonForm을 쓰지 않고 일반 VO객체만 쓰고 별도의 utility로 변환. (spring MultiActionConroller에서 bind()와 같은 역할). 공개된 utiity들을 잘 찾아봤다면 굳이 직접 작성하지 않았을 수도 있었음
History
Last edited on 05/20/2009 07:16 by benelog
Comments (0)