객체복사 BeanUtils.copyProperties

YulHee Kim·2021년 10월 20일
0

BeanUtils.copyProperties는 Entity와 Dto 사이에서 값을 복사할 때 이 메소드를 사용한다고합니다. 이 메소드에 대해 정리해보도록 하겠습니다ㅎㅎ

✔️ 사용 이유?

Spring을 사용할 때 class간 property를 복사해야할 경우 이 기능을 사용합니다.
예시로 원본 Domain(혹은 Dto) 내용에 수정된 내용을 주입할 때로 설명하면
원시적으로 setter method를 사용하여 property를 하나하나 복사하는 방법이 있지만 property가 수백개가 되는 상황이라면 매우 비효율적이고 setter가 많아져 코드가 길어지게되는 문제가 생깁니다.
이런 경우에 Setter 대신 BeanUtils.copyProperties()메소드를 이용하면 간편하게 처리할 수 있습니다.

✔️ 예시

Setter로 설정하는 경우

public Book modifyBook(Book book) {
        Book bookById = bookRepository.findBookById(book.getId()); //기존 데이터

        bookById.setName(book.getName());
        bookById.setAuthor(book.getAuthor());
        bookById.setPublicationDate(book.getPublicationDate());
        bookById.setIsbn(book.getIsbn());
        bookById.setPublisher(book.getPublisher());

         . . . 
}

BeanUtils.copyProperties()를 사용한 경우

첫번째 인자에는 Getter가 두번째 인자엔 Setter가 있어야합니다.

public Book modifyBook(Book book) {
        Book bookById = bookRepository.findBookById(book.getId()); //기존 데이터

        BeanUtils.copyProperties(book, bookById);

        . . . 

}

모든 값이 아닌 필요한 필ㄹ드만 복사하고 싶은 경우

이럴 경우 ignore할 property를 지정해주어 필요한 값만 복사하면된다.
아래 같은 경우는 name과 author는 복사하지 않는다.

BeanUtils.copyProperties(person1, person2, "name", "author");

✔️ 테스트 코드

package kr.webgori.lolien.discord.bot.unit;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.springframework.beans.BeanUtils;

public class BeanUtilsUnitTest {
  @Test
  public void test01_Should_EqualsMemberVariables_When_UseBeanUtilsCopyPropertiesMethodTest() {
    SourceClass sourceClass = new SourceClass(1, "sourceName", 20);

    TargetClass targetClass = new TargetClass();

    BeanUtils.copyProperties(sourceClass, targetClass);

    assertThat(sourceClass.idx, is(targetClass.idx));
    assertThat(sourceClass.name, is(targetClass.name));
    assertThat(sourceClass.age, is(targetClass.age));
  }

  static class SourceClass {
    private int idx;
    private String name;
    private int age;

    SourceClass(int idx, String name, int age) {
      this.idx = idx;
      this.name = name;
      this.age = age;
    }

    public int getIdx() {
      return idx;
    }

    public String getName() {
      return name;
    }

    public int getAge() {
      return age;
    }
  }

  private static class TargetClass {
    private int idx;
    private String name;
    private int age;

    public void setIdx(int idx) {
      this.idx = idx;
    }

    public void setName(String name) {
      this.name = name;
    }

    public void setAge(int age) {
      this.age = age;
    }
  }
}

참고)
https://zzang9ha.tistory.com/304
https://siyoon210.tistory.com/74

profile
백엔드 개발자

0개의 댓글