http://modelmapper.org/
객체의 프로퍼티를 다른 객체의 프로퍼티로 맵핑해주는 유틸리티
ModelMapper
란 서로 다른 object 간의 필드 값을 자동으로 mapping 해주는 library
예를들어 Springboot + jpa 로 개발할 경우 Entity 와 view layer에서 사용될 data object가 구분된다. 따라서 Entity의 값을 view layer에 전달할 경우 data object 로 새로 변환해주는 작업을 해야한다. 일반적으로 getter/setter 또는 Builder 패턴을 통하여 해당 작업을 할 경우 필드가 많을 수록 코드가 길어지고 반복적인 작업량이 늘어난다.
TestEntity testEntity = testRepository.findById("test");
TestDto testDto = new TestDto();
testDto.setEmail(testEntity.getEmail());
testDto.setGender(testEntity.getGender());
testDto.setId(testEntity.getId());
// ...
반복적인 object 간 변환을 간단하게 줄이고 싶을 때 ModelMapper
를 사용할 수 있다!
maven
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.8</version>
</dependency>
gradle
implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.3.8'
매번 ModelMapper
를 생성하여 사용할 수 있지만, 반복적으로 여러 로직에서 사용됨으로 @Bean 으로 등록하여 사용하자.
@Configuration
public class AppConfig {
@Bean
public ModelMapper modelMapper(){
return new ModelMapper();
}
}
data 의 원본이 되는 source 와 기존 객체에 매핍할 경우 해당 객체를, 새로운 객체를 생성할 경우 생성할 객체의 class 를 전달하면 된다.
TestEntity testEntity = testRepository.findById("test");
TestDto testDto = modelMapper.map(testEntity, TestDto.class);
// TestDto testDto = new TestDto();
// testDto.setEmail(testEntity.getEmail());
// testDto.setGender(testEntity.getGender());
// testDto.setId(testEntity.getId());
추가적으로 특정 필드 skip, Null인 필드, source와 destination 객체 간의 필드가 다를 경우 등 다양한 상황에 대한 handling 방법이 있다. 해당 내용은 http://modelmapper.org/ 에서 직접 확인 해보면서 사용하는 것이 좋다.