[Spring] MapStruct 필드명이 다른 경우 매핑하기

Walter Mitty·2023년 6월 1일
0

MapStruct 를 사용하다 보면 필드명(변수명)이 똑같으면 너무 좋겠지만, entity 식별을 위해 달라지는 경우가 종종 생긴다.

매핑하려는 클래스들

Users.java

@Getter
public class Users extends DateColumn {

    @Column(name = "name", length = 10)
    private String name;

    @Column(name = "birth", length = 10)
    private String birth;

    @Column(name = "tel", length = 11)
    private String tel;

    @Column(name = "gender", length = 2)
    private String gender;

    @Column(name = "region", length = 10)
    private String region;
}

UserReaderDTO.java

@Setter
public class UserReaderDTO {

    private String userName;
    private String userBirth;
    private String userTel;
    private String userGender;
    private String userRegion;
}

보면 각각 name = userName, birth = userBirth ... 이런식으로 매핑될 필드임을 알 수 있다.

MapStruct 인터페이스

이제 MapStruct를 만들어보자.

UserReaderMapper.java

@Mapper(componentModel = "spring")
public interface UserReaderMapper {
    UserReaderMapper INSTANCE = Mappers.getMapper(UserReaderMapper.class);

    @Mapping(source="name", target = "userName")
    @Mapping(source="birth", target = "userBirth")
    @Mapping(source="tel", target = "userTel")
    @Mapping(source="gender", target = "userGender")
    @Mapping(source="region", target = "userRegion")
    UserReaderDTO toUserReaderDTO(Users user);
}

먼저, @Mapper(componentModel = "spring") 어노테이션을 통해 해당 인터페이스를 spring의 mapper라고 인식 시켜준다.

그 다음, 필드명이 다른 부분을 @Mapping 어노테이션을 사용해 지정해준다.
나같은 경우는 Users 를 UserReaderDTO 로 매핑을 시키려고한다.
따라서 source = "Users쪽 필드명", target = "UserReaderDTO쪽 필드명" 을 적어주면 된다.

다른 곳에서는 source에 user.id, user.birth 이런식으로 적던데.... 계속 빨간줄과 함께 Can't find related attribute 가 뜨길래 제거해봤더니 잘됐다.

여기서 새로 고쳐지는게 있다면 Build clean 후 다시 build하면 다시 잘 생성되어 있다.

만들어진 Impl 클래스

UserReaderMapperImpl.java

@Component
public class UserReaderMapperImpl implements UserReaderMapper {

    @Override
    public UserReaderDTO toUserReaderDTO(Users user) {
        if ( user == null ) {
            return null;
        }

        UserReaderDTO.UserReaderDTOBuilder userReaderDTO = UserReaderDTO.builder();

        userReaderDTO.userName( user.getName() );
        userReaderDTO.userBirth( user.getBirth() );
        userReaderDTO.userTel( user.getTel() );
        userReaderDTO.userGender( user.getGender() );
        userReaderDTO.userRegion( user.getRegion() );

        return userReaderDTO.build();
    }
}

0개의 댓글