-
[JAVA, ModelMapper] Embedded Class의 특정 컬럼 매핑 시키기JAVA 2023. 9. 21. 08:47728x90
안녕하세요.
오늘도 SpringBoot 백엔드 프로젝트 중에 특이 사항이 생겨 기록하고 나중에 잊지 않고자 합니다.
수업만 들을때는 다 알았다고 생각했는데 세상은 참 쉽지 않습니다~
그럼에도 또 이렇게 배우는 재미에 코딩하는게 아닐까 싶습니다.😊😊
오늘 작성한 문제는 JPA를 통해 꺼내온 데이터를 ResponseDto로 변환하기 위해 ModelMapper를 사용했습니다.
그러나 특정 컬럼이 매핑 되지 않고 계속 null값이 들어갔습니다.
해당 문제를 해결하려고 거의 이틀을 꼬박 보냈네요 ㅠㅠ
문제 상황
문제 상황입니다.
Address Class에는 zipcode, address1, address2가 있습니다.
public class Address { private String zipcode; private String address1; private String address2; }
이렇게 말이죠~ 해당 클래스는
@Embeddable
처리가 돼있습니다. 아무래도 회사코드다 보니 자세히는 적을 수 없어 간단하게만 표현하겠습니다.
다음은 Address Class를 사용하는 Company Class입니다.
회사의 주소를 작성하기위해 Address Class를 Embedded했습니다.
Company Class
public class Company extends BaseEntity{ ... @Embedded private Address address; ... }
이렇게 사용하고 있습니다.
다음은 Mapping Target인 ResponseDto Class입니다.
public class ResponseDto { ... private String companyZipcode; private String companyAddress1; private String companyAddress2; ... }
즉 Address Class와 ResponseDto Class에서
zipcode => companyZipcode
address1=> companyAddress1
address2=> companyAddress2
로 매핑하려는 목적입니다.
여기서 문제는
address1, address2는 매핑되지만 유독 zipcode만 매핑되지 않았습니다.
이제 해당 문제를 해결해 봅시다.
문제원인
문제원인은 아무래도 ModelMapper.map의 한계로 확인이 됩니다.
사용자의 입장에서는 매핑되는 자세한 내용을 알 수 없기에 ModelMapper를 선호하지 않는분도 계신다는걸 알게됐습니다.
항상 편한건 양날의 검이 있다는 사실을 알고 임해야겠습니다!
해결방안
List<Company> result= companyRepository.findAll(); List<CompanyResponseDto> response=Arrays.asList(this.modelMapper.map(result, CompanyResponseDto[].class));
기존에 조회결과를 바로 매핑했었습니다.
이제는 TypeMap을 이용해 매핑할 타입설정, 그리고 매핑될 컬럼에 대해서 설정해주겠습니다.
TypeMap<Company, CompanyResponseDto> propertyMapper=this.modelMapper.createTypeMap(Company.class, CompanyResponseDto.class); propertyMapper.addMappings( mapper->mapper.map(src->src.getAddress().getZipcode(), CompanyResponseDto::setCompanyZipcode) );
이렇게 추가해 주겠습니다.
TypeMap<매핑될 타입 , 매핑할 타입>을 넣습니다.
그리고 서로 매핑되지 않아 문제가 발생했던 Address에서 zipcode의 데이터를 CompanyResponseDto Class의 SetCompanyZip으로 매핑해주겠습니다.
아마 뇌피셜이지만 사용하기위헤서는 데이터를 가져오는 쪽에서는 getter가, 매핑되는 쪽에서는 setter가 열려있어야지 싶네요~
막상 해보니 별거 없는거 같은데 이걸 너무 오래 잡고 있었네요 ㅠㅠㅠ
오늘은 이렇게 마무리하겠습니다!
요즘 갑작스레 날씨가 추워지네요.
다들 감기 조심하시길 바랍니다. :D
'JAVA' 카테고리의 다른 글
[JAVA, HashMap] Key가 Class일때 containsKey사용하기 (1) 2023.11.14 [JAVA, HashSet] HashSet의 중복체크 관련 글 (0) 2022.12.13 [SpringBoot] IntelliJ 한글깨짐 관련 (0) 2022.08.27 [JAVA, SpringBoot] 404 WhiteLabel에러 관련 글 (0) 2022.08.22