MapStruct 데이터 변환 (2) 스프링에서 사용 기초 세팅

Letsdev·2023년 10월 18일
1

MapStruct 사용하기

목록 보기
2/2

🔭 3 min read


의존성 추가

Add Dependencies

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 사용자는 참고해서 변환하여 작성하시면 됩니다.

(선택) VM 파라미터 제공

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);
        
        // ...
    }
}

이렇게 간단하게 매퍼를 생성하고 사용할 수 있습니다.

profile
아 성장판 쑤셔 (블로그 이전) https://letsdev.hashnode.dev

0개의 댓글