MapStruct

Kyle_Kim·2023년 2월 24일
0
post-thumbnail

@Mapper annotation이 알아서 interface명 + Impl클래스를 만들어준다.

@Mapper()

  • componentModel: spring빈으로 사용하기 위한 세팅.
  • unmappedTargetPolicy: ReportingPolicy.IGNORE
    -- 맵핑에 대해서 경고가 나오면 무시한다.

만약 mapStruct에서 조인된 세부 필드를 맵핑하고 싶다면?

ex> 예를들어 Part.java와 PartOld220.java를 맵핑 한다고 해보자

public class Part implements Serializable {

    @Id
    @Column(name = "PART_NM", nullable = false, length = 100)
    private String partName;

    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(
        name = "ASST_SEQNO",
        foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT)
    )
    private Machine machine;

    @Id
    @Column(name = "VENDOR_NM", nullable = false, length = 50, columnDefinition = "varchar(50)")
    private String vendorName;

    --- 중략 --- 

    @Column(name = "YOFFSET", columnDefinition = "float default NULL")
    private Float yOffset;
}
public class PartOld220 implements Serializable {
    @Id
    @Column(name = "PART_NM", nullable = false, length = 100)
    private String partName;

    @Id
    @Column(name = "ASST_SEQNO", nullable = false)
    private Long assetSeqno;

    @Id
    @Column(name = "VENDOR_NM", nullable = false, length = 50, columnDefinition = "varchar(50)")
    private String vendorName;
        
        --- 중략 --- 

    @Column(name = "YOFFSET", columnDefinition = "float default NULL")
    private Float yOffset;
}

Mapping abstract class

  • 따로 맵핑 해줘야 하는 특정 컬럼이 없는 경우는 그냥 interface로 만들어 줘야 하지만, 따로 맵핑할 특정 컬럼이 있는 경우는 abstract 클래스로 만들어 줘야한다.
  • 자세한 내용은 코드 사이에 있는 코멘트를 참고한다.
@Mapper(componentModel = "spring"
    ,unmappedTargetPolicy = ReportingPolicy.IGNORE
)
public abstract class PartMapper {
    @PersistenceContext
    EntityManager entityManager; 
/*
mapMachine메소드의 파라메터에 PartOld220을 넣어주면 커스텀 맵퍼 안에서 .getAssetSeqno()로 접근히여 
*/
    @Mapping(target = "machine" , source="old")
    public abstract LibPart toNew(PartOld220 old);
    
    @Mapping(target = "assetSeqno" , source="origin.machine.assetSeqno")
    public abstract PartOld220 toOld(Part origin);

// Machine과 assetSeqno를 매핑한다. 
    Machine mapMachine(PartOld220 part){
        Long id = part.getAssetSeqno();
        return (id == null) ? null : entityManager.getReference(Machine.class, id);
    }
}

만약 따로 맵핑해줄 만한 컬럼이 따로 없다면, 아래 예제와 같이 매퍼 interface를 만들어주면 된다.

@Mapper(componentModel = "spring")
public interface OddShapeImageMapper {
    OddShapeImage toNew(OddShapeImageOld220 old);
    OddShapeImageOld220 toOld(OddShapeImage original);
}
profile
Make Things Right

0개의 댓글