본문 바로가기
관리자

Programming-[Backend]/SpringBoot

Mapstruct 기능 기록 uses, expression, @Named, qualifiedByName

728x90
반응형

 

Mapstruct로 Mapping 할 때, 유용했던 기능에 대해서 정리한다.

 

uses

특정 객체 내부에 다른 객체가 list로 포함된 경우 uses를 사용해서 list 객체의 매핑을 자동으로 할 수 있다.

 

//Mapper 내부에 uses로 사용
@Mapper(componentModel = "spring", uses = {TaxPoToTaxDtoMapper.class})
public interface GoodsPoToGoodsDtoMapper extends BasePoDtoMapper<GoodsPo, GoodsDto> {

    GoodsDto copy(GoodsPo source);
}


// GoodsPo: List<TaxPo>가 포함되어 있다
public class GoodsPo extends BasePoAbstract {
    private String id;
    private String name;
    private Integer price;
    private List<TaxPo> taxes;
}

 

build 후 Impl로 생성되는 매퍼 구현체를 살펴보면 uses를 통해 설정해준 내부 리스트 객체의 매핑이 잘 되었는지 확인이 가능하다.

 

 

expression

expression을 활용해서 특정 메서드를 실행하고 그 결과를 mapping 시에 사용할 수 있다.

@Mapper(componentModel = "spring")
public interface GoodsDtoToGoodsEntityMapper extends BaseDtoEntityMapper<GoodsDto, GoodsEntity> {
	
    // source.getJsonData()로 source로 지정된 GoodsDto에 작성한 getJsonData()를 실행하고
    // 그 결과를 target의 jsonData에 담는다.
    @Mapping(expression="java(source.getJsonData())", target = "jsonData")
    
    // source나 target이 아니라 mapper 자체에서도 default 메서드를 활용하여 아래처럼 바로 값을
    // 리턴하여 담아줄 수 있다.
    @Mapping(expression="java(getDateTime())", target = "dateTime")
    GoodsEntity copy(GoodsDto source);

    default String getDateTime() {
        return LocalDateTime.now();
    }

}

 

 

@Named, qualifiedByName

불가피하게 깊이가 얼마나 될지 모르는 재귀구조 등을 매핑할 때는 @Named를 통해 매핑을 연결해줄 수 있다.

 

@Mapper(componentModel = "spring")
public interface GoodsDtoToGoodsEntitiyMapper extends BaseDtoEntityMapper<GoodsDto, GoodsEntity> {

    @Mapping(source = "goodsList", target = "goodsJsonData", qualifiedByName = "mapGoodsListToGoodsJson")
    GoodsEntity copy(GoodsDto source);

    @Named("mapGoodsListToGoodsJson")
    default List<Map<String, Object>> mapGoodsListToGoodsJson(List<GoodsDto> goodsDtoList) {
        return goodsDtoList.stream()
                .map(goodsDto -> {
                ...
                //중략. 재귀 구조로 메서드를 짜면 됨
                }
        }
}

 

728x90
반응형