JVM/Java

[Java]BeanUtils.copyProperties를 사용해보자

Hyo Kim 2021. 4. 17. 22:19
728x90
반응형

- 첫 작성일 : 21년 2월 11일 velog 블로그

BeanUtils.copyProperties ?

스프링에서 제공해주는 메소드로서 객체를 쉽고 간결하게 복사할 수 있게 해준다.

언제 사용하지?

예를들어 객체를 수정하기 위해 파라미터로 값을 받았을 때
필드가 많으면 많을 수록 setter의 횟수가 늘어나고 코드의 길이도 늘어나기 때문에
가독성과 소요시간이 떨어지게 됩니다.
이때 BeanUtils.copyProperties 메소드를 통해 한줄로 해결할 수 있습니다.

또한, 그대로 복사하지 않고 변경하지 않은 것들을 선택해서
원하는 것만 복사하고 싶을 때에도 사용하면 좋습니다.

 

사용방법

copyProperties(Object source, Object target)
source - 원본 객체
target  - 복사 객체

 

위처럼 여러줄의 setter를 한 줄로 복사할 수 있습니다.
훨씬 가독성 좋은 것 같습니다.

ignore 설정

copyProperties(Object source, Object target, String... ignoreProperties)
source - 원본 객체
target  - 복사 객체
ignoreProperties - 복사하지 않을 필드명들

위처럼 3번째 파라미터부터는 갯수의 상관 없이 복사하지 않을 필드명을 설정할 수 있습니다.

업무에서 적용 경험 후기

실제로 무분별한 setter 사용으로 코드가 길어지는 경험을 많이 한 이후에
이 메소드를 알게 되어서 꽤 자주 사용하면서 코드 간결해지는걸 보면서 기분이 좋았던 것 같습니다.
하지만, 너무 무분별한 사용은 성능상 좋지 않으며,
setterbuilder 등 다양한 방법 중 상황에 맞게 사용하는 것이 가장 좋다고 느꼈습니다.

2021-06-09 추가사항

 

BeanUtils를 임포트할 때에는 조심히 해야한다.
org.springframework.beans.BeanUtils;
org.apache.commons.beanutils.BeanUtils;

 

이번에 BeanUtils을 사용하다가 값이 계속 없어지길래 확인해보니
임포트가 아파치로 되어 있었습니다..

springframework.beans.BeanUtils

copyProperties(Object source, Object target)
source - 원본객체
target - 복사객체

apache.commons.beanutils.BeanUtils;

copyProperties(final Object dest, final Object orig)
dest - 복사객체
orig - 원본객체

위처럼 복사객체원본객체가 반대로 되어 있습니다.

그런데 아파치버전을 확인해보면 final로 되어있는 것으로 보아
조금은 다른 기능이 있는 것 같습니다.

 

자세히 크게 다른 점은 아직 확인해보지 못했지만,
성능에서는 아파치가 스프링에 비해 느리다고 보여집니다.
(참조)

728x90
반응형