MapStruct

개요

클래스 간에 값을 복사할때 사용하는 MapStruct를 활용한 프로젝트를 만들어 보겠다.

MapStruct 공식 사이트는 아래와 같다.

설정

빌드 스크립트의 plugins에 아래와 같이 kapt를 추가한다.

/build.gradle.kts

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

dependencies에는 관련 라이브러리와 kapt를 추가한다.

/build.gradle.kts

dependencies {
    testImplementation(kotlin("test"))

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

데이터 클래스 생성

먼저 User 도메인 클래스를 생성한다.

/src/main/kotlin/com/devkuma/mapstruct/domain/User.kt

package com.devkuma.mapstruct.domain

data class User(
    val name: String,
    val age: Int,
    val city: String?
)

그리고, UserDto 클래스를 생성한다.

/src/main/kotlin/com/devkuma/mapstruct/domain/UserDto.kt

package com.devkuma.mapstruct.dto

data class UserDto(
    val name: String,
    val age: Int,
    val city: String?
)

맵퍼 클래스 생성

맵퍼 클래스를 생성한다. /src/main/kotlin/com/devkuma/mapstruct/mapper/UserDto.kt

package com.devkuma.mapstruct.mapper

import com.devkuma.mapstruct.dto.UserDto
import com.devkuma.mapstruct.domain.User
import org.mapstruct.Mapper
import org.mapstruct.factory.Mappers

@Mapper
interface UserMapper {

    fun convertToDto(s: User): UserDto

    fun convertToDomain(s: UserDto): User

    companion object {
        val INSTANCE: UserMapper = Mappers.getMapper(UserMapper::class.java)
    }
}

데이터 클래스에 컨버터 함수 생성

User 도메인 클래스에 DTO 컨버터 함수 convertToDto()를 생성한다.

/src/main/kotlin/com/devkuma/mapstruct/domain/User.kt

package com.devkuma.mapstruct.domain

import com.devkuma.mapstruct.mapper.UserMapper

class User(
    val name: String,
    val age: Int,
    val city: String?
) {

    fun convertToDto() = UserMapper.INSTANCE.convertToDto(this)
}

UserDto 클래스에 도메인 컨버터 함수 convertToDomain()를 생성한다.

/src/main/kotlin/com/devkuma/mapstruct/dto/UserDto.kt

package com.devkuma.mapstruct.dto

import com.devkuma.mapstruct.mapper.UserMapper

class UserDto(
    val name: String,
    val age: Int,
    val city: String?
) {

    fun convertToDomain() = UserMapper.INSTANCE.convertToDomain(this)
}

테스트 코드 생성

User 도메인 클래스에 convertToDto()을 생성한다.

package com.devkuma.mapstruct.domain

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertAll
import kotlin.test.assertEquals

class UserTest {

    @Test
    fun convertToDto(){

        // Given
        var user = User(
            name = "devkuma",
            age = 20,
            city = "Seoul"
        )

        // When
        var userDto = user.convertToDto()

        // Then
        assertAll(
            { assertEquals(user.name, userDto.name) },
            { assertEquals(user.age, userDto.age) },
            { assertEquals(user.city, userDto.city) },
        )
    }
}

UserDto 클래스에 convertToDomain()을 생성한다.

package com.devkuma.mapstruct.dto

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertAll
import kotlin.test.assertEquals

class UserDtoTest {

    @Test
    fun convertToDto(){

        // Given
        var userDto = UserDto(
            name = "devkuma",
            age = 20,
            city = "Seoul"
        )

        // When
        var user = userDto.convertToDomain()

        // Then
        assertAll(
            { assertEquals(userDto.name, user.name) },
            { assertEquals(userDto.age, user.age) },
            { assertEquals(userDto.city, user.city) },
        )
    }
}

두 테스트 클래스 실행 시켜서 실패하지는 않는지 확인한다.