티스토리 뷰

개발

java object mapping

달리는개발자 2016. 8. 11. 11:33

java object mapping을 위한 테스트


객체에서 다른 객체로 변환 시 수동, BeanUils, ModelMapper의 성능을 비교해봤습니다.


성능 비교

/**
* 객체 변환 테스트
*/
@Test
public void testObjectMapper() {
StopWatch stopWatch = new StopWatch();

CarMeta carMeta = new CarMeta();
carMeta.setBrandId("1");
carMeta.setModelGroupId("1");
carMeta.setModelId("1");
carMeta.setGradeId("1");
carMeta.setHashId("1");
carMeta.setName("TEST");
carMeta.setIsCalculated("1");
carMeta.setOrderPriority("1");
carMeta.setOrgAdminId("1");
carMeta.setOrgDt(new Date());
carMeta.setModifyAdminId("1");
carMeta.setModifyDt(new Date());

int count = 1;
CarMetaData carMetaData = null;

stopWatch.start("modelmapper");
ModelMapper modelMapper = new ModelMapper();
for (int i = 0; i < count; i++) {
carMetaData = modelMapper.map(carMeta, CarMetaData.class);
}
stopWatch.stop();

stopWatch.start("manual");
for (int i = 0; i < count; i++) {

carMetaData = new CarMetaData();
carMetaData.setBrandId(carMeta.getBrandId());
carMetaData.setModelGroupId(carMeta.getModelGroupId());
carMetaData.setModelId(carMeta.getModelId());
carMetaData.setGradeId(carMeta.getGradeId());
carMetaData.setHashId(carMeta.getHashId());
carMetaData.setName(carMeta.getName());
carMetaData.setIsCalculated(carMeta.getIsCalculated());
carMetaData.setOrderPriority(carMeta.getOrderPriority());
carMetaData.setOrgAdminId(carMeta.getOrgAdminId());
carMetaData.setOrgDt(carMeta.getOrgDt());
carMetaData.setModifyAdminId(carMeta.getModifyAdminId());
carMetaData.setModifyDt(carMeta.getModifyDt());
}

stopWatch.stop();

stopWatch.start("beanUtils");
try {
for (int i = 0; i < count; i++) {
carMetaData = new CarMetaData();
BeanUtils.copyProperties(carMeta, carMetaData);
}
} catch (Exception ex) {
ex.printStackTrace();
}
stopWatch.stop();

stopWatch.start("dozer");
try {
for (int i = 0; i < count; i++) {
Mapper mapper = new DozerBeanMapper();
CarMetaData carMetaData2 =
mapper.map(carMeta, CarMetaData.class);
}
} catch (Exception ex) {
ex.printStackTrace();
}
stopWatch.stop();

Assert.isTrue(carMeta.getBrandId().equals(carMetaData.getBrandId()));

log.debug("{}", stopWatch.prettyPrint());
}


결과

-----------------------------------------

ms     %     Task name

-----------------------------------------

00091  030%  modelmapper

00000  000%  manual

00038  012%  beanUtils

00175  058%  dozer



결론

수동으로 작업하는게 가장 빠르다.

변환이 많은 경우 급격히 성능이 느려지므로 문제를 알고 사용하자



기타


문제

BeanUtils에서 아래와 같은 오류가 발생함.

org.apache.commons.beanutils.ConversionException: No value specified for 'Date'


해결

apache common beanutils를 1.8 대에서 1.9로 수정함.



참고

http://www.christianschenk.org/blog/java-bean-mapper-performance-tests/

https://rodrigojramirez.com/2013/10/21/beware-of-copyproperties-or-the-30-milliseconds-tale/

http://mapstruct.org/

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함