티스토리 뷰
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/
반응형
댓글