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를 만들어보자.
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하면 다시 잘 생성되어 있다.
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(); } }