시작하기 앞서 Gson 라이브러리를 추가해 줍니다.
빌드도구가 maven과 gradle 중에 자신의 프로젝트에 맞게 추가해 주시면 됩니다.
ObjectCopyHelper 생성하기
maven
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
gradle
implementation 'com.google.code.gson:gson:2.8.9'
import org.springframework.stereotype.Component;
// Spring Framework에서 Component로 등록하기 위한 어노테이션을 가져옵니다.
import com.google.gson.Gson;
// Gson 라이브러리를 import 해줍니다.
@Component // Spring 컨테이너에 이 클래스의 인스턴스가 bean으로 등록됨을 나타냅니다.
public class ObjectCopyHelper {
private Gson gson = new Gson(); //1)
public <T> T copyObject(Object sourceObject, Class<T> targetType) { // 2)
if (sourceObject == null) { // 3)
return null;
}
String sourceJsonString = gson.toJson(sourceObject); // 4)
Object tartgetObject = gson.fromJson(sourceJsonString, targetType); // 5)
return targetType.cast(tartgetObject); // 6)
}
}
ObjectCopyHelper는 객체를 복사해 주는 유틸리티 역할을 하는 클래스입니다.
주요 기능은 다른 객체의 내용을 JSON 형식으로 변환한 다음,
해당 JSON을 다시 원하는 타입의 객체로 역직렬화하여 복사본을 만들어 주는 기능을 합니다
- 1. Gson 은 Google 이 제공하는 JSON 라이브러리입니다.
- JAVA 객체를 JSON으로 변환해 주는 직렬화를 합니다.
- 반대로 JSON을 JAVA 객체로 변환해 주는 역직렬화를 합니다.
- 2. 제네릭 메서드로 선언되어 있습니다.
- T는 반환 타입 및 매개변수 targetTarget의 타입을 지정하는 데 사용됩니다.
- Object sourceObject : 복사할 원본 객체를 나타냅니다.
- Class <T> targetType : 복사본으로 만들 객체의 타입을 나타냅니다.
- 3. 원본 객체가 Null 인경우, Null을 반환하여 빈 복사본을 만듭니다.
- 4. soruceObject를 JSON 형식의 문자열로 직렬화합니다.
- 이렇게 하면 객체의 내용이 JSON 형태로 표현됩니다.
- 5. JSON 문자열을 targetType으로 역직렬화 하여 복사본 객체를 생성합니다.
- 6.targetType으로 형변환하여 최종 복사본 객체를 반환합니다.
이렇게 작성된 `ObjectCopyHelper` 클래스는 객체를 깊은 복사(deep copy)하는 데 사용될 수 있습니다. JSON을 거쳐 객체를 복사하기 때문에,
객체 내부에 다른 객체를 참조하는 경우 해당 객체들도 모두 새로운 인스턴스로 복사됩니다.
이를 통해 원본 객체와 독립적인 복사본을 얻을 수 있습니다.
ObjectCopyHelper를 사용하는 이유
ObjectCopyHelper를 사용하는 이유는 객체를 깊은 복사하고자 할 때 유용합니다.
깊은 복사는 원본 객체의 내용과 내부 구조를 유지한 새로운 복사본을 생성하는 것을 의미합니다.
일반적인 얕은 복사(shallow copy)는 원본 객체와 복사본이 같은 객체를 참조하기 때문에 하나를 변경하면 다른 하나도 영향을 받게 됩니다.
반면 깊은 복사를 사용하면 원본 객체와 복사본이 서로 독립적으로 존재하며, 하나의 객체를 변경해도 다른 객체에는 영향을 주지 않습니다.
이를 통해 데이터를 안전하게 복사하고 수정할 수 있습니다.
아래는 ObjectCopyHelper를 사용하는 예제 코드입니다.
public class Person {
private String name;
private int age;
// 생성자, getter, setter 등의 코드는 생략
}
public class Main {
public static void main(String[] args) {
// 원본 객체 생성
Person originalPerson = new Person();
originalPerson.setName("John");
originalPerson.setAge(30);
// ObjectCopyHelper 인스턴스 생성 (Spring 컨테이너에서 자동으로 관리되지 않는 경우 직접 생성)
ObjectCopyHelper copyHelper = new ObjectCopyHelper();
// 원본 객체를 깊은 복사하여 새로운 복사본 객체 생성
Person copiedPerson = copyHelper.copyObject(originalPerson, Person.class);
// 복사본의 내용 변경
copiedPerson.setName("Jane");
copiedPerson.setAge(25);
// 원본 객체와 복사본 객체는 독립적으로 존재
System.out.println("Original Person: " + originalPerson.getName() + ", " + originalPerson.getAge());
System.out.println("Copied Person: " + copiedPerson.getName() + ", " + copiedPerson.getAge());
}
}
위 예제에서 ObjectCopyHelper.copyObject 메서드를 사용하여 originalPerson 객체를 Person 클래스 타입의 복사본인 copiedPerson 객체로 깊은 복사 합니다.
이후에 copiedPerson 객체의 내용을 변경해도 originalPerson 객체에는 영향을 주지 않습니다.
이를 통해 데이터를 안전하게 복사하여 독립적으로 다룰 수 있습니다.
DTO(VO)를 Entity로 변환하기
DTO(Data Transfer Object)를 Entity로 변환하는 예제
// DTO 클래스
public class PersonDTO {
private String name;
private int age;
// 생성자, getter, setter 등의 코드는 생략
}
// Entity 클래스
@Entity
@Table(name = "person")
public class PersonEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// 생성자, getter, setter 등의 코드는 생략
}
DTO는 Data Transfer Object는 데이터를 전송하거나 뷰에서 사용하기 위해 간단하게 구성된 객체이고,
Entity는 데이터베이스와 매핑되는 영속성을 가지는 객체입니다. D
TO와 Entity는 서로 다른 용도와 구조를 가지고 있으므로, 이 둘을 변환하는 작업이 필요할 때가 많습니다.
public class DTOEntityConverter {
private ObjectCopyHelper copyHelper;
public DTOEntityConverter() {
this.copyHelper = new ObjectCopyHelper();
}
public PersonEntity convertToEntity(PersonDTO personDTO) {
return copyHelper.copyObject(personDTO, PersonEntity.class);
}
public List<PersonEntity> convertToEntityList(List<PersonDTO> dtoList) {
List<PersonEntity> entityList = new ArrayList<>();
for (PersonDTO dto : dtoList) {
entityList.add(convertToEntity(dto));
}
return entityList;
}
}
public class Main {
public static void main(String[] args) {
// DTO 객체 생성
PersonDTO dto = new PersonDTO();
dto.setName("John");
dto.setAge(30);
// DTO를 Entity로 변환
DTOEntityConverter converter = new DTOEntityConverter();
PersonEntity entity = converter.convertToEntity(dto);
// Entity 객체 확인
System.out.println("Entity: " + entity.getName() + ", " + entity.getAge());
}
}
위 예제에서 PersonDTO 객체를 PersonEntity로 변환하여 데이터베이스와 매핑되는 영속성을 가지는 객체로 사용할 수 있습니다.
이렇게 DTO와 Entity 사이의 변환을 통해 데이터 전송과 영속성 관리를 적절하게 처리할 수 있습니다.
'JAVA' 카테고리의 다른 글
[JAVA] 스레드(Thread), 스레드의 동시성, 멀티 스레드(Multi-Thread) (5) | 2023.07.30 |
---|---|
[JAVA] 일반 for문과 향상된 for문의 차이와 진실 Feat.Iterator (5) | 2023.07.29 |
[JAVA] 컬렉션(Collection)[2]- Map에 대하여 (1) | 2023.07.27 |
[JAVA] 컬렉션(Collection)[1]- List에 대하여 (0) | 2023.07.26 |
[JAVA] 컬렉션(Collection)[0]- Collection에 대하여 (0) | 2023.07.26 |