MapStruct 세팅

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 보다 앞에 선언 해줘야 오류가 안난다고도 한다)

  • 해결방법
    1. lombok dependency 도 annotationProcessorPaths 에 추가해준다.
    2. 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> {

}
  1. Entity 에서 Dto로 변경
  2. VO toVO(Entity entity);
  3. Dto 에서 Entity로 변경
  4. Entity toVO(VO vo);
  5. 기존의 있던 값에서 변경→ 조회해서 이미 값이 존재하는 vo에 entity의 값이 들어감조건이 있으면 null 인 값은 건너 뛰고 set 됨
  6. 만약 , nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE
  7. 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

}

Java - Model(Object) mapping을 위한 Mapstruct (맵스트럭트)!