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?
)

Mapper クラスの作成

Mapper クラスを作成する。 /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) },
        )
    }
}

2 つのテストクラスを実行し、失敗しないことを確認する。