-
Mapstrcut 변환시 함수 호출하기Kotlin 2023. 5. 22. 00:01728x90
개요
Mapstruct를 사용하여 SignUpRequest -> SignUpUser로 변환 시 userId 부분에 IDGenerator 함수를 호출하여 변환하고자 합니다.
SignUpRequest
data class SignUpRequest( @get:JsonProperty("userName", required = true) val userName: kotlin.String, @field:Valid @get:JsonProperty("mobileCarrier", required = true) val mobileCarrier: MobileCarrierType, @get:Pattern(regexp="^[\\d]*$") @get:Size(min=11,max=11) @get:JsonProperty("mobileNumber", required = true) val mobileNumber: kotlin.String, ) { }
MobileCarrierType은 통신사를 나타내는 Enum입니다.
SignUpUser
data class SignUpUser( val userId: String, val userName: String, val mobileNumber: String, val mobileCarrier: MobileCarrierType, )
SignUpUser에는 SignUpRequest에서 받아오지 않는 userId를 추가적으로 가지고 있습니다.
이때 SignUpUser 객체를 생성할 때는 UserId에 UserIdGenerator를 통해 유저 아이디를 생성해주고 싶은 상황입니다.
UserIdGenerator
object UserIdGenerator { @JvmStatic fun generateUserId(): String { return Random().nextLong().toString() } }
랜덤값으로 Long타입의 ID를 생성하여 String 타입으로 반환하는 UserIdGenerator입니다.
주의사항으로는 @JvmStatic을 선언해주지 않으면 추후에 Mapping 코드가 Mapstruct 라이브러리에 의해 만들어졌을 때 호출하지 못하여 static 하게 만들어주어야 합니다.
SignUpMapper
@Mapper interface SignUpMapper { @Mapping( target= "userId", expression = "java(com.demo.user.domain.signup.entity.UserIdGenerator.generateUserId().toString())", ) fun requestToDomain(request: SignUpRequest): SignUpUser companion object { val INSTANCE: SignUpMapper = Mappers.getMapper(SignUpMapper::class.java) } }
SignUpMapper 인터페이스에서는 @Mapping 어노테이션의 expression 속성을 통해 함수를 호출할 수 있습니다.
target(변환될객체)의 userId를 매핑해 줄 때 expression에 명시된 함수를 호출하여 매핑하도록 합니다.
com.demo.user.domain.signup.entity 와 같이 패키지명을 명시해주어야 합니다.
'Kotlin' 카테고리의 다른 글
상태패턴과 전략패턴의 차이는 무엇일까? (1) 2023.10.17 Kotlin Value Class란? (0) 2023.09.01 Kotlin으로 Jwt 개발하기 (0) 2023.05.14