ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mapstrcut 변환시 함수 호출하기
    Kotlin 2023. 5. 22. 00:01
    728x90

    개요

    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

    댓글

Designed by Tistory.