SpringFramework/Spring

MapStruct 설정 (ModelMapper 대안)

lovineff 2021. 3. 23. 12:27

ModelMapper가 많이 사용하고 사용하기 편하나 성능 이슈가 있고, 아래 URL을 통해 확인할 수 있다.

 

Performance of Java Mapping Frameworks | Baeldung

MapStruct comes out on top, followed by JMapper as a close second. The other libraries follow far behind: Orika, ModelMapper, and Dozer.

www.baeldung.com

따라서, 성능 이슈에 대응하기 위해 ModelMapper 대신 MapStruct를 대신 사용한다.

 

MapStruct 설정

build.gradle 파일에 아래 의존성 추가

implementation 'org.mapstruct:mapstruct:1.3.1.Final'
annotationProcessor "org.mapstruct:mapstruct-processor:1.3.1.Final"

 

Mapper interface 클래스 생성

  • 아래 interface 생성시 프로젝트 빌드하는 경우 클래스명 + Impl 파일이 생성된다
  • Mapping 어노테이션을 통해 entity의 값 model 매핑 설정이 가능하다.
  • Model to Entity 설정도 가능
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface NewsBoxContentsMapper {
   NewsBoxContentsMapper INSTANCE = Mappers.getMapper(NewsBoxContentsMapper.class);

   @Mapping(target = "video1", expression = "java(entity.getIsVideo1().equals(0) ? false : true)")
   @Mapping(target = "video2", expression = "java(entity.getIsVideo2().equals(0) ? false : true)")
   @Mapping(target = "video3", expression = "java(entity.getIsVideo3().equals(0) ? false : true)")
   @Mapping(target = "video4", expression = "java(entity.getIsVideo4().equals(0) ? false : true)")
   @Mapping(target = "video5", expression = "java(entity.getIsVideo5().equals(0) ? false : true)")
   @Mapping(target = "video6", expression = "java(entity.getIsVideo6().equals(0) ? false : true)")
   @Mapping(target = "video7", expression = "java(entity.getIsVideo7().equals(0) ? false : true)")
   @Mapping(target = "video8", expression = "java(entity.getIsVideo8().equals(0) ? false : true)")
   @Mapping(target = "ad3", expression = "java(entity.getIsAd3().equals(0) ? false : true)")
   @Mapping(target = "ad4", expression = "java(entity.getIsAd4().equals(0) ? false : true)")
   NewsBoxContents entityToDto(NewsBoxManageEntity entity);
}

 

실제 사용

NewsBoxContentsMapper.INSTANCE.entityToDto(newsBoxManageTopEntity);