ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BeanUtils copyProperties 사용법 및 주의사항
    java 2021. 5. 4. 17:31

    배경

    DTO를 엔티티로 전환하는 작업 또는 엔티티를 DTO를 전환하는 작업은 흔하게 있다. 두 객체의 필드변수는 많이 닮아 있다. 대부분 공통필드를 갖고 몇몇이 추가되거나 삭제되어 있다. 이때 엔티티 또는 DTO의 필드변수 개수가 많아지면 굉장히 곤란했다. 곤란했다기보다 스트레스를 많이 받았다. 뻔한 코드를 수십줄 치고 있자니 굉장히 어려웠다. 문제는 변경에 있다. 전달해야할 필드가 변경된다면 일일이 찾아서 고쳐야 했다. 그러던 중 굉장한 스프링의 유틸을 발견했다...

     

     

    사용법

    굉장히 간단하다. 복사 소스는 Setter를 정의하고 타겟은 Getter를 정의하면 된다.

    그리고 두 인스턴스를 전달하면 이름과 타입이 같은 필드를 getter와 setter를 이용해 복사한다.

     

    복사를 원하지 않는 필드는 위처럼 필드명을 문자열로 넘기면 복사대상에서 제외할 수 있다.

     

     

    주의사항

    내부 코드는 그리 복잡하지 않다. 두 객체를 리플렉션하여 필드 명을 얻고 조건에 부합하면 getter와 setter를 이용해 복사해준다. 다만, 얕은 복사가 사용된다는 점에서 주의해야한다.

    코드를 보면 복사한 String객체에 대해 == 연산이 true를 반환함을 알 수 있다. String같이 불변객체라면 신경쓰지 않아도 되겠지만 변경에 민감한 객체는 주의해야겠다. 특히 엔티티같이 아주 특수한 상황에서만 변경하는 객체는 더더욱 그러하다. 이래서 setter는 닫아 놓고 필요한 경우 변경메서드를 정의하는 습관이 필요한 것 같다!

     

     

    마치며

    결국 리플렉션을 이용하니까 일반적인 setter보다 성능면에서 불리할 것 같다. 다만, 약간의 성능저하를 감수하더라도 유지보수 측면에서 사용이 거의 필수인 유틸인 듯하다. 프로젝트를 리팩토링할 때가 왔다.... ㅎㅎ

    'java' 카테고리의 다른 글

    컬렉션 정리  (0) 2021.05.10
    Java Garbage Collector  (0) 2021.05.10
    java 실행과정  (0) 2021.05.01
    JWT를 이용한 인증  (0) 2021.04.16
    HashMap이란?  (0) 2021.02.12

    댓글

Designed by Tistory.