본문 바로가기
Programming/java

Bean Copy:BeanUtils copyProperties ,PropertyUtils copyProperties

by 막이 2012. 9. 28.

bean을 전혀 다른 bean(상속받은 것도 아니고 같은 패키지도 아닌 전혀 상관없는 bean)으로 복사를 하고 싶을 때가 있다. 일일이 복사를 하자니 노가다이고, 상속 같은 방법을 써보고도 싶지만 return type이 서로 다른 같은 이름이 있으면 상속이 안되는 등 귀찮은 작업이 될 여지가 많다. 이럴 때 Apache commons  BeanUtils를 사용한다.

이 패키지를 쓸 때, bean을 복사하는 방법에는 두가지 방법이 있다.

  1. PropertyUtils를 사용하는 방법과
  2. BeanUtils를 사용하는 방법

두 객체 모드 copyProperties 함수가 있으나 동작방식은 다르다.

공통적으로

같은 이름의 property에 대해서만 복사가 이루어진다.

당연하게도 destination에 setter가 없거나, original에서 getter가 없는 property에 대해서는 복사가 이루어지지 않는다.

1.의 경우

original bean과 destination bean의 모든 property는 동일한 객체여야 한다. 객체가 틀릴 경우 IllegalArgumentException이 발생한다.

즉, 두개의 bean이 같은 property에 대해서는 객채가 일치해야 한다.

또한 destination bean의 “age”라는 property의 setter가 int 형으로 parameter를 받고, original bean에서 “age”의 getter가 값을 Integer 객체로 return할 때, 만약 orignal bean의 “age”가 null이어도 IllegalArgumentException이 발생한다. 왜냐하면 destination의 setter function의 primitive type paramter가 null로 들어가기 때문이다.

따라서, 같은 property가 original bean은 primitive object, destination bean은 primitive type일 경우 original bean의 해당 property가 null이 된 상태에서 PropertyUtils.copyProperties 함수를 사용하지 않도록 주의해야 한다.

2. 의 경우

original bean의 getter가 return하는 객체와 destination bean의 setter는 parameter 객체는 동일할 필요가 없다. BeanUtils에서 적절하게 property type의 변환을 해주며, PropertyUtils에서 설명한 primitive type에 사용에 따른 Exception도 적절하게 처리해준다.

BeanUtils는 기본적으로 ConvertUtilsBean 에서 설정된 default 값을 가지고 변환이 이루어진다. 부적절한 변환일 경우 default 값으로 변환되며, String이 char로 변환될 경우 첫글자로 변환되는 식이다.

이러한 변환 과정이 구현에 따라 바뀔 필요가 발생할 떄도 있는데, 이는 ConvertUtilsBean으로 해결이 가능하다. ConvertUtilsBean에서 구현이 바뀌어야 할 type을 deregister 함수로 빼고 난 뒤, 새롭게 정의한 Converter를 해당 type으로 register함수를 이용하여 등록해주면 된다.

-------------------------------------------------------------------------------------------------------------자주 사용하는 Method는 "cloneBean", "copyProperties" 이다. 
이 Method는 객체를 복사할때 사용한다.

사용법은 
    BeanUtils.cloneBean(Object);
    BeanUtils.copyProperties(dest, orig);
로 간단히 사용 할 수 있다.

'Programming > java' 카테고리의 다른 글

Integer.valueOf(String).intValue()  (0) 2012.11.07
DAO(Data Access Object 와 VO(Value Object)  (0) 2012.09.28
업로드한 엑셀 파일 데이터 읽어오기  (0) 2012.09.20
Eclipse 인수 입력 방법  (0) 2012.03.13
OOP의 이해  (0) 2012.03.06