mapstruct/Lombok차이 및 충돌 오류, cannot find symbol
본문 바로가기
Spring/기타

mapstruct/Lombok차이 및 충돌 오류, cannot find symbol

by IYK2h 2021. 12. 3.
728x90

차이

ModelMapper 은 modelMapper.map 매핑이 일어날 때 리플렉션이 발생하고

MaStruct 는 컴파일 시점에서 구현체를 만들어 리플렉션이 발생하지 않는다

*리플렉션은 구체적인 클래스 타입을 알지 못해도, 컴파일한 클래스 정보를 활용해 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해 동적으로 프로그래밍이 가능하도록 지원하는 API

*동적으로 프로그래밍 -> 런타임 시점에 타입을 결정

즉, ModelMapper은 런타임에 매핑이 일어나고 MaStruct은 컴파일 시점에 구현체를 만든다.

문제

mapstruct가 정상적으로 작동하지 않았으며, "cannot find symbol"오류 발생

충돌 원인

mapstruct를 호출하는 방식이 조금 달라서 Lombok과 충돌이 발생

해결 방안

path 설정, 호출 순서는 mapstruct부터(gradle도 동일)

코드

<!--Pom.xml-->
​
<properties>
  <java.version>11</java.version>
  <org.mapstruct.version>1.3.1.Final</org.mapstruct.version>
  <org.projectlombok.version>1.18.12</org.projectlombok.version>
</properties>
   
<dependencies>
  <dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>${org.mapstruct.version}</version>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${org.projectlombok.version}</version>
    <scope>provided</scope>
  </dependency>
  <!-- ... -->
</dependencies>
​
<build>
  <plugins>
    <plugin>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.5.1</version>
      <configuration>
        <!-- java 버전을 따름-->
        <source>11</source>
        <target>11</target>
        <annotationProcessorPaths>
          <!-- mapstruct 를 호출시 lombok 과 충돌 발생. 그래서 mapstruct와  lombok 에 대한 path 추가(mapstruct가 항상 lombok보다 우선 -->
          <path>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${org.mapstruct.version}</version>
          </path>
          <path>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${org.projectlombok.version}</version>
          </path>
        </annotationProcessorPaths>
        <compilerArgs>
          <!-- 아래와 같이 의존성을 추가하면 매번 mapper에 @Mapper(componentModel = "spring")를 지정하지 안아도 된다. -->
          <compilerArg>
            -Amapstruct.defaultComponentModel=spring
          </compilerArg>
        </compilerArgs>
      </configuration>
    </plugin>
  </plugin
</build>
  

Reference

https://github.com/mapstruct/mapstruct-examples

"cannot find symbol"오류 git

728x90

'Spring > 기타' 카테고리의 다른 글

[JPA] @ElementCollection  (0) 2022.11.27
스웨거 헤더 넣기, swagger activate of authorize button  (0) 2022.10.07
JSON vs XML  (0) 2021.07.16

댓글