backend/Kotlin

[Kotlin] 코틀린 MapStruct 적용 및 사용하기 (feat.gradle)

버리야 2022. 9. 2. 09:00
반응형

서버 작업을 하면 빈번하게 필요한 Model과 DTO 변환을 필드 선언만 해놓으면 자동으로 변환해주는 MapStruct를 Java 작업할때 많이 사용하는데요. Kotlin에서도 적용해보았습니다.

 

Kotlin MapStruct 적용

build.gradle.kts 파일에 추가해줍니다.

// build.gradle.kts

plugins {
	kotlin("kapt") version "1.7.10"
}

subprojects {
	apply(plugin = "kotlin-kapt")

	dependencies {
        implementation("org.mapstruct:mapstruct:1.5.2.Final")
        kapt("org.mapstruct:mapstruct-processor:1.5.2.Final")
        kaptTest("org.mapstruct:mapstruct-processor:1.5.2.Final")
	}
}

 

Kotlin MapStruct 사용

아래와 같이 Person(Model) 과 PersonDto(DTO)간의 매핑이 필요한다고 하면,

data class Person(var firstName: String?, var lastName: String?, var phoneNumber: String?, var birthdate: LocalDate?)
data class PersonDto(var firstName: String?, var lastName: String?, var phone: String?, var birthdate: LocalDate?)

 

MapStruct Converter를 interface로 생성을 해줘야 합니다.

 

MapStruct Mapper 정의

import org.mapstruct.Mapper

@Mapper
interface PersonConverter {

    @Mapping(source = "phoneNumber", target = "phone")
    fun convertToDto(person: Person) : PersonDto

    @InheritInverseConfiguration
    fun convertToModel(personDto: PersonDto) : Person

}

 

Mapper를 정의한후에 build를 해주면 자동으로 @Mapper 붙인 interface 이름에 Impl이 붙은 클래스가 generate 된 것을 확인할 수 있습니다.

kotlin-annotation-processing 은 dependency에 추가한 kapt에 의해 동작하는 것입니다. 

더 자세한건, kotlin 공식 홈페이지를 참고해주세요

 

MapStruct는 선언된 Model과 DTO간의 이름이 같다면 자동으로 매핑을 해주고, 이름이 다를 경우는 @Mapping annotation을 이용해서 정의를 해주면 됩니다.

 

MapStruct Mapper를 사용하여 convert 해주기

val converter = Mappers.getMapper(PersonConverter::class.java) // or PersonConverterImpl()

val person = Person("Samuel", "Jackson", "0123 334466", LocalDate.of(1948, 12, 21))

val personDto = converter.convertToDto(person)
println(personDto)

val personModel = converter.convertToModel(personDto)
println(personModel)

 

참고. 

Kotlin 1.1부터 반복적인 annotation 은 지원되지 않아서, @Mapping을 여러개 사용해야할 때는 Mapping-Annotation을 감싼 @Mappings를 사용해서 선언해야 합니다.

  @Mappings(
        Mapping(source = "majorVersion", target = "major"),
        Mapping(source = "minorVersion", target = "minor"),
        Mapping(source = "patchVersion", target = "patch"),
        Mapping(source = "normalVersion", target = "normal"),
        Mapping(source = "preReleaseVersion", target = "preRelease")
)
fun convertToDto(version: Version): VersionDto

 

더 자세히..

MapStruct 공식 홈페이지 : https://mapstruct.org/

 

MapStruct – Java bean mappings, the easy way!

Java bean mappings, the easy way! Get started Download

mapstruct.org

 

mapstruct 공식 github에서 mapstruct-kotlin의 아주 간단한 예제를 확인하실 수 있습니다.

https://github.com/mapstruct/mapstruct-examples/tree/main/mapstruct-kotlin

 

GitHub - mapstruct/mapstruct-examples: Examples for using MapStruct

Examples for using MapStruct. Contribute to mapstruct/mapstruct-examples development by creating an account on GitHub.

github.com

 

반응형