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) },
)
}
}
두 테스트 클래스 실행 시켜서 실패하지는 않는지 확인한다.
최종 수정 : 2024-04-14