Entity와 DTO간 객체 변환을 할 때 ModelMapper를 활용하면, 쉽게 변환할 수 있다.
<!-- model mapper - entity-DTO conversion -->
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.0</version>
</dependency>
사용 방법은 간단하다.
private PaymentDto convertToDto(Payment payment) {
// Entity를 DTO로 변환하기위해 modelmapper사용
ModelMapper modelMapper = new ModelMapper();
PaymentDto paymentDto = modelMapper.map(payment, PaymentDto.class);
return paymentDto;
}
처음에는 이렇게 convertToDto 메소드로 Entity에서 DTO로 변환하는 작업을 했으나, 이것은 비즈니스 로직이 아니기 때문에 따로 Mapper클래스를 생성하는 것이 좋다.
<!-- mapStruct - Entity to Dto-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.1.Final</version>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</configuration>
</plugin>
import java.util.List;
public interface EntityMapper <D, E>{
E toEntity(D dto);
D toDto(E entity);
List<D> toDtoList(List<E> entity);
}
@Mapper(componentModel = "spring")
public interface PaymentMapper extends EntityMapper<PaymentDto, Payment> {
}
@Autowired
private PaymentMapper paymentMapper;
@Override
@Transactional
public PaymentDto cancelRequest(String mbrId, String pmtId, long pmtAmt, Boolean isParticleCancle) {
// ...
Payment result = paymentRepository.save(newPayment);
PaymentDto paymentDto = paymentMapper.toDto(result);
return paymentDto;
}
이렇게 사용하면된다. 만약에 변수명이 다르다면, @Mapping annotation으로 쉽게 바꿀 수 있다.