mapStruct updateFromDto, null 컬럼 제외하고 update
mapStruct의 toEntity 메서드를 활용하여 전달받은 DTO 를 Entity로 변환하여 save 메서드를 호출할 때 전달되지 않은 변수 값의 경우 null로 update 됩니다.
[DTO]
@AllArgsConstructor
@Getter
@Setter
public class TestDTO {
private String grpCdId;
private String cdId;
private String cdNm;
}
[Entity]
@Setter
@Getter
@Entity
@Table(name = "TEST")
public class TestEntity implements Serializable {
@Id
@Column(name = "grp_cd_id")
private String grpCdId
@Column(name = "cd_id")
private String cdId;
@Column(name = "cd_nm")
private String cdNm;
}
[Parameter]
{
"grpCdId":"updateFromDtoTest",
"cdId":"1"
}
[Update code]
Optional<M_OP_CD> entity = repository.findById(param.getGrpCdId);
entity.ifPresent(save(codeMapper.INSTANCE.toEntity(param))); //cdNm이 null로 set
cdNm이 필수 값일 경우 @NotNull 을 써서 필수 값 처리를 해주면 되지만, 필수 값이 아닐 경우
prameter의 값을 일일이 확인하여 null이 아닌 경우에만 entity에 set을 해주어야 합니다.
Optional<M_OP_CD> entity = repository.findById(param.getGrpCdId);
if(entity.isPresent()){
if(param.getCdId() != null) {
entity.get().setCdId(param.getCdId);
}
if(param.getCdNm() != null) {
entity.get().setCdNm(param.getCdNm);
}
save(entity.get());
}
이런 작업을 줄여주는 메서드가 updateFromDto 입니다.
사용 방법은 Mapper에 아래의 메서드를 추가해주면 됩니다.
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void updateFromDto(TestDTO dto, @MappingTarget TestEnttiy entity);
null 일 경우 무시하는 옵션을 주고, entity 에 @MappingTarget 을 추가합니다.
이렇게 하면 생성되는 mapperImpl에 아래와 같이 코드가 추가되게 됩니다. (build/generated/sources/annotationProcessor/java/main 에서 도메인 경로로 가면 자동 생성)
@Override
public void updateFromDto(CodeInsUpdtVO dto, M_OP_CD entity) {
if ( dto == null ) {
return;
}
if ( dto.getCdId() != null ) {
entity.setCdId( dto.getCdId() );
}
if ( dto.getCdNm() != null ) {
entity.setCdNm( dto.getCdNm() );
}
}
updateFromDto 메서드를 호출함으로써, null인 변수 값을 제외하고 update 가 됩니다.
메서드 호출 후에 save를 하지 않아도 update가 되니, 중복으로 작성하지 않도록 주의하세요.
예시코드는 리턴 값이 void 로 되어 있지만 update가 된 Entity를 리턴받을 수도 있습니다.
자세한 내용은 아래의 Link를 참고하세요!
Link : https://mapstruct.org/documentation/stable/reference/html/#updating-bean-instances