🔭 3 min read
Gradle 기준으로는 다음처럼 작성합니다.
dependencies {
// Map Struct
implementation 'org.mapstruct:mapstruct:1.5.3.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
}
org.mapstruct:mapstruct:1.5.3.Final
MapStruct 사용을 위한 의존성 라이브러리입니다.
org.mapstruct:mapstruct-processor:1.5.3.Final (Annotation Processor)
의존성 목록에 반드시 Annotation Processor를 추가하여야 합니다.
MapStruct는 각 데이터 매퍼(데이터 변환 인터페이스)의 클래스를 생성해 두어야 하기 때문입니다.
org.projectlombok:lombok-mapstruct-binding:0.2.0 (Annotation Processor)
롬복에서 MapStruct와 충돌을 없애기 위한 org.projectlombok:lombok-mapstruct-binding 애노테이션 프로세서를 제공합니다. 이것을 사용하지 않으면 롬복 Annotation Processor와 호출 순서 등에서 충돌이 있습니다.
Maven
Gradle에서는 의존성 라이브러리에 그룹명:아티팩트명:버전 순으로 작성하기 때문에, Maven 사용자는 참고해서 변환하여 작성하시면 됩니다.
MapStruct에 대한 JVM 옵션으로 -Amapstruct.defaultComponentModel=spring
을 제공할 수 있습니다.
-Amapstruct.defaultComponentModel=spring
이를 자동으로 제공하게 작성해 두려면 build.gradle
에 이런 태스크 작성•수정을 하면 됩니다. 모듈 단위로 작성하기 때문에 멀티모듈인 경우 allprojects
또는 subprojects
에 작성하거나, 원하는 프로젝트에 대해서만 작성하여도 됩니다.
(평범한 단일 모듈이면 그냥 build.gradle
에 최외곽 중 한 곳에 추가로 작성하면 됩니다.)
다음은 예시입니다.
// Add VM Option (1)
compileJava {
options.compilerArgs += [
'--enable-preview', // (다른 옵션을 전달하고 있다면.)
'-Amapstruct.defaultComponentModel=spring' // here
]
}
// Add VM Option (2)
compileTestJava {
options.compilerArgs += [
'--enable-preview', // (다른 옵션을 전달하고 있다면.)
'-Amapstruct.defaultComponentModel=spring' // here
]
}
// Add VM Option (3)
tasks.named('test') {
useJUnitPlatform()
jvmArgs([
'--enable-preview', // (다른 옵션을 전달하고 있다면.)
'-Amapstruct.defaultComponentModel=spring' // here
])
}
객체 변환을 담당하는 매퍼를 생성합니다.
인터페이스만 작성해 두면 매퍼 클래스와 객체는 자동으로 생성됩니다.
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import static org.mapstruct.MappingConstants.ComponentModel.SPRING; // String of "spring"
@Mapper // (componentModel = SPRING) << `defaultComponentModel` 제공 안 했다면 작성
public itnerface ExampleMapper {
@Mapping(target = "name", source = "dto.nameA")
@Mapping(target = "nickname", source = "dto.nameB")
ExampleDomain toDomain(ExampleCreationRequestDto dto, ExampleStatus status, Instant createdAt);
}
@Service // [1] 서비스 등으로 등록하고
@RequiredArgsConstructor // [2] 생성자를 통해
public final class DefaultExampleService implements ExampleService {
// ...
private final ExampleMapper mapper; // [3] Bean 주입
@Override
public ExampleDomain registerExample(
ExampleCreationRequestDto dto,
ExampleStatus status,
Instant createdAt
) {
ExampleDomain example = mapper.toDomain(dto, status, createdAt);
// ...
}
}
이렇게 간단하게 매퍼를 생성하고 사용할 수 있습니다.