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
반응형
'Programming-[Backend] > SpringBoot' 카테고리의 다른 글
testcontainer 자바 도커 컨테이너 테스트: @ExtendWith, @DirtiesContext (1) | 2024.06.02 |
---|---|
@SpringBootApplication 이해하기 (0) | 2022.06.02 |
[탐험]Spring MVC, String 전체 앞 뒤 공백 제거하기! - MappingJackson2HttpMessageConverter, @JsonFormat, StringTrimmerEditor (0) | 2022.03.02 |
[TIL][Spring security] hasRole 적용 시 access is denied 문제 (0) | 2022.01.20 |
[TIL][링크] MapStruct 라이브러리 - @AfterMapping (0) | 2021.12.08 |