Programing/JPA

mapStruct updateFromDto, null 컬럼 제외하고 update

리커니 2023. 8. 10. 16:18
반응형

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

 

MapStruct 1.5.5.Final Reference Guide

If set to true, MapStruct in which MapStruct logs its major decisions. Note, at the moment of writing in Maven, also showWarnings needs to be added due to a problem in the maven-compiler-plugin configuration.

mapstruct.org

 

반응형