MapStruct 란
Spring 개발 시 Controller, Service, Repository 레이어 별로 통신에 사용하는 객체 타입간 형변환을 위한 라이브러리
사용하는 이유
각 레이어별로 서로 다른 데이터타입 (dto ↔ entity) 를 쓰는 이유는 entity 의 경우 DB 테이블과 1:1 로 대응 되는 객체이고 dto 의 경우 데이터 교환시에 이용되는 객체 이기 때문에 서로 근본적인 용도가 다르다. dto 는 사용자가 필요한 컬럼만 생성하거나 DB 에 존재하지 않는 필드도 생성하여 사용
entity 는 내부적으로 EntityManager 가 관리 하고 실질적으로 DB 에 영향을 주는 객체 이기 때문에 함부로 값을 변경한다거나 객체를 생성해서는 안됨
전세계적으로 가장 많이 쓰는 object mapping 라이브러리
dependency
implementation 'org.mapstruct:mapstruct:1.5.1.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.1.Final'
// lombok 과 mapstruct 를 동시에 사용하기 위한 바인딩 라이브러리
implementation 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
사용법
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface MemberMapper {
MemberMapper INSTANCE = Mappers.getMapper(MemberMapper.class);
MemberDTO toDto(Member entity);
Member toEntity(MemberDTO dto);
}
unmappedTargetPolicy = ReportingPolicy.IGNORE
의 옵션은 dto 와 entity 간 서로 맞지않은 필드 갯수가 있을 경우 런타임시 경고문이 뜨는데 해당 경고문을 무시하겠다는 옵션
사용예시
저장한 entity 를 dto 로 변환하여 리턴