ModelMapper 사용법
1. 들어가며
ModelMapper는 Java 객체 간의 매핑을 단순하고 쉽게 만들어주는 라이브러리입니다. 주로 DTO(Data Transfer Object)와 도메인 객체 간 변환에 사용되며, 소스 코드를 깔끔하게 유지하면서 매핑 작업을 수행할 수 있습니다. 이 블로그 글에서는 ModelMapper의 기본 사용법 및 활용 사례를 소개합니다.
2. ModelMapper 설치
Maven 또는 Gradle 프로젝트에 ModelMapper를 추가하려면, 빌드 파일에 다음 종속성을 추가하세요.
Maven:
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.4.5</version>
</dependency>
Gradle:
implementation 'org.modelmapper:modelmapper:2.4.5'
3. ModelMapper 기본 사용법
(1) 객체 생성
ModelMapper 객체를 생성하고, 런타임에 재사용할 수 있도록 인스턴스를 만듭니다.
ModelMapper modelMapper = new ModelMapper();
(2) 간단한 예제
아래 예제에서는 간단한 객체 매핑을 수행합니다. User 객체를 UserDTO로 변환하는 과정을 살펴봅시다.
public class User {
private String name;
private int age;
// getters and setters
}
public class UserDTO {
private String name;
private int age;
// getters and setters
}
다음과 같이 ModelMapper를 사용하여 User 객체를 UserDTO로 변환합니다.
User user = new User("John Doe", 30);
UserDTO userDTO = modelMapper.map(user, UserDTO.class);
(3) 매핑 구성 및 커스터마이징
기본적으로 ModelMapper는 소스와 대상 객체의 동일한 속성 이름을 가진 필드를 매핑합니다. 그러나 다른 이름의 필드를 매핑하거나 특정 속성을 무시하려면 매핑 구성을 사용할 수 있습니다.
public class User {
private String firstName;
private String lastName;
private int age;
// getters and setters
}
public class UserDTO {
private String fullName;
private int age;
// getters and setters
}
// ModelMapper 설정
modelMapper.getConfiguration()
.setFieldMatchingEnabled(true)
.setFieldAccessLevel(org.modelmapper.config.Configuration.AccessLevel.PRIVATE);
// 매핑 구성 정의
PropertyMap<User, UserDTO> userMap = new PropertyMap<User, UserDTO>() {
protected void configure() {
map().setFullName(source.getFirstName() + " " + source.getLastName());
// 기타 매핑 구성 추가
}
};
// 구성을 ModelMapper에 추가
modelMapper.addMappings(userMap);
// 변환
User user = new User("John", "Doe", 30);
UserDTO userDTO = modelMapper.map(user, UserDTO.class);
이 예제에서는 `User` 객체의 `firstName`과 `lastName` 필드를 결합하여 `UserDTO`의 `fullName` 필드로 매핑하는 구성을 정의했습니다.
(4) 중첩된 객체 매핑
ModelMapper는 중첩된 객체도 쉽게 매핑할 수 있습니다. 예를 들어, `Address` 객체를 포함하는 `User` 객체와 `UserDTO` 객체가 있다고 가정합니다.
public class Address {
private String street;
private String city;
private String country;
// getters and setters
}
public class User {
private String firstName;
private String lastName;
private int age;
private Address address;
// getters and setters
}
public class UserDTO {
private String fullName;
private int age;
private AddressDTO address;
// getters and setters
}
public class AddressDTO {
private String street;
private String city;
private String country;
// getters and setters
}
// 매핑 구성 정의
PropertyMap<User, UserDTO> userMap = new PropertyMap<User, UserDTO>() {
protected void configure() {
map().setFullName(source.getFirstName() + " " + source.getLastName());
// 기타 매핑 구성 추가
}
};
// 구성을 ModelMapper에 추가
modelMapper.addMappings(userMap);
// 변환
Address address = new Address("123 Main St", "New York", "USA");
User user = new User("John", "Doe", 30, address);
UserDTO userDTO = modelMapper.map(user, UserDTO.class);
이 예제에서는 중첩된 `Address` 객체를 포함하는 `User` 객체를 `UserDTO` 객체로 변환했습니다. ModelMapper는 자동으로 중첩된 객체의 매핑을 처리합니다.
4. 결론
ModelMapper는 강력한 객체 매핑 라이브러리로, DTO와 도메인 객체 간의 변환을 쉽게 처리할 수 있습니다. 기본적인 매핑부터 복잡한 구성까지 다양한 시나리오를 지원하며, 코드의 가독성과 유지 관리를 개선할 수 있습니다. 이 글에서는 ModelMapper의 주요 기능과 사용법을 소개했으나, 더 많은 옵션과 기능을 제공하고 있습니다. 공식 문서(ModelMapper Documentation)를 참조하여 필요한 기능을 찾아보세요.
마지막으로, ModelMapper를 사용하면 객체 매핑 작업을 간결하게 할 수 있지만, 성능상의 이슈가 있을 수 있습니다. 대규모 프로젝트에서는 성능 테스트를 실시하고, 필요에 따라 ModelMapper를 사용할지 결정해야 합니다. 또한, 다양한 객체 매핑 라이브러리가 존재하므로 여러 옵션을 비교해보고 프로젝트에 가장 적합한 도구를 선택하는 것이 좋습니다.
참고자료:
ModelMapper 공식 웹사이트
ModelMapper GitHub 저장소
ModelMapper 사용자 설명서