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 つのテストクラスを実行し、失敗しないことを確認する。