MapStruct 사용하기 고급

By | 2021년 1월 25일
Table of Contents

MapStruct 사용하기 고급

DTO – Entity 준비

@Setter
@Getter
@NoArgsConstructor
@Entity
public class TestBrands {
    private String brandId;
    private String partnerId;
    private String brandName;
    private String useyn = "Y";

    private String partnerId2;
}
@Getter
@Setter
@NoArgsConstructor
public class TestBrandsDto {
    private String brandId;
    private String partnerId;
    private String brandName;
    private String useyn;

    private String brandName2;
}

스프링과 mapstruct 을 사용할 경우 componentModel = "spring"
반드시 붙여주어야 오류가 발생하지 않는다.

@Mapper(componentModel = "spring")
public interface TestBrandsMapper {

    TestBrands toEntity(TestBrandsDto dto);
    TestBrandsDto toDto(TestBrands entity);
}

일치하지 않는 필드 무시하기

ReportingPolicy.IGNORE 를 설정해서 일치하지 않는 필드를 무시할 수 있다.

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface TestBrandsMapper {

    TestBrands toEntity(TestBrandsDto dto);
    TestBrandsDto toDto(TestBrands entity);
}

무시할 필드를 명시할 수 있다.

@Mapper(componentModel = "spring")
public interface TestBrandsMapper {

    @Mapping(target = "partnerId2", ignore = true)
    @Mapping(target = "useyn", ignore = true)
    TestBrands toEntity(TestBrandsDto dto);

    @Mapping(target = "brandName2", ignore = true)
    @Mapping(target = "useyn", ignore = true)
    TestBrandsDto toDto(TestBrands entity);
}

일치하지 않는 필드를 수동으로 매핑

@Mapper(componentModel = "spring")
public interface TestBrandsMapper {

    @Mapping(source = "partnerId", target = "partnerId2")
    @Mapping(target = "useyn", ignore = true)
    TestBrands toEntity(TestBrandsDto dto);

    @Mapping(source = "brandName", target = "brandName2")
    @Mapping(target = "useyn", ignore = true)
    TestBrandsDto toDto(TestBrands entity);
}

상속받은 클래스 매핑

@SuperBuilder 를 붙여준다.

@Getter
@SuperBuilder
class BaseDto {
  private Long id;
}

@SuperBuilder
@Getter
@ToString
public class UserDto extends BaseDto {
  private String name;
  private String lastName;
  private String username;
  private String password;
  private String profilePicturePath;
}

Embedded class 를 쪼개서 매핑하고 싶을 때

Embedded class 의 변수명과 점을 붙여준다.

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring")
public interface ItemOptionToSearchServiceConverter {

    @Mapping(source = "id.itemId", target = "itemId")
    @Mapping(source = "id.itemOption", target = "itemOption")
    @Mapping(target = "id", ignore = true)
    SearchItemOptionEntity convert(SrcItemOptionEntity srcItemOptionEntity);
}

답글 남기기