MapStruct maven 세팅
갓 블로그 발견.. 😭
MapStruct Dependency 추가 시 빌드 오류 문제
Problem
MapStruct 의존성을 추가한 뒤 .. “cannot find symbol”
오류가 마구 나옴.. 검색해본 결과.. 롬복과 충돌이 나는 걸로 추정 됨..
<properties>
<org.projectlombok.version>1.18.12</org.projectlombok.version>
</properties>
.
.
.
<!-- mapstruct -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
<optional>true</optional>
</dependency>
.
.
.
<build>
<plugins>
<!-- mapstruct -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<!-- mapstruct 를 사용할 때 lombok 과 충돌이 발생한다.
그래서 lombok 에 대한 path 도 추가해준다. -->
<annotationProcessorPaths>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
.
.
.
</plugins>
</build**>**
mapstruct-processor dependency 가 조금은 다른 방식으로 호출 되기에 annotaionProcessorPaths 에 작성하게 된다. 이때, 만약 lombok 을 같이 사용하고 있다면, 충돌이 발생한다고 한다.
(lombok 보다 앞에 선언 해줘야 오류가 안난다고도 한다)
- 해결방법
- lombok dependency 도 annotationProcessorPaths 에 추가해준다.
- scope 를 provided 로 작성하는 방법이다.
난 1번을 해줬는데 잘 됐음.
Mapper 만들기
1. 공통 Mapper 생성
public interface GenericMapper<V, E> {
V toVO(E entity);
E toEntity(V vo);
}
2. Entity별 Mapper 생성
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface WthdrwMapper extends GenericMapper<SvcWthdrwVO, SvcWthdrw> {
}
- Entity 에서 Dto로 변경
VO toVO(Entity entity);
- Dto 에서 Entity로 변경
Entity toVO(VO vo);
- 기존의 있던 값에서 변경→ 조회해서 이미 값이 존재하는 vo에 entity의 값이 들어감조건이 있으면 null 인 값은 건너 뛰고 set 됨
- 만약 ,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE
void toEntity(Entity entity, @MappingTarget VO vo)
@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE, unmappedSourcePolicy = ReportingPolicy.IGNORE,
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
public interface MemberMapper {
MemberMapper INSTANCE = Mappers.getMapper(MemberMapper.class);
void mappingToMemberEntity(RequestVO requestVO, @MappingTarget Member member);
Member toMemberEntity(RequestVO requestV
}