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());
}
// ......
}