서버 작업을 하면 빈번하게 필요한 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 공식 github에서 mapstruct-kotlin의 아주 간단한 예제를 확인하실 수 있습니다.
https://github.com/mapstruct/mapstruct-examples/tree/main/mapstruct-kotlin
'backend > Kotlin' 카테고리의 다른 글
[Kotlin] 가변 컬렉션과 읽기 전용 컬렉션 구분하기 (0) | 2022.08.02 |
---|---|
[Kotlin] 읽기 전용 프로퍼티 - val property (0) | 2022.07.30 |