DTO Entity 매핑

By | 2020년 12월 30일
Table of Contents

DTO Entity 매핑

MapStruct 를 이용해 매핑을 자동화합니다.

MapStruct 설치

build.gradle 에 다음의 내용을 추가합니다.

dependencies {
    // ......
    implementation 'org.mapstruct:mapstruct:1.4.1.Final'
    // ......
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.1.Final'
    // ......
}

Entity, DTO 클래스 추가

@Setter, @Getter, @NoArgsConstructor 는 반드시 설정해 줍니다.

MapStruct 의 작동방식이 일단 클래스를 @NoArgsConstructor 로 생성 후, @Setter, @Getter 를 이용해 값을 매핑하기에 누락되면 안됩니다.

심지어 상속을 받는다면 부모 클래스에도 @Setter, @Getter 를 설정해야 합니다.

오류의 99% 가 @Setter, @Getter 누락입니다.

@Setter
@Getter
@NoArgsConstructor
@Entity
@Table(name = "tbl_partners", catalog = "db_partners")
public class Partners extends BaseTimeEntity {

    @Id
    private String partnerId;

    @Column(length = 128, nullable = false)
    private String partnerName;

    @Column
    private String useyn;
}
@Getter
@Setter
@NoArgsConstructor
public class PartnersDto extends BaseTimeDto implements Serializable {

    private String partnerId;

    private String partnerName;

    private String useyn;
}

Mapper 생성

Mapper 인터페이스를 생성합니다.

매퍼 클래스는 자동으로 생성됩니다.

@Mapper
public interface PartnersMapper {

    Partners to(PartnersDto d);
    PartnersDto to(Partners e);
}

Service 생성

매퍼를 생성해서 자동 매핑을 사용할 수 있습니다.

@Service
public class PartnersService extends CustomGenericService<PartnersDto, Partners, String, String> {

    private final PartnersMapper mapper = Mappers.getMapper(PartnersMapper.class);

    // ......

    @Override
    public PartnersDto toDto(Partners partners) {
        return mapper.to(partners);
    }

    @Override
    public Partners toEntity(PartnersDto e) {
        return mapper.to(e);
    }

    // ......
}

List<Entity>, List<DTO> 매핑

List.stream().map() 을 이용해 매핑할 수 있습니다.

@Service
public class PartnersService extends CustomGenericService<PartnersDto, Partners, String, String> {

    private final PartnersMapper mapper = Mappers.getMapper(PartnersMapper.class);

    // ......

    @Override
    public PartnersDto toDto(Partners partners) {
        return mapper.to(partners);
    }

    @Override
    public Partners toEntity(PartnersDto e) {
        return mapper.to(e);
    }

    private List<PartnersDto> toDto(List<Partners> lst) {

        return lst.stream().map(this::toDto).collect(Collectors.toList());
    }

    // ......
}

답글 남기기